# zip_utils.r


tar_unzip <- function(file, dest_folder=dirname(file), is_zip_file="auto", intern=FALSE ) {
  is.char_of_length1(file, fail=TRUE)
  if (!file.exists(file))
    stop("file '", file, "' not found")

  info <- system(sprintf("file %s", shellClean(file)), TRUE)
  looks_like_zip_file <- grepl(": Zip archive data", info)

  if (is_zip_file == "auto")
    is_zip_file <- looks_like_zip_file

  if (looks_like_zip_file && !is_zip_file)
    warning("file looks like a ZIP file, not tar, but user has set `is_zip_file` to FALSE.\nUnarchiving might fail.")
  if (!looks_like_zip_file && is_zip_file)
    warning("file does NOT look like a ZIP file, but user has set `is_zip_file` to TRUE.\nUnarchiving might fail.")


  dir.create(dest_folder, showWarnings=FALSE)
  expected_folder <- as.path(dest_folder, removeExt(removeExt(basename(file)), showWarnings=FALSE))

  if (file.exists(expected_folder) && !isdir(expected_folder))
    warning ("expected_folder '", expected_folder, "' already exists but is not a directory")

  fmt.cmd <- ifelse(is_zip_file, "unzip %s -d %s", "tar -xvf %s -C %s")
  # system(sprintf("unzip %s -d %s", shellClean(file), shellClean(dest_folder)), intern=intern)
  # system(sprintf("tar -xvf %s -C %s", shellClean(file), shellClean(dest_folder)), intern=intern)
  system(sprintf(fmt.cmd, shellClean(file), shellClean(dest_folder)), intern=intern)


  if (!file.exists(expected_folder))
    warning ("expected_folder '", expected_folder, "' does not exist")
  else if (!isdir(expected_folder))
    warning ("expected_folder '", expected_folder, "' exists but is not a directory")

  return(expected_folder)
}


unzip.gz <- function(file, force=FALSE, batch.size=20) {
## Note on overwrite:  gunzip does NOT overwrite by default,  tar DOES. 

  ## TODO
  ##   -C /tmp/data : Unpack/extract files in /tmp/data instead of the default current directory.

  ## for file.gz
  cmd <- sprintf("gunzip %s%s", ifelse(force, "-f ", ""), shellClean(file))

  ## for file.tar.gz
  is.tar.gz <- grepl("\\.tar\\.gz$", file)
  if (any(is.tar.gz)) {
    warning ("using tar.gz for some")
    cmd.tar <- sprintf("tar zxvf%s %s", ifelse(!force, "k", ""),  shellClean(file))
    cmd <- ifelse(is.tar.gz, cmd.tar, cmd)
  }

  ## Iterate if large
  if (length(cmd) > batch.size) {
    unlist(lapply(makeIndeciesInBatch(cmd, 20), function(ind) {
      system(pasteC(cmd, ";"), intern=TRUE)
    }))    
  } else {
    system(pasteC(cmd, ";"), intern=TRUE)
  }
}
