#' Dado un directorio y una parte del nombre del fichero, devuelve una lista con todas las concidencias.
#'
#' @param RDS_dir  nombre del directorio donde están los archivos de RDS.
#' @param patternFileName patrón empleado para buscar en los archivos de la base de datos.
#'
#' @return vector de índices que contiene el patrón(patternFileName) en el directorio RDS_dir.
#' 
getFilesDir <-function(RDS_dir, patternFileName){
  return(grep(list.files(here(RDS_dir), full.names = TRUE), pattern = patternFileName, value = TRUE))
}

#' A partir de toda la lista de los ficheros escoge el último de ellos (el de la fecha más reciente) y devuelve su fecha.
#' En caso de no haber ningún fichero con el patrón indicado, devolverá la fecha 01/01/1999.
#'
#' @param RDS_dir  nombre del directorio donde están los archivos de RDS.
#' @param patternFileName patrón empleado para buscar en los archivos de la base de datos.
#' @param split_date_pattern parte del nombre del fichero que no incluye la fecha.
#'
#' @return la fecha del último fichero que se incorporó a la base de datos.
#' @export
#'
#' @examples
#' 
getTime <- function(RDS_dir, patternFileName, split_date_pattern){
  RDS_file <- last(getFilesDir(RDS_dir, patternFileName))
  RDS_filename <- gsub(RDS_file, pattern = paste0(here(RDS_dir), "/"), replacement ="")
  RDS_date <- ifelse(!is.na(RDS_file) & !is.na(RDS_filename), gsub(RDS_filename, pattern = split_date_pattern, replacement = ""), "1999-01-01")
  return(date = as.Date(RDS_date, format="%Y-%m-%d"))
}

#' Compara el tiempo que ha pasado desde la última vez que se hizo update de la base de datos. 
#'
#' @param RDS_dir  nombre del directorio donde están los archivos de RDS.
#' @param pattern patrón empleado para buscar en los archivos de la base de datos.
#' @param split_date_pattern parte del nombre del fichero que no incluye la fecha.
#'
#' @return booleano que determina si se necesita volver a buscar los datos en Twitter o no. 
#' @export
#'
#' @examples
#' 
compareTime <- function(RDS_dir, patternFileName, split_date_pattern){
  fileTime <- getTime(RDS_dir, patternFileName, split_date_pattern)
  pTime <- Sys.time()
  return(lubridate::year(fileTime) != lubridate::year(pTime) | lubridate::month(fileTime) != lubridate::month(pTime) | lubridate::day(pTime) - lubridate::day(fileTime) > 2)
}

#' Inicializamos las bases de datos. A este método lo llamaremos, siempre que hayan pasado 
#' dos días de tiempo entre una fecha y la siguiente.
#' Guardamos dos Ficheros: uno global, sin tags de por medio y uno con los tags que hemos decidido buscar.
#'
#' @param RDS_dir directorio donde guardaremos las búsquedas en twitter
#' @param split_date_nameTagsFile  nombre del fichero de tags
#' @param tags tags que buscaremos en twitter.
#' @param coord  vector con las coordenadas de España y de las islas canarias.
#'
initSaveBDD <- function(RDS_dir, split_date_nameTagsFile, tags, coord) {
  #tweets referentes a las tags pasadas por parámetro en el area establecida como españa:
  tagsbd <- search_tweets2(tags, n=18000, geocode = coord[1], retryonratelimit=TRUE, token = getToken()) 
  tagscanarias <- search_tweets2(tags, n=18000, geocode = coord[2], retryonratelimit=TRUE, token = getToken())
  both_df <- rbind(tagsbd, tagscanarias)
  saveRDS(object = both_df, file = file.path(RDS_dir, paste0(Sys.Date(), split_date_nameTagsFile))) 
}


#' Read the RDS files and add the date contained in the filename
#'
#' @param RDS_file path to RDS file
#' @param split_date_pattern part of the filename which is not the date
#' @param RDS_dir  path to directory containing RDS file
#'
#' @return a tibble containing the content of RDS file
#' @export
#'
#' @examples
#' Louveaux M. (2020, Mar. 24). "Analysing Twitter data with R". 
#' Retrieved from https://marionlouveaux.fr/blog/twitter-analysis-part1/
#' 
read_and_add_harvesting_date <- function(RDS_file, split_date_pattern, RDS_dir) {
  RDS_filename <- gsub(RDS_file, pattern = paste0(RDS_dir, "/"), replacement ="")
  RDS_date <- gsub(RDS_filename, pattern = split_date_pattern, replacement = "")
  readRDS(RDS_file) %>%
    mutate(harvest_date = as.Date(RDS_date))
}

#' Función que hace un mapeado de todos los archivos ofrecidos en el directorio RDS_dir con el patrón de nombre
#' ofrecido por patternFileName y los guarda en el path de salida (path_out)
#'
#' @param RDS_dir nombre del directorio donde están los archivos de RDS. 
#' @param patternFileName patrón empleado para buscar en los archivos de la base de datos.
#' @param split_date_pattern parte del nombre del fichero que no incluye la fecha.
#' @param path_out nombre del path donde guardaremos el archivo con todos los datos
#'
#'
configureBDD <- function(RDS_dir, patternFileName, split_date_pattern, path_out){
  RDSfile_sr <- getFilesDir(RDS_dir, patternFileName)
  RDSdir_name_sr <- here(RDS_dir)
  
  all_Bdd <- purrr::pmap_df(list(RDSfile_sr,split_date_pattern, RDSdir_name_sr), 
                     read_and_add_harvesting_date)
  
  all_bdd_unique <- all_Bdd %>% 
    arrange(desc(harvest_date)) %>% # ordenamos por orden descendente la fecha de consulta
    distinct(status_id, .keep_all = TRUE)  # .keep_all mantiene todas las varialbes | Comprueba que sean de registros distintos
  
  saveRDS(all_bdd_unique, file = file.path(path_out))
}

#' Función que hace un mapeado de todos los archivos ofrecidos en el directorio RDS_dir con el patrón de nombre
#' ofrecido por patternFileName y los guarda en el path de salida (path_out)
#'
#' @param split_date_pattern parte del nombre del fichero que no incluye la fecha.
#' @param tags .
#' @param pattern_file_name patrón empleado para buscar en los archivos de la base de datos.
#' @param path_out nombre del path donde guardaremos el archivo con todos los datos
#'
#'
initBDD <- function(RDS_dir, coord, tags, pattern_file_name, path_out){
  split_date_pattern = paste0(pattern_file_name, ".rds")
  if (compareTime(RDS_dir, pattern_file_name, split_date_pattern)){
    initSaveBDD(RDS_dir, split_date_pattern, tags, coord)
    configureBDD(RDS_dir, pattern_file_name, split_date_pattern, path_out)
  }
}

#' Carga el fichero del path pasado.
#'
#' @param path_out nombre del path donde guardaremos el archivo con todos los datos
#'
#'
getRT <- function(path_out){
  return(readRDS(path_out))
  
}

#' Filtra los tweets que tenemos escogiendo el lenguaje español, manipulando los strings que hay
#' adecuándolos para compararlos con los datos que tenemos en el fichero rds de localizaciones.
#' Por último, cogemos únicamente los atributos que queremos estudiar
#' 
#' @param path path de dónde recogemos los datos
#' @param txt_df fichero con todos los nombres de Población, Provincia y Comunidad Autónoma de España. 
#' 
getAtributesRT <- function(path, txt_df){
  rt <- getRT(path) %>%
    filter(stringr::str_detect(lang, "es")) %>%
    mutate(location = stringr::str_remove_all(stringr::str_to_title(location), "[^[:alnum:],' ]+| $|^ ")) %>% 
    filter(location %in% txt_df$Poblacion | location %in% txt_df$Provincia | location %in% txt_df$Comunidad) %>% 
    select(user_id, status_id, created_at, screen_name, text,is_retweet, favorite_count, retweet_count, lang, place_name, location, query, harvest_date)
  return(rt)
}
