#' Visualiza la nube de palabras dentro de la dfm, agrupándola por el grupo pasado por párametro.
#' 
#' @param dfm matrix dfm
#' @param group agrupación sobre el dfm
#' @param max_size máximo tamaño para visualizar el wordcloud
#'
visualizewordcloud <- function(dfm, group, max_size){
  tw_dfm <- dfm %>% dfm_group(groups = group)
  quanteda.textplots::textplot_wordcloud(tw_dfm, min_size=0.5, max_size=max_size, comparison=TRUE,max_words = 100, color = rev(RColorBrewer::brewer.pal(8, "Dark2")))
}

#' Visualiza un dendrograma de un dfm, agrupándolo por el grupo pasado por párametro. Emplea además la 
#' correlación para calcular la distancia entre los grupos definidos. 
#' 
#' @param dfm matrix dfm
#' @param group agrupación sobre el dfm
#'
cluster_dendrogram <- function(dfm, group){
  dfm_users <- dfm_group(dfm, groups = group)
  dfm_users <- dfm_users[ntoken(dfm_users) > 120,]
  
  hclust_dist <- as.dist(quanteda.textstats::textstat_dist(dfm_users))
  hclust_dist[is.na(hclust_dist)] <- 0
  hclust_dist[is.nan(hclust_dist)] <- 0
  clust <- stats::hclust(hclust_dist)
  plot(clust, xlab = "Distance", ylab = NULL)
}

#' Visualiza la frecuencia de las palabras de robos, seguridad y delincuencia, acotada por el parámetro
#' maxfeatures.
#' 
#' @param dfm matrix dfm
#' @param isrobos condición de que sea el grupo de robos
#' @param isseguridad condición de que sea el grupo de seguridad
#' @param isdelincuencia condición de que sea el grupo de delincuencia
#' @param maxfeatures máximo número de características a mostrar
#'
visualizeFreqWords <- function(dfm, isrobos, isseguridad, isdelincuencia, maxfeatures){
  tstatsrobos <- getFreqWord(dfm, isrobos)
  tstatsseguridad <- getFreqWord(dfm, isseguridad)
  tstatsdelincuencia <- getFreqWord(dfm, isdelincuencia)
  
  g1 = ggplot(tstatsrobos[1:maxfeatures], aes(x = reorder(feature, frequency), y = frequency)) +
    geom_point() +
    coord_flip() +
    labs(x = NULL, y = "Frequency Theft")
  
  g2 = ggplot(tstatsseguridad[1:maxfeatures], aes(x = reorder(feature, frequency), y = frequency)) +
    geom_point() +
    coord_flip() +
    labs(x = NULL, y = "Frequency Safety") 
  
  g3 = ggplot(tstatsdelincuencia[1:maxfeatures], aes(x = reorder(feature, frequency), y = frequency)) +
    geom_point() +
    coord_flip() +
    labs(x = NULL, y = "Frequency Delinquency") 
  
  gridExtra::grid.arrange(g1, g2, g3, nrow = 3)
}


#' Visualiza la comparativa de frecuencias definida en la variable pasada por parámetro. 
#' 
#' @param tstatkey dataframe con las características, sus valores de chi2 y p y el número de ocurrencias.
#'
visualizeKeyness <- function(tstat_key){
  quanteda.textplots::textplot_keyness(tstat_key)
}

#' Visualiza la densidad de Tweets hechos por día teniendo en cuenta la clasificación a la que pertenece
#' cada tweet. 
#' 
#' @param sentiment data.frame con los datos a visualizar.
#' @param sentiment_x variable x que visualizaremos.
#' @param sentiment_y variable y que visualizaremos.
#' @param sentiment_class clasificación según la cual colorearemos los datos.
#' @param xlab título que pondremos en el eje de las x's. 
#' @param ylab título que pondremos en el eje de las y's. 
#'
visualizeSentiment<- function(sentiment, sentiment_x, sentiment_y, sentiment_class, xlab, ylab){
  g1 = ggplot(sentiment, aes(x=sentiment_x, y=sentiment_y, colour=sentiment_class)) +
    geom_point(alpha= .6) +
    geom_hline(yintercept = 0) +
    xlab(xlab) + 
    ylab(ylab) +
    theme_bw()
  
  return(g1)
}
  
#' Visualiza en un gráfico circular el sentimiento de la matriz dfm dividiéndolo por la polaridad.
#' Definida como el número de sentimientos positivos, negativos y neutrales.
#' 
#' @param sentiment matriz dfm con todos los datos
#' @param title título del gráfico
#' @param subtitle subtítulo del gráfico
#'
visualizeSentimentPolarity <- function(sentiment, title, subtitle){
  g1  = ggplot(as.data.frame(sentiment), aes(x = factor(1), fill = factor(polarity)))  + 
    geom_bar(width = 1) + coord_polar(theta = "y") + 
    ggtitle(title, subtitle = subtitle) +
    ylab("Y") +
    xlab("X") + 
    scale_fill_brewer(palette = "RdYlGn") + 
    facet_grid(~clasify) +
    theme(plot.title = element_text(size=12, face='bold'))
    
  return(g1)
}

  
#' Visualiza la localización de los usuarios en rt.
#'
#' @param rt dataframe con todos los datos
#' 
#' source: https://rpubs.com/elker_san/Redes_sociales
#'
#'
visualizeLocationUsers <- function(rt){
  rt %>%
    mutate(location = stringr::str_to_title(location)) %>%
    filter(location != "", !is.na(location), stringr::str_detect(location, "[a-z]")) %>% 
    count(location) %>% 
    top_n(20, n) %>% 
    ggplot() +
    geom_col(aes(x = reorder(location, n), y = n)) +
    coord_flip() +
    labs(title = "Procedencia de los usuarios", x = "ubicación", y = "cantidad")
}


ggplotTweetLocation <- function(rt){
  location_tweets <- rt %>% 
    filter(!is.na(location), location != "") %>% #quitamos los NA y los vacíos
    select(location, query)
    
  # Free trial accounts are limited to 2,500 requests per day for testing purposes.
  location_tweets <- location_tweets %>%
    opencage::oc_forward_df(placename = location) %>% #243
    group_by(oc_lng, oc_lat, query) %>% 
    summarise(cantidad = n())
  
 ggplot(location_tweets) +
    borders("world") +
    geom_point(aes(x = oc_lng, y = oc_lat, color = query, size = cantidad),  alpha = .4) + 
    xlim(-20, 5) + 
    ylim(25, 50) +
    coord_quickmap()
  
}

#' Visualiza la densidad de Tweets hechos por día teniendo en cuenta la clasificación a la que pertenece
#' cada tweet. 
#' 
#' @param corp corpus con todos los textos
#' @param created_at fecha de creación del tweet
#' @param clasify clasificación del texto en Robos, Delincuencia y Seguridad. 
#'
visualizeNumTweetsbyDay <- function(corp, created_at, clasify){
  ggplot(corp, aes(x = created_at, fill=clasify)) +
    geom_histogram(position = "identity", bins = 20, show.legend = TRUE) +
    labs(x = "Date", y = "Number of tweets") 
}

#' Visualiza la densidad de Tweets encontrada en el corpus a lo largo del tiempo definido por created_at,
#' teniendo en cuenta la clasificación a la que pertenece cada tweet. 
#' 
#' @param corp corpus con todos los textos
#' @param created_at fecha de creación del tweet
#' @param isseguridad condición de que sea el grupo de seguridad
#' @param isrobos condición de que sea el grupo de robos
#' @param isdelincuencia condición de que sea el grupo de delincuencia
#'
visualizeDensityTweets <- function(corp, created_at, isseguridad, isrobos, isdelincuencia){
  ggplot() +
    geom_density(aes(x = created_at, color = "Seguridad"), data = corp[isseguridad, ], position = "identity") +
    geom_density(aes(x = created_at, color = "Robos"), data = corp[isrobos, ], position = "identity") +
    geom_density(aes(x = created_at, color = "Delincuencia"), data = corp[isdelincuencia, ], position = "identity") +
    labs(x = "Date", y = "Number of tweets", color = "Legend") 
}

#' Visualiza el área sobre la cual cogemos los datos de Twitter.
#' 
ggArea <- function(){
    #750000 = 750km
    #300000 = 300km
  
    cities <- data.frame(City=c("Madrid", "Santa Cruz de Tenerife"), Lat =c(40.36329, 28.469648),
                         Long = c(-3.69141,-16.2540884), Metres = c(750000, 300000))
    
    popup <- paste0("Centro: ",cities$City)
    
    leaflet(cities) %>% 
    addProviderTiles(providers$CartoDB.Positron) %>% 
    addTiles() %>% 
    setView(lng = -3.70, lat =  40.4, zoom = 4 ) %>% #Madrid
    addCircles(lng = ~Long, lat = ~Lat, weight = 1, radius = ~Metres, popup = ~popup)
}
