#' télécharge une extension duckdb
#'
#' Cette fonction télécharge une extension duckdb et l'installe dans le bon répertoire dans une environnement linux
#' La liste des extensions est disponible ici : https://duckdb.org/docs/extensions/official_extensions
#'
#' Les extensions étant liées à une version de duckdb, vous devrez les réinstaller à chaque mise à jour
#' 
#' Vous pouvez voir la liste des extensions officielles existantes et installées en faisant :
#'
#' con <- dbConnect(duckdb())
#' dbGetQuery(con, "SELECT * FROM duckdb_extensions();")
#'
#' @param extension_name le nom de l'extension à télécharger
#'
#' @examples
#' dl_duckdb_extension("fts")
#'
dl_duckdb_extension <- function(extension_name) {
  duckdb_version <- stringr::str_extract(as.character(packageVersion('duckdb')), "\\d+\\.\\d+\\.\\d+")

  if (extension_name %in% c('sqlite', 'postgres', 'mysql')) {
    extension_name <- paste0(extension_name, '_scanner')
  }

  if (Sys.info()["sysname"] == "Linux") {
    url <- glue::glue("http://extensions.duckdb.org/v{duckdb_version}/linux_amd64/{extension_name}.duckdb_extension.gz")
    dest_file <- fs::path_home(glue::glue("/.local/share/R/duckdb/extensions/v{duckdb_version}/linux_amd64/{extension_name}.duckdb_extension"))
  } else if (Sys.info()["sysname"] == "Windows") {
    url <- glue::glue("http://extensions.duckdb.org/v{duckdb_version}/windows_amd64_rtools/{extension_name}.duckdb_extension.gz")
    dest_file <- fs::path_home(glue::glue("/AppData/Roaming/R/data/R/duckdb/extensions/v{duckdb_version}/windows_amd64_rtools/{extension_name}.duckdb_extension"))
  } else {
    stop("Cette fonction ne fonctionne que sur windows et linux")
  }

  if (file.exists(dest_file)) {
    message(glue::glue("extension {extension_name} déjà installée"))
    return(invisible())
  }

  tmpf <- tempfile()
  download.file(url, tmpf)

  dir.create(dirname(dest_file), recursive = TRUE, showWarnings = FALSE)
  R.utils::gunzip(tmpf, dest_file)

  message(glue::glue("extension {extension_name} installée dans {dest_file}"))
}