#' Creates zip-file with necessary content to manually add instrument to database
#'
#' @description
#' Metadata can be added by editing the data dictionary of a project in the
#' initial design phase. If you want to later add new instruments, this
#' function can be used to create (an) instrument(s) to add to a project in
#' production.
#'
#' @param data metadata for the relevant instrument.
#' Could be from `ds2dd_detailed()`
#' @param file destination file name.
#' @param force force instrument creation and ignore different form names by
#' just using the first.
#' @param record.id record id variable name. Default is 'record_id'.
#'
#' @return exports zip-file
#' @export
#'
#' @examples
#' # iris |>
#' #  ds2dd_detailed(
#' #    add.auto.id = TRUE,
#' #    form.name = sample(c("b", "c"), size = 6, replace = TRUE, prob = rep(.5, 2))
#' #  ) |>
#' #  purrr::pluck("meta") |>
#' #  (\(.x){
#' #  split(.x, .x$form_name)
#' #  })() |>
#' #  purrr::imap(function(.x, .i){
#' #  export_redcap_instrument(.x,file=here::here(paste0(.i,Sys.Date(),".zip")))
#' #  })
#'
#' # iris |>
#' #  ds2dd_detailed(
#' #    add.auto.id = TRUE
#' #  ) |>
#' #  purrr::pluck("meta") |>
#' #  export_redcap_instrument(file=here::here(paste0("instrument",Sys.Date(),".zip")))
export_redcap_instrument <- function(data,
                                     file,
                                     force = FALSE,
                                     record.id = "record_id") {
  # Ensure form name is the same
  if (force) {
    data$form_name <- data$form_name[1]
  } else if (length(unique(data$form_name)) != 1) {
    stop("Please provide metadata for a single form only. See examples for
         ideas on exporting multiple instruments.")
  }

  if (!is.na(record.id) && record.id %in% data[["field_name"]]) {
    data <- data[-match(record.id, data[["field_name"]]), ]
  }

  temp_dir <- tempdir()
  utils::write.csv(data, paste0(temp_dir, "/instrument.csv"), row.names = FALSE, na = "")
  writeLines("REDCapCAST", paste0(temp_dir, "/origin.txt"))
  zip::zip(
    zipfile = file,
    files = c("origin.txt", "instrument.csv"),
    root = temp_dir
  )
}


#' DEPRICATED Create zips file with necessary content based on data set
#'
#' @description
#' Metadata can be added by editing the data dictionary of a project in the
#' initial design phase. If you want to later add new instruments, this
#' function can be used to create (an) instrument(s) to add to a project in
#' production.
#'
#' @param data metadata for the relevant instrument.
#' Could be from `ds2dd_detailed()`
#' @param dir destination dir for the instrument zip. Default is the current WD.
#' @param record.id flag to omit the first row of the data dictionary assuming
#' this is the record_id field which should not be included in the instrument.
#' Default is TRUE.
#'
#' @return list
#' @export
#'
#' @examples
#' \dontrun{
#' data <- iris |>
#'   ds2dd_detailed(
#'     add.auto.id = TRUE,
#'     form.name = sample(c("b", "c"),
#'       size = 6,
#'       replace = TRUE, prob = rep(.5, 2)
#'     )
#'   ) |>
#'   purrr::pluck("meta")
#' # data |> create_instrument_meta()
#'
#' data <- iris |>
#'   ds2dd_detailed(add.auto.id = FALSE) |>
#'   purrr::pluck("data")
#' iris |>
#'   setNames(glue::glue("{sample(x = c('a','b'),size = length(ncol(iris)),
#' replace=TRUE,prob = rep(x=.5,2))}__{names(iris)}")) |>
#'   ds2dd_detailed(form.sep = "__")
#' data |>
#'   purrr::pluck("meta") |>
#'   create_instrument_meta(record.id = FALSE)
#' }
create_instrument_meta <- function(data,
                                   dir = here::here(""),
                                   record.id = TRUE) {
  # browser()
  if (record.id) {
    data <- data[-1, ]
  }
  temp_dir <- tempdir()
  split(data, data$form_name) |> purrr::imap(function(.x, .i) {
    utils::write.csv(.x, paste0(temp_dir, "/instrument.csv"),
      row.names = FALSE, na = ""
    )
    writeLines("REDCapCAST", paste0(temp_dir, "/origin.txt"))
    zip::zip(paste0(dir, "/", .i, Sys.Date(), ".zip"),
      files = c("origin.txt", "instrument.csv"),
      root = temp_dir
    )
  })
}