
#Cargar datos cajamar
load("dataset.rdata")
load("murcia.rdata")
load("mapa_mun2.rdata")

#Filtrado
filtrado<-function(cp,sector,dia,mes,radio,fecha,de,hasta,sexo,edad,renta){
  
  if(hasta==0){
    hasta<-24
  }
  if(radio=="com"){
    if(cp=="Todos"){
      cp=datos$CP_CLIENTE
    }
    data<-filter(datos,CP_CLIENTE==cp,SECTOR%in%sector,DIA%in%dia,MES%in%mes,FECHA>fecha[1],FECHA<fecha[2])
  }
  if(radio=="cli"){
    if(cp=="Todos"){
      cp=datos$CP_COMERCIO
    }
    data<-filter(datos,CP_COMERCIO==cp,SECTOR%in%sector,DIA%in%dia,MES%in%mes,FECHA>fecha[1],FECHA<fecha[2])
  }
  
  
  if(de>=hasta){
    aux1<-filter(data,HORA_INI>=de )
    aux2<-filter(data,HORA_FIN<=hasta)
    data<-rbind(aux1,aux2)
  }else{
    if(de<hasta){
      data<-filter(data,HORA_INI>=de & HORA_FIN<=hasta)
      }
    }
  
  if(sexo== "Todos"){
    data<-data
  }else{
    data<-filter(data,NUM_OP==1)
    if(sexo=="Hombre"){
      data<-filter(data,PROP_SEX>=0.9)
    }else{
      if(sexo=="Mujer"){
        data<-filter(data,PROP_SEX<=0.09)
      }
    }
  }
  
  if(renta== "Todos"){
    data<-data
  }else{
    data<-filter(data,NUM_OP==1)
    if(renta=="Baja"){
      data<-filter(data,PROP_R_BAJA>=0.9)
    }else{
      if(renta=="Media"){
        data<-filter(data,PROP_R_MEDIA>=0.9)
      }else{
      if(renta=="Alta"){
        data<-filter(data,PROP_R_ALTA>=0.9)
      }
        }
    }}
  
  if(edad== "Todos"){
    data<-data
  }else{
    data<-filter(data,NUM_OP==1)
    if(edad=="Joven"){
      data<-filter(data,PROP_JOVEN>=0.9)
    }else{
      if(edad=="Adulto"){
        data<-filter(data,PROP_ADULTO>=0.9)
      }else{
        if(edad=="Pensionista"){
          data<-filter(data,PROP_PENSIONISTA>=0.9)
        }
      }
    }
}
}

#Mapa 
mapa<-function(data=datos,radio_tipo="tot",radio_cp="com"){
 
  sel<-map$COD_POSTAL>=30001 & map$COD_POSTAL<=30012 | map$COD_POSTAL==30100 | map$COD_POSTAL==30151 | map$COD_POSTAL==30152 | map$COD_POSTAL==30158
  data <- data.table(data)
  if(radio_cp=="cli"){
    
  #Generar subconjunto de datos con los datos acumulados por Importe y CP_Cliente
  data_imp <- data[,list(IMPORTE = sum(IMPORTE)), by = 'CP_CLIENTE']
  #data_imp<-with(data,aggregate(IMPORTE,by=list(CP_CLIENTE=CP_CLIENTE),sum))
  colnames(data_imp)<-c("CP_CLIENTE","TOTAL")
  #Generar subconjunto de datos con los datos acumulados por numero de operaciones y CP_Cliente

  data_ops <- data[,list(NUM_OP = sum(NUM_OP)), by = 'CP_CLIENTE']
  #data_ops<-with(data,aggregate(NUM_OP,by=list(CP_CLIENTE=CP_CLIENTE),sum))
  colnames(data_ops)<-c("CP_CLIENTE","OPERACIONES")
  #Agrupar los subconjuntos generados
  data3<-left_join(data_imp,data_ops,by="CP_CLIENTE")
  #Crear columna de medias
  data3<-mutate(data3,MEDIA=TOTAL/OPERACIONES)
  #Cambiar nombre del dataset generado para la posterior union con el mapa
  data3<-rename(data3,COD_POSTAL=CP_CLIENTE)
  data3$COD_POSTAL<-as.character(data3$COD_POSTAL)
  
  
  #Combinar datos del subconjunto con el mapa
  map@data<-left_join(map@data,data3)
  
  #Generar el popup de leaflet
  pop<-paste0("<span style='color:#1a9c99':><b>CODIGO POSTAL: </b></span>",map@data$COD_POSTAL,
              "<br><b> Numero de operaciones: </b>", as.character(format(map@data$OPERACIONES,big.mark = ",",scientific = F)),
              "<br><b> Importe total: </b>",as.character(format(map@data$TOTAL,big.mark = ",",scientific = F))," \u20ac",
              "<br><b> Importe medio: </b>",round(map@data$MEDIA,2)," \u20ac"
              )
  
  
  
  #Generar el leaflet
  if(radio_tipo=="tot"){
    
    #Seleccionar la paleta que representará el clorophet
    pal<-colorNumeric(palette=rev(heat.colors(11)),domain=map$TOTAL)  
    
  leaf<-leaflet::leaflet(map) %>% addTiles() %>%
    leaflet::addPolygons(stroke=T,
                smoothFactor=1,
                fillOpacity = 0.5,
                fillColor=~pal(TOTAL),
                color="black",
                weight=1,
                highlightOptions= highlightOptions(stroke=T,color="White",weight=3,opacity=0.8),
                popup=pop) %>%
    #addCircles(barrios2$lng,barrios2$lat,popup=barrios2$barrio,radius=barrios2$size) %>%
    leaflet::addLegend("bottomleft",pal=pal,values=~TOTAL,labFormat=labelFormat(suffix="\u20ac"),na.label = "SIN DATOS")
  }else{
  if(radio_tipo=="med"){
    #Seleccionar la paleta que representará el clorophet
    pal<-colorNumeric(palette=rev(heat.colors(11)),domain=map$MEDIA)
    leaf<-leaflet::leaflet(map) %>% addTiles() %>%
      leaflet::addPolygons(stroke=T,
                  smoothFactor=1,
                  fillOpacity = 0.5,
                  fillColor=~pal(MEDIA),
                  color="black",
                  weight=1,
                  highlightOptions= highlightOptions(stroke=T,color="White",weight=3,opacity=0.8),
                  popup=pop) %>%
      #addCircles(barrios2$lng,barrios2$lat,popup=barrios2$barrio,radius=barrios2$size) %>%
      leaflet::addLegend("bottomleft",pal=pal,values=~MEDIA,labFormat=labelFormat(suffix="\u20ac"),na.label = "SIN DATOS")
  
  }
    }
  }else{
  if(radio_cp=="com"){
    
    #Generar subconjunto de datos con los datos acumulados por Importe y CP_COMERCIO
    data_imp <- data[,list(IMPORTE = sum(IMPORTE)), by = 'CP_COMERCIO']
    #data_imp<-with(data,aggregate(IMPORTE,by=list(CP_COMERCIO=CP_COMERCIO),sum))
    colnames(data_imp)<-c("CP_COMERCIO","TOTAL")
    #Generar subconjunto de datos con los datos acumulados por numero de operaciones y CP_Cliente
    data_ops <- data[,list(NUM_OP = sum(NUM_OP)), by = 'CP_COMERCIO']
    #data_ops<-with(data,aggregate(NUM_OP,by=list(CP_COMERCIO=CP_COMERCIO),sum))
    colnames(data_ops)<-c("CP_COMERCIO","OPERACIONES")
    #Agrupar los subconjuntos generados
    data3<-left_join(data_imp,data_ops,by="CP_COMERCIO")
    #Crear columna de medias
    data3<-mutate(data3,MEDIA=TOTAL/OPERACIONES)
    #Cambiar nombre del dataset generado para la posterior union con el mapa
    data3<-rename(data3,COD_POSTAL=CP_COMERCIO)
    data3$COD_POSTAL<-as.character(data3$COD_POSTAL)
    
    #Combinar datos del subconjunto con el mapa
    map@data<-left_join(map@data,data3)
    map<-map[sel,]
    
    #Generar el popup de leaflet
    pop<-paste0("<span style='color:#1a9c99':><b>CODIGO POSTAL: </b></span>",map@data$COD_POSTAL,
                "<br><b> Numero de operaciones: </b>", as.character(format(map@data$OPERACIONES,big.mark = ",",scientific = F)),
                "<br><b> Importe total: </b>",as.character(format(map@data$TOTAL,big.mark = ",",scientific = F))," \u20ac",
                "<br><b> Importe medio: </b>",round(map@data$MEDIA,2)," \u20ac"
    )
    #Generar el leaflet
    if(radio_tipo=="tot"){
      
      #Seleccionar la paleta que representará el clorophet
      pal<-colorNumeric(palette=rev(heat.colors(11)),domain=map$TOTAL)  
      
      leaf<-leaflet::leaflet(map) %>% addTiles() %>%
        leaflet::addPolygons(stroke=T,
                    smoothFactor=1,
                    fillOpacity = 0.5,
                    fillColor=~pal(TOTAL),
                    color="black",
                    weight=1,
                    highlightOptions= highlightOptions(stroke=T,color="White",weight=3,opacity=0.8),
                    popup=pop) %>%
        #addCircles(barrios2$lng,barrios2$lat,popup=barrios2$barrio,radius=barrios2$size) %>%
        leaflet::addLegend("bottomleft",pal=pal,values=~TOTAL,labFormat=labelFormat(suffix="\u20ac"),na.label = "SIN DATOS")
    }else{
      if(radio_tipo=="med"){
        #Seleccionar la paleta que representará el clorophet
        pal<-colorNumeric(palette=rev(heat.colors(11)),domain=map$MEDIA)
        leaf<-leaflet::leaflet(map) %>% addTiles() %>%
          leaflet::addPolygons(stroke=T,
                      smoothFactor=1,
                      fillOpacity = 0.5,
                      fillColor=~pal(MEDIA),
                      color="black",
                      weight=1,
                      highlightOptions= highlightOptions(stroke=T,color="White",weight=3,opacity=0.8),
                      popup=pop) %>%
          #addCircles(barrios2$lng,barrios2$lat,popup=barrios2$barrio,radius=barrios2$size) %>%
          leaflet::addLegend("bottomleft",pal=pal,values=~MEDIA,labFormat=labelFormat(suffix="\u20ac"),na.label = "SIN DATOS")
        }
      }
  }
    
    
  }
  leaf
}

#Diagrama de barras SECTORES
barras.sector<-function(data=datos){
  data <- data.table(data)
  data1 <- data[,list(IMPORTE = sum(IMPORTE)), by = 'SECTOR']
  colnames(data1)<-c("SECTOR","IMPORTE")
  data2 <- data[,list(NUM_OP = sum(NUM_OP)), by = 'SECTOR']
  data2<-left_join(data1,data2,by="SECTOR")
  data2<-mutate(data2,MEDIA=IMPORTE/NUM_OP)
  data2<-dplyr::select(data2,-NUM_OP,-IMPORTE)
  colnames(data2)<-c("SECTOR","IMPORTE")
  data1<-mutate(data1,GRUPO="TOTAL")
  data2<-mutate(data2,GRUPO="MEDIA")
  data<-rbind(data1,data2)
  data$IMPORTE<-round(data$IMPORTE,2)
  barras_sectores<<-hchart(data,"bar",hcaes(x=SECTOR,y=IMPORTE,group=GRUPO,color=SECTOR))
  barras_sectores
}

#Diagrama de FRANJAS HORARIAS
barras.hora<-function(data=datos){
  
data<-dplyr::select(data,FRANJA_HORARIA,IMPORTE)
data<-with(data,aggregate(IMPORTE,by=list(FRANJA_HORARIA=FRANJA_HORARIA),sum))
colnames(data)<-c("FRANJA_HORARIA","IMPORTE")
highchart() %>% 
  hc_add_series(data,hcaes(x=FRANJA_HORARIA,y=IMPORTE,color=FRANJA_HORARIA),type="bar",pointWidth= 0.52) %>%
  hc_chart(polar=T) %>% 
  hc_xAxis(categories=unique(data$FRANJA_HORARIA)) %>% 
  hc_legend(FALSE) %>% hc_tooltip(pointFormat="Importe total: {point.y} \u20ac")
}

#Calendario
calendar<-function(data=datos){
  
  data<-dplyr::select(data,IMPORTE,FECHA,DIA,MES,NUM_SEMANA_MES,YEAR)
  data <- data.table(data)
  data <- data[,list(IMPORTE = sum(IMPORTE)), by = 'FECHA,MES,YEAR,NUM_SEMANA_MES,DIA']
  colnames(data)<-c("FECHA","MES","YEAR","NUM_SEMANA_MES","DIA","IMPORTE")
  
  data$DIA<-as.character(data$DIA)
  data$DIA<-replace(data$DIA,data$DIA=="lunes","L")
  data$DIA<-replace(data$DIA,data$DIA=="martes","M")
  data$DIA<-replace(data$DIA,data$DIA=="miercoles","X")
  data$DIA<-replace(data$DIA,data$DIA=="jueves","J")
  data$DIA<-replace(data$DIA,data$DIA=="viernes","V")
  data$DIA<-replace(data$DIA,data$DIA=="sabado","S")
  data$DIA<-replace(data$DIA,data$DIA=="domingo","D")
  data$DIA<-ordered(data$DIA,levels=c("L","M","X","J","V","S","D"))
  
  data$NUM_SEMANA_MES<-factor(data$NUM_SEMANA_MES,levels=rev(levels(data$NUM_SEMANA_MES)))
  
  calendario<-ggplot(data, aes(DIA,NUM_SEMANA_MES, fill = IMPORTE)) + 
    geom_tile(colour = "white") + 
    facet_grid(YEAR~MES) + 
    scale_fill_gradient2(mid="yellow", high="red",low="white",midpoint = mean(data$IMPORTE)) +
    labs(x="Dia de la semana",
         y="Semana del mes",
         title = "Calendario Heatmap", 
         subtitle="Importe de las operaciones realizadas por dia.", fill="Importe ( \u20ac )")
  calendario
}

#Serie temporal
serie<-function(data=datos){
  data <- data.table(data)
  data <- data[,list(IMPORTE = sum(IMPORTE)), by = 'FECHA,SECTOR']
  sectores<-as.vector(unique(data$SECTOR))
  data<-dcast(data,FECHA~SECTOR,value.var = "IMPORTE")
  data<-arrange(data,FECHA)
  data<-mutate(data,TOTAL=0)
  data[is.na(data)]<-0
  data$TOTAL<-rowSums(data[,2:length(data)])
  data$FECHA<-as.POSIXct(data$FECHA,format="%Y/%m/%d")

  data<-dplyr::select(data,-TOTAL)
  
  serie_sectores<-amTimeSeries(data,col_date = "FECHA",col_series = sectores,ylab="Importe ( \u20ac  )",
               main = "Serie temporal de los importes por sector",
               linewidth = 1.5,
               linetype = 0,
               bullet="round",
               bulletSize = 5,
               color=c("green","red","blue","gold","cornflowerblue","red",
                       "aquamarine","chartreuse","darkmagenta","darkorange","darkred")
               )
  serie_sectores
}

#Pie sexo
pie_sexo<-function(data=datos){
  
  a<-data%>%dplyr::mutate(HOMBRES=round(NUM_OP*PROP_SEX,1))
  a<-a%>%dplyr::mutate(MUJERES=NUM_OP-HOMBRES)
  Totales<-a%>%dplyr::group_by(CP_CLIENTE)%>%dplyr::select(HOMBRES,MUJERES)%>%dplyr::summarise_all(funs(sum))
  Totales<-Totales%>%dplyr::arrange(CP_CLIENTE)%>%dplyr::mutate(ORDEN=seq(1:nrow(Totales)))
  
  series1<-Totales%>%dplyr::select(CP_CLIENTE,HOMBRES,ORDEN)%>%dplyr::rename(POBLACION=HOMBRES)%>%dplyr::mutate(SEXO=rep("Hombres",nrow(Totales)))
  series2<-Totales%>%dplyr::select(CP_CLIENTE,MUJERES,ORDEN)%>%dplyr::mutate(ORDEN=ORDEN,SEXO=rep("Mujeres",nrow(Totales)))%>%dplyr::rename(POBLACION=MUJERES)
  serial<-rbind(series1,series2)
  serial$CP_CLIENTE<-as.factor(serial$CP_CLIENTE)
  
  DF<-serial%>%dplyr::select(CP_CLIENTE,POBLACION,SEXO)
  Pie1<-DF%>%dplyr::select(SEXO,POBLACION)%>%dplyr::group_by(SEXO)%>%dplyr::summarise_all(funs(sum))%>%dplyr::mutate(PORCENTAJE=round(POBLACION/sum(POBLACION)*100,2))
  
  highchart() %>%
    hc_chart(type = "pie", options3d = list(enabled = TRUE, alpha = 10, beta = 0)) %>% 
    hc_plotOptions(pie = list(depth = 70,colors=c("#6fcb9f","#fb2e01","#666547"))) %>% 
    hc_add_series(Pie1,"pie", hcaes(x=SEXO,y=PORCENTAJE)) %>% 
    hc_add_theme(hc_theme(chart = list(backgroundColor = NULL)))%>%
    hc_plotOptions(pie=list(allowPointSelect= T,dataLabels="disabled",showInLegend= TRUE))  %>%
    hc_tooltip(valueDecimals = 2,pointFormat = "Porcentaje:{point.PORCENTAJE}% <br> Numero de operaciones: {point.POBLACION}")
  
}

#Pie edad
pie_edad<-function(data=datos){
  
  a<-data%>%dplyr::mutate(PROP_JOVEN=round(NUM_OP*PROP_JOVEN,1),
                   PROP_ADULTO=round(NUM_OP*PROP_ADULTO,1),PROP_PENSIONISTA=round(NUM_OP*PROP_PENSIONISTA,1))
  
  Totales<-a%>%dplyr::group_by(CP_CLIENTE)%>%dplyr::select(PROP_JOVEN,PROP_ADULTO,PROP_PENSIONISTA)%>%dplyr::summarise_all(funs(sum))
  
  series1<-Totales%>%dplyr::select(CP_CLIENTE,PROP_JOVEN)%>%dplyr::rename(POBLACION=PROP_JOVEN)%>%dplyr::mutate(EDAD=rep("Joven",nrow(Totales)))
  series2<-Totales%>%dplyr::select(CP_CLIENTE,PROP_ADULTO)%>%dplyr::mutate(EDAD=rep("Adulto",nrow(Totales)))%>%dplyr::rename(POBLACION=PROP_ADULTO)
  series3<-Totales%>%dplyr::select(CP_CLIENTE,PROP_PENSIONISTA)%>%dplyr::mutate(EDAD=rep("Pensionista",nrow(Totales)))%>%dplyr::rename(POBLACION=PROP_PENSIONISTA)
  
  serial<-rbind(series1,series2,series3)
  serial$CP_CLIENTE<-as.factor(serial$CP_CLIENTE)
  serial$EDAD<-as.factor(serial$EDAD)
  
  DF<-serial%>%dplyr::select(CP_CLIENTE,POBLACION,EDAD)
  Pie1<-DF%>%dplyr::select(EDAD,POBLACION)%>%dplyr::group_by(EDAD)%>%dplyr::summarise_all(funs(sum))%>%dplyr::mutate(PORCENTAJE=round(POBLACION/sum(POBLACION)*100,2))
  
  highchart() %>%
    hc_chart(type = "pie", options3d = list(enabled = TRUE, alpha = 10, beta = 0)) %>% 
    hc_plotOptions(pie = list(depth = 70,colors=c("#6fcb9f","#fb2e01","#666547"))) %>% 
    hc_add_series(Pie1,"pie", hcaes(x=EDAD,y=PORCENTAJE)) %>% 
    hc_add_theme(hc_theme(
      chart = list(backgroundColor = NULL)
    ))%>%hc_plotOptions(pie=list(allowPointSelect= T,dataLabels="disabled",showInLegend= TRUE))  %>%
    hc_tooltip(valueDecimals = 2,
               pointFormat = "Porcentaje:{point.PORCENTAJE}% <br> Numero de operaciones: {point.POBLACION}")
}

#Pie renta
pie_renta<-function(data=datos){
  
  a<-data%>% dplyr::mutate(PROP_R_BAJA=round(NUM_OP*PROP_R_BAJA,1),PROP_R_MEDIA=round(NUM_OP*PROP_R_MEDIA,1),
                    PROP_R_ALTA=round(NUM_OP*PROP_R_ALTA,1))
  
  Totales<-a%>%dplyr::group_by(CP_CLIENTE)%>%dplyr::select(PROP_R_BAJA,PROP_R_MEDIA,PROP_R_ALTA)%>%dplyr::summarise_all(funs(sum))
  
  series1<-Totales%>%dplyr::select(CP_CLIENTE,PROP_R_BAJA)%>%dplyr::rename(POBLACION=PROP_R_BAJA)%>%mutate(RENTA=rep("Renta Baja",nrow(Totales)))
  series2<-Totales%>%dplyr::select(CP_CLIENTE,PROP_R_MEDIA)%>%dplyr::mutate(RENTA=rep("Renta Media",nrow(Totales)))%>%rename(POBLACION=PROP_R_MEDIA)
  series3<-Totales%>%dplyr::select(CP_CLIENTE,PROP_R_ALTA)%>%dplyr::mutate(RENTA=rep("Renta Alta",nrow(Totales)))%>%rename(POBLACION=PROP_R_ALTA)
  
  serial<-rbind(series1,series2,series3)
  serial$CP_CLIENTE<-as.factor(serial$CP_CLIENTE)
  serial$RENTA<-as.factor(serial$RENTA)
  
  DF<-serial%>%dplyr::select(CP_CLIENTE,POBLACION,RENTA)
  Pie1<-DF%>%dplyr::select(RENTA,POBLACION)%>%group_by(RENTA)%>%dplyr::summarise_all(funs(sum))%>%dplyr::mutate(PORCENTAJE=round(POBLACION/sum(POBLACION)*100,2))

  
  highchart() %>%
    hc_chart(type = "pie", options3d = list(enabled = TRUE, alpha = 10, beta = 0)) %>% 
    hc_plotOptions(pie = list(depth = 70,colors=c("#6fcb9f","#fb2e01","#666547"))) %>% 
    hc_add_series(Pie1,"pie", hcaes(x=RENTA,y=PORCENTAJE)) %>% 
    hc_add_theme(hc_theme(chart = list(backgroundColor = NULL))) %>%
    hc_plotOptions(pie=list(allowPointSelect= T,dataLabels="disabled",showInLegend= TRUE)) %>%
    hc_tooltip(valueDecimals = 2,pointFormat = "Porcentaje:{point.PORCENTAJE}% <br> Numero de operaciones: {point.POBLACION}")
}

mapa.demografico<-function(){
pal<-colorNumeric("viridis", NULL)
leaflet(mapa_mun2) %>% addProviderTiles(providers$CartoDB.Positron) %>% addPolygons(fillColor = ~pal(log10(HABITANTES)),fillOpacity = 1,stroke=T,color="black",weight = 0.5,label = ~paste0(MUNICIPIO, ": ", format(HABITANTES,scientific = F,big.mark = ",")," habitantes"))
}
