#' @name tree
#' @title Exibe o diretórios em forma de árvore
#' @param dir É o path do diretório a ser exibido. Default é o diretório
#'     de trabalho.
#' @return Um arte ascii da estrutura do diretório.
#' @author Walmes Zeviani
#' @examples
#' tree()
#' tree("../")
tree <- function(dir = ".") {
    if (Sys.info()["sysname"] == "Linux") {
        system(sprintf("tree %s -F --charset=ascii", dir))
    }
}

#-----------------------------------------------------------------------
#' @name write2Rdoc
#' @title Cria o esqueleto da documentação de datasets
#' @param dataset Um objeto que seja vetor ou data.frame.
#' @param source Uma string que seja a referência bibliografica do
#'     dataset ou uma url.
#' @param overwrite Se TRUE reescreve o arquivo se ele existir.
#' @return Não retorna nada, apenas cria arquivos.
#' @author Walmes Zeviani
#' @examples
#' write2Rdoc(iris)
#' write2Rdoc(precip)
write2Rdoc <- function(dataset, source = "???", overwrite = FALSE) {
    if (basename(getwd()) != "labestData") {
        warning("Você não está no diretório raíz do labestData.")
    }
    name <- deparse(substitute(dataset))
    cld <- class(dataset)[1]
    i <- cld == c("data.frame", "numeric", "integer")
    if (all(!i)) {
        stop("`dataset` de classe não apropriada para a função.")
    }
    mid <- switch(c(1, 2, 2)[i],
                  "1" = {
                      c(sprintf(paste(
                          "@format Um \\code{data.frame}",
                          "com %d observações e %d variáveis."),
                          nrow(dataset), ncol(dataset)),
                        "\\describe{", "",
                        rbind(sprintf("\\item{\\code{%s}}{  }",
                                      names(dataset)), ""),
                        "}")
                  },
                  "2" = {
                      sprintf(
                          "@format Um vetor com %d elementos.",
                          length(dataset))
                  })
    ctnt <- c(sprintf("@name %s", deparse(substitute(dataset))),
              "@title",
              "@description",
              "@keywords",
              strwrap(paste("@source", source), width = 72),
              "@examples")
    ctnt <- append(ctnt, value = mid, after = 3)
    ctnt <- paste("#\'", ctnt)
    file <- sprintf("./R/%s.R", name)
    cat(ctnt, sep = "\n")
    cat(sprintf("Criando o esqueleto da documentação no arquivo %s.",
                file),
        "Abra-o e complete com as informações.", sep = "\n")
    if (!file.exists(file) || overwrite) {
         cat(ctnt,  sep = "\n", file = file)
    }
    invisible()
}

#-----------------------------------------------------------------------
#' @name write2txt
#' @title Cria arquivo texto (tsv) do dataset
#' @param dataset Um objeto que seja vetor ou data.frame.
#' @param overwrite Se TRUE reescreve o arquivo se ele existir.
#' @return Não retorna nada, apenas cria arquivos.
#' @author Walmes Zeviani
#' @examples
#' write2txt(iris)
#' write2txt(precip)
write2txt <- function(dataset, overwrite = FALSE) {
    if (basename(getwd()) != "labestData") {
        warning("Você não está no diretório raíz do labestData.")
    }
    name <- deparse(substitute(dataset))
    cld <- class(dataset)[1]
    whatis <- cld == c("data.frame", "numeric", "integer")
    if (all(!whatis)) {
        stop("`dataset` de classe não reconhecida pela função.")
    }
    file <- sprintf("./data-raw/%s.txt", name)
    cat(sprintf("Criando txt do dataset %s em data-raw/.",
                file),
        "Não edite na mão esse arquivo.", sep = "\n")
    if (!file.exists(file) || overwrite) {
        switch(c(1, 2, 2)[whatis],
               "1" = {
                   write.table(x = dataset,
                               file = file,
                               quote = FALSE,
                               row.names = FALSE,
                               sep = "\t",
                               fileEncoding = "utf-8")
               },
               "2" = {
                   writeLines(text = as.character(dataset),
                              con = file)
               })
    }
}

#-----------------------------------------------------------------------
#' @name write2rda
#' @title Cria arquivo rda do dataset
#' @description É uma função wraper para a \code{devtools::use_data()}.
#' @param dataset Um objeto que seja vetor ou data.frame.
#' @param overwrite Se TRUE reescreve o arquivo se ele existir.
#' @return Não retorna nada, apenas cria arquivos.
#' @author Walmes Zeviani
#' @examples
#' write2txt(iris)
#' write2txt(precip)
write2rda <- function(dataset, overwrite = FALSE) {
    if (basename(getwd()) != "labestData") {
        warning("Você não está no diretório raíz do labestData.")
    }
    cmd <- sprintf("use_data(%s, overwrite = %d)",
                   deparse(substitute(dataset)),
                   overwrite)
    eval(parse(text = cmd))
}