#' Inicializamos el mapa de provincias
#'
initMap <- function(){
  caesp <- sf::read_sf(here("CNIG_MAPS/Provincias/"), crs=25830)
  caesp <- st_transform(caesp, "+proj=longlat +datum=WGS84")
  
  return(caesp)
}

#' Función que identifica si la localización pasada por párametro es una Población, 
#' una Provincia o una Comunidad y devuelve la Comunidad Autónoma a la que pertenece
#'
#' @param location string que contiene la localización 
#' 
#' @return string con la Comunidad autónoma a la que pertenece
#'
whoiam <- function(location){
  locations <- txt_df %>% select(Comunidad, Provincia, Poblacion)
  
  if(location %in% locations$Poblacion){
    iam = locations[location == locations$Poblacion, ]$Comunidad[1]
    return(iam)  
  }
  if(location %in% locations$Provincia){
    iam = locations[location == locations$Provincia, ]$Comunidad[1]
    return(iam)  
  }
  if(location %in% locations$Comunidad){
    iam = locations[location == locations$Comunidad, ]$Comunidad[1]
    return(iam)
  } 
}

#' Función que transforma la columna CCAA de sentiment_ccaa para adecuarla a los nombres de las 
#' comunidades autónamas que contiene el mapa. 
#'
#' @param sentiment_ccaa dataframe con la columna CCAA (Comunidades autónomas) para modificarla
#' 
#' @return sentiment_ccaa con la columna modificada
#'
transform_sentiment_ccaa <- function(sentiment_ccaa){
  x1 <- sentiment_ccaa$CCAA
  x1 <- as.character(x1)
  x1[x1 == "Catalunya"] <- "Cataluña"
  x1[x1 == "Castilla La Mancha"] <- caesp$CCAA[19]
  x1[x1 == "Asturias"] <- caesp$CCAA[33] #Principado de Asturias
  x1[x1 == "La Rioja"] <- caesp$CCAA[26] # La Rioja
  x1[x1 == "Valencia"] <- caesp$CCAA[12] #Comunitat Valenciana
  x1[x1 == "Islas Baleares"] <- "Illes Balears"
  x1[x1 == "Madrid"] <- caesp$CCAA[28] # Comunidad de Madrid
  x1[x1 == "Murcia"] <- caesp$CCAA[30] # Región de Murcia
  x1[x1 == "Navarra"] <- caesp$CCAA[31] #Comunidad Foral de Navarra
  x1[x1 == "Castilla León"] <- "Castilla y León"
  x1 <- as.factor(x1)
  sentiment_ccaa$CCAA <- x1
  
  return(sentiment_ccaa)
}

#'Método que dando un determinado sentimiento con sus coordenadas y un diccionario con la Población,
#'Provincia y Comunidad, genera un dataframe con la comunidad autónoma a la que pertenece el sentimiento.
#'
#' @param sentimentharvest_coords dataframe con el sentimiento y la localización en columna location.
#' @param txt_df diccionario en formato dataframe con las columnas Poblacion, Provincia y Comunidad. 
#' 
#' @return
#'
getSentimentCCAA <- function(sentimentharvest_coords, txt_df){
  
  lwhoiam <- lapply(sentimentharvest_coords$location, whoiam)
  lwhoiam_df <- data.frame("CCAA"= unlist(lwhoiam))
  sentiment_ccaa <- cbind(sentimentharvest_coords, lwhoiam_df)
  
  sentiment_ccaa <- transform_sentiment_ccaa(sentiment_ccaa)
  return(sentiment_ccaa)
}

#' Dado un determinado sentimiento con la comunidad autónoma a la que pertenece, cuenta el número
#' de sentimientos iguales para una clasificación y comunidad y lo añade al mapa.
#'
#' @param sentiment_ccaa dataframe con el sentimiento, la clasificación y Comunidad Autónoma
#' 
#' @return mapa de españa con la información del dataframe 
#'
getMap <- function(sentiment_ccaa){
  k <- sentiment_ccaa %>% 
    group_by(sentiment, clasify, CCAA) %>%
    count()
  
  mapa_esp <- inner_join(caesp, k, by="CCAA")
  mapa_esp <- subset(mapa_esp, !is.na(sentiment))
  
  return(mapa_esp)
}

#' Dado un determinado sentimiento con la comunidad autónoma a la que pertenece, hace la media
#' de sentimientos y calcula su total para una clasificación y comunidad y lo añade al mapa.
#'
#' @param sentiment_ccaa dataframe con el sentimiento, la clasificación y Comunidad Autónoma
#' 
#' @return mapa de españa con la información del dataframe 
#'
getMeanMap <- function(sentiment_ccaa){
  mean_sentiment <- sentiment_ccaa %>% 
    group_by(CCAA, clasify) %>%
    summarise(sentiment = mean(sentiment), total = n())
  
  mapa_esp <- inner_join(caesp, mean_sentiment, by="CCAA")
  mapa_esp <- subset(mapa_esp, !is.na(sentiment))
  
  return(mapa_esp)
}

#' Visualiza un mapa de sentimiento a partir de la variable aux pasada por párametro
#'
#' @param mapa_esp mapa que se va visualizar
#' @param aux variable sobre la cual se va a plotear el mapa
#' @param title título que incluiremos en la leyenda del mapa
#'
#'
visualizeSentimentMap <- function(mapa_esp, aux, title){
  popup = paste0( "<b>Provincia: </b>"
                  , mapa_esp$Texto
                  , "<br>"
                  , "<b> Sentiment Robos: </b>"
                  , as.character(mapa_esp[mapa_esp$clasify == "Robo",]$sentiment)
                  , " ("
                  , mapa_esp[mapa_esp$clasify == "Robo",]$total
                  , ")"
                  , "<br><b> Sentiment Seguridad: </b>"
                  , as.character(mapa_esp[mapa_esp$clasify == "Seguridad",]$sentiment)
                  , " ("
                  , mapa_esp[mapa_esp$clasify == "Seguridad",]$total
                  , ")"
                  , "<br><b> Sentiment Delincuencia: </b>"
                  , as.character(mapa_esp[mapa_esp$clasify == "Delincuencia",]$sentiment)
                  , " ("
                  , mapa_esp[mapa_esp$clasify == "Delincuencia",]$total
                  , ")"
                  , "<br>"
  )
  pal <- colorNumeric("PiYG", domain=aux)
  
  mapa_esp %>% 
    leaflet() %>% 
    addProviderTiles(providers$OpenStreetMap) %>% 
    setView(lng = -7.072777, lat =  35.991136, zoom = 5 ) %>% 
    addPolygons(fillColor = pal(aux), 
                fillOpacity = 0.9, 
                weight = 0.2, 
                smoothFactor = 0.2, popup = popup) %>%
    addLegend(pal = pal, values = aux, position = "bottomright", title = title, opacity= 1)
}

#' Función de visualización del mapa empleando la variable clasify
#'
#' @param mapa_esp mapa a visualizar
#' 
#'
visualizePolygonMap <- function(mapa_esp){
  pal <- colorFactor(c("#ef8a62","#7fbf7b","#67a9cf"), domain=mapa_esp$clasify)
  
  m <- mapa_esp %>% 
    leaflet() %>% 
    addProviderTiles(providers$OpenStreetMap) %>% 
    setView(lng = -7.072777, lat =  35.991136, zoom = 5 ) %>% 
    addPolygons(fillColor = ~pal(clasify), 
                fillOpacity = 0.7, 
                weight = 0.2, 
                smoothFactor = 0.2, popup = ~Texto) %>%
    addLegend("bottomright", colors= c("#ef8a62","#7fbf7b","#67a9cf"), labels=c("Delincuencia'", "Robos", "Seguridad"), title="Leyenda") 
  return(m)
}

#' Función de visualización del mapa por celdas. Dado un mapa (caesp) visualiza los polígonos que contiene
#' con la columna texto en forma de popup.
#'
#' @param caesp mapa a visualizar
#' 
#'
visualizeCellMap <- function(caesp){
  caesp %>%
    leaflet() %>%
    addTiles() %>%
    addPolygons(popup = ~Texto) %>%
    setView(lng = -7.072777, lat =  35.991136, zoom = 5 )
}
