
#list.of.packages <- c("shiny", "shinydashboard","DT","dplyr","leaflet","raster","rgdal","highcharter",
#                      "tmap","ggplot2","rgeos","xts","zoo","RColorBrewer","ggthemes","gridExtra","idbr",
#                      "purrr","rAmCharts","data.table","tmap","lubridate","grid","yaml","visNetwork")
#new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
#if(length(new.packages)) install.packages(new.packages)


.libPaths( c( "/home/ieee-developer/R/x86_64-pc-linux-gnu-library/3.4", "/usr/local/lib/R/site-library", "/usr/lib/R/site-library", "/usr/lib/R/library") )

source("Librerias_Cajamar_2018.R")
source("UH2018_fun_J.R")
source("UH2018_fun_A.R")

sectores<-c("ALIMENTACION","AUTO","BELLEZA","HIPERMERCADOS","HOGAR",
            "MODA Y COMPLEMENTOS","OCIO Y TIEMPO LIBRE","OTROS",
            "RESTAURACION","SALUD","TECNOLOGIA")
dias<-c("lunes","martes","miercoles","jueves","viernes","sabado","domingo")

meses<-c("enero","febrero","marzo","abril","mayo","junio",
         "julio","agosto","septiembre","octubre","noviembre","diciembre")

header<-dashboardHeader(
  title=span(tagList(img(src="sense3_7.png"))),
  
  dropdownMenu(
    type = "notifications",
    headerText = "Fuentes de datos:",
    icon = icon("cloud-download"),
    badgeStatus = "warning",
    notificationItem("Cajamar", icon = icon("credit-card"),href = "http://www.cajamardatalab.com/datathon-cajamar-universityhack-2018/retos/wefferent-card-analytics/"),
    notificationItem("CartoCiudad", icon = icon("map"),href = "http://www.cartociudad.es/visor/"),
    notificationItem("CREM",icon=icon("group"),href="http://econet.carm.es/web/crem/inicio/-/crem/sicrem/PU_MurciaCifrasNEW/Indice16.html"),
    notificationItem("iderm",icon=icon("road"),href="http://murcia.maps.arcgis.com/apps/webappviewer/index.html?id=b075e1612e7d40e6bf67b0cbc860d92c"),
    notificationItem("MeteoMurcia",icon=icon("umbrella"),href="http://www.meteomurcia.com"),
    notificationItem("OpenStreetMap",icon=icon("map-marker"),href="https://www.openstreetmap.org/") 
    
    
  ),
  dropdownMenu(
    type = "notifications",
    headerText = "¡Contáctanos!",
    icon = icon("linkedin"),
    badgeStatus = "info",
    notificationItem("Alberto Oteo García", icon = icon("linkedin"),href = "https://www.linkedin.com/in/alberto-oteo-garcía"),
    notificationItem("Julián Ballesteros García", icon = icon("linkedin"),href = "https://www.linkedin.com/in/julian-bal-gar/")
  ),
  
  tags$li(a(actionLink(inputId="help","",icon("question",lib="font-awesome")),style='margin-bottom: -30px;'),class="dropdown")
  
)


body<-dashboardBody(
  tabItems(
 
    #TAB MAPA ----
    tabItem(
      tabName = "mapa",
      fluidRow(
        tags$script("var toggle = false;$('document').ready(function(){$('#map').height($( window ).height()-50);});
                    $('.sidebar-toggle').on('click', 
                    function(){
                    
                    	var width_p1 = ($('body').width() / 100) * 25;
                    
	                    if(!toggle){
	                      $('.panel2').width($('body').width() - width_p1 - 100);
	                      toggle = true;
	                    }
	                    else{
	                      $('.panel2').width(($('body').width() - $('.main-sidebar').width()) - width_p1 - 100);
	                      toggle = false;
	                    }
                    });
                    
                    
                    $(\".main-sidebar\").on(\"click\", function(d){
                    
                    	if($(\"#shiny-tab-mapa\").is(\":visible\")){
		                    if(toggle){
		                      $('.panel2').width($('body').width() - $('.panel1').width() - 100);
		                    }
		                    else{
		                      $('.panel2').width(($('body').width() - $('.main-sidebar').width()) - $('.panel1').width() - 100);
		                    }
	                    } 
                    
                    
	                    if($(\"#shiny-tab-mapa\").is(\":visible\")){
	                    	//$(document.body).css(\"overflow-y\", \"hidden\");
	                    	console.log('visible');
	                    } 
	                    else{
	                    	//$(document.body).css(\"overflow-y\", \"scroll\");
	                    	console.log('no visible');
	                    } 
					});
                    "),
        tags$style(type = "text/css", " .no-overflow{overflow-y:hidden;} #map {margin-top: -15px !important; overflow-y: hidden; padding-bottom: 0px !important;} 
        		   .content{padding-bottom: 0px !important;}
                   .panel1{position: absolute;top: 60px;right: 0;width: 25%;z-index:1000;} 
                   .panel2{position: absolute;top: 60px;right: 24%;width: 60%;z-index:1000;}"),
        leafletOutput("map",width = "100%"),
        #PANEL 1 ----
        column(6,
               class="panel1",
               #box desplegable que contiene varias tabBoxs
               box(
                 collapsible = T,
                 width = NULL,
                 status = "danger",
                 solidHeader = F,
                 title=span(tagList(icon("gear"), "· Panel de opciones")),
                 tabBox(
                   width = 12,
                   #tabPanel de filtros generales----
                   tabPanel(
                     title=icon("globe"),
                     width=12,
                     h4(icon("globe"),"· Opciones generales"),
                     radioButtons(
                       inputId = "radio2",
                       label="Analizar los codigos postales de los",
                       choices = c("comercios"="com","clientes"="cli"),
                       selected="com"
                       ),
                     uiOutput("cp"),
                     radioButtons(
                       inputId = "radio",
                       label="Mostrar importe en valores",
                       choices = c("totales"="tot","medios"="med"),
                       selected="tot"
                       )
                     
                     ),
                   #tabPanel de filtros por sectores de comercio----
                    tabPanel(
                      title = icon("shopping-cart"),
                      width = 12,
                      h4(icon("shopping-cart"),"· Opciones de sector"),
                      selectizeInput(
                        inputId = "sector",
                        label="Sector:",
                        choices=sectores,
                        multiple=T,
                        selected=sectores,
                        options = list("plugins"=list("remove_button"))
                        )
                      ),
                   #tabPanel de filtros calendario----
                    tabPanel(
                      width = 12,
                      title= icon("calendar"),
                      width=12,
                      h4(icon("calendar"),"· Opciones de calendario"),
                      selectizeInput(
                        inputId = "dia",
                        label="Dia:",
                        choices=dias,
                        multiple=T,
                        selected=dias,
                        options = list("plugins"=list("remove_button"))
                        ),
                      selectizeInput(
                        inputId = "mes",
                        label="Mes:",
                        choices=meses,
                        multiple=T,
                        selected=meses,
                        options = list("plugins"=list("remove_button"))
                        ),
                      dateRangeInput(
                        inputId="fecha",
                        label="Fecha:",
                        start="2015-09-30",
                        end="2017-09-30",
                        min="2015-09-30",
                        max="2017-09-30",
                        separator = "a",
                        language="es"
                        )
                      ),
                   #tabPanel de filtros franja horaria----
                   tabPanel(
                     width = 12,
                     title=icon("time",lib="glyphicon"),
                     width=12,
                     h4(icon("time",lib="glyphicon"),"· Opciones de franja horaria"),
                     fluidRow(
                       column(6,
                              numericInput(
                                inputId = "de",
                                label="De: ",
                                min = 0,
                                max=22,
                                step = 2,
                                value = 0
                              )
                       ),
                       column(6,
                              numericInput(
                                inputId = "hasta",
                                label="Hasta: ",
                                min = 0,
                                max=22,
                                step = 2,
                                value = 0
                              )
                       )
                   )
                   
                   ),
                   #tabPanel de filtros edad/renta/sexo----
                   tabPanel(
                     title = icon("users"),
                     width = 12,
                     h4(icon("users"),"· Opciones de grupo"),
                     helpText("ADVERTENCIA: Al usar estos filtros se eliminan los registros con numero de operaciones mayor que 1 con la finalidad de filtrar con exactitud el sexo, la renta y la edad de la persona que realiza la transacción."),
                     selectInput(
                       inputId = "edad",
                       label = "Edad:",
                       choices = c("Todos","Joven","Adulto","Pensionista"),
                       selected = "Todos"
                       ),
                     selectInput(
                       inputId = "renta",
                       label = "Renta:",
                       choices = c("Todos","Baja","Media","Alta"),
                       selected = "Todos"
                     ),
                     selectInput(
                       inputId = "sexo",
                       label = "Sexo:",
                       choices = c("Todos","Hombre","Mujer"),
                       selected = "Todos"
                     )
                
                   )
                   #botones----
                   )
                 ,fluidRow(
                     column(7,
                   actionButton(
                     inputId = "go",
                     label="Aplicar filtros",
                     width = "110%",
                     icon=icon("filter",lib="glyphicon")
                   )
                 ),
                 column(5,
                        actionButton(
                          inputId = "reset",
                          label="Restaurar",
                          width = "100%",
                          icon=icon("repeat",lib="glyphicon")
                        )
                        ))
                 )
               ),
        #PANEL2 ----
        column(6,
               class="panel2",
               #box desplegable que contiene varias tabBoxs
               box(
                 collapsible = T,
                 collapsed = T,
                 width = NULL,
                 status = "danger",
                 solidHeader = F,
                 title=span(tagList(icon("area-chart"), "· Panel de gráficas")),
                 tabBox(
                   width = 12,
                   #tabPanel de graficas----
                   tabPanel(
                     icon=icon("calendar"),
                     title="Calendario",
                     plotOutput("calendar")
                   ),
                   tabPanel(
                     icon=icon("time",lib="glyphicon"),
                     title="Franja horaria",
                     highchartOutput("bar_hora")
                   ),
                   tabPanel(
                     icon=icon("bar-chart"),
                     title="Sectores · Barras",
                      highchartOutput("bar_sector")
                   ),
                   tabPanel(
                     icon=icon("line-chart",lib="font-awesome"),
                     title="Sectores · Serie Temporal",
                     amChartsOutput("serie")
                   ),
                   tabPanel(
                     icon=icon("pie-chart"),
                     title="Grupos poblacionales",
                     column(4,highchartOutput("pie_sexo")),
                     column(4,highchartOutput("pie_edad")),
                     column(4,highchartOutput("pie_renta"))
                     
                   )
                   
                 )
                 ))
        )
      ),
    #TAB INICIO----
    
      tabItem(
        tabName="inicio",
        includeHTML("inicio.html")
      ),
      
    #TAB Murcia en cifras----
    tabItem(tabName = "murcia", fluidRow(box(title = "Filtros",
                                              status = "primary",
                                              color="black", 
                                              solidHeader = TRUE,
                                              width=2,
                                              selectInput("sectores_clima","Selecciona el Sector:",
                                                          choices=c("Total"="todos","Alimentacion"="ALIMENTACION","Autos"="AUTO",
                                                                    "Belleza"="BELLEZA","Hipermercados"="HIPERMERCADOS","Hogar"="HOGAR","Moda y Complementos"="MODA Y COMPLEMENTOS",
                                                                    "Ocio y Tiempo Libre"="OCIO Y TIEMPO LIBRE", "Otros"="OTROS","Restauracion"="RESTAURACION","Salud"="SALUD",
                                                                    "Tecnologia"="TECNOLOGIA")),
                                              selectizeInput("parazo","Selecciona Municipio:",
                                                          choices=c(as.character(p$MUNICIPIOS)),
                                                          multiple = TRUE,
                                                          selected="Region de Murcia", 
                                                          options = list(maxItems=3,'plugins' = list('remove_button'),'create' = TRUE))),
                                          box(width = 10,highchartOutput("clima"))),
            fluidRow(box(width = 12,highchartOutput("parillo")))
            
    ),
    #TAB COMPARA CP----
    tabItem(
      tabName = "comparador",
      
      fluidRow(
        box(
          width=12,
          title=span(tagList(icon("gear"),"· Filtros")),
          solidHeader = F,
          collapsible = TRUE,
          status = "danger",
          fluidRow(
                   column(2,
                          selectInput("riqueza","Renta de los cliente:",
                                      choices=c("Todas"="todas","Baja"="baja","Media"="media","Alta"= "alta"))),
                          
                   column(2,
                   selectInput("edad2","Edad de los cliente:", 
                               choices=c("Todos"="todos", "Jovenes"="jovenes","Adultos"="adultos","Jubilados"="jubilados"))
                   ),
                   column(2,
                          selectInput("sexo2","Sexo de los cliente:",
                                      choices=c("Todos"="todos","Hombre"="hombres","Mujeres"="mujeres"))
                   ),
                   column(2,
                          selectInput("Sector2","Sector:", choices=c("Todos",as.character(unique(datos$SECTOR))))
                          ),
                   column(width=4,
                          dateRangeInput(
                            inputId="fecha2","Fecha:",
                            start="2015-10-01",end="2017-09-30",min="2015-10-01",
                            max="2017-09-30",separator = "a",language="es"))
                   ),
        fluidRow(
          column(6,
                 selectizeInput("radar1", "Selección código postal comercio: ",
                                choices=unique(datos$CP_COMERCIO),
                                multiple=TRUE,
                                selected="30001",
                                options = list(maxItems=3,'plugins'=list('remove_button'))
                 )
                 ),
          column(6,
                 selectizeInput("radar2", "Selección código postal cliente: ", 
                                choices= unique(datos$CP_CLIENTE),
                                multiple = TRUE,
                                selected="30001", 
                                options = list(maxItems=3,'plugins' = list('remove_button'),'create' = TRUE)))
          
        )
               
               
               
      )),
      
      fluidRow(
        #tags$style(type = "text/css", "#visualizacion {margin-top: -15px !important;} body{overflow-y: visible !important;}"),
       
        box(width=6,status = "warning",solidHeader = T,highchartOutput("fifita_com")),
        box(width=6,status = "info",solidHeader = T,highchartOutput("fifita_cli"))
      ),
      fluidRow(
        h2(HTML("<center>¿Quieres saber más?</center>")),
        h3(HTML("<center>Despliega los gráficos que te interesen</center>"))
        
      ),
      fluidRow(
        box(width = 6,status = "warning",solidHeader = T,title="¿Qué número de operaciones tienen esos comercios?",collapsible = T,collapsed = T,highchartOutput("Combar")),
        box(width=6,status = "info",solidHeader = T,title="¿A dónde van a comprar esos clientes?",collapsible = T,collapsed = T,visNetworkOutput("network"))
      ),
      fluidRow(
        box(width = 6,status = "warning",solidHeader = T,title="¿Cómo se comportan esos comercios en el tiempo?",collapsible = T,collapsed = T,amChartsOutput("seriecomercios")),
        box(width = 6,status = "info",solidHeader = T,title="¿Cómo se comportan esos clientes en el tiempo?",collapsible = T,collapsed = T,amChartsOutput("serieclientes"))
      )
    ),
    #TAB INFORME ----
    tabItem(
      tabName = "informe", 
      box(width=12,
        column(
          width=6,
          selectizeInput(
            inputId = "sel_Informe",
            label="Gráficas a comentar:",
            choices=c("mapa","calendario","barras_sectores","horas","serie_sectores","sexo","renta","edad"),
            multiple=T)
          ),
        column(3,radioButtons('format', 'Document format',choices= c( "Word","PDF", "HTML"),selected = "PDF",inline = TRUE)
          ),
        column(3,
               h5("Pulsa para descargar!"),
               downloadButton('DownloadReport'))
        )
  ),
    #TAB CONCLUSIONES ----
  tabItem(
    tabName = "conclusiones",
    h3("En construccion")
  )
)  
)
#----
sidebar<-dashboardSidebar(
  collapsed = F,
  sidebarMenu(
    menuItem("Inicio",tabName = "inicio",icon=icon("home")),
    menuItem("Mapa interactivo",tabName = "mapa",icon=icon("map")),
    menuItem("Análisis Comparativo",tabName = "comparador",icon=icon("balance-scale ")),
    menuItem("Murcia en cifras",tabName = "murcia",icon=icon("line-chart")),
    #menuItem("Informe",tabName="informe",icon=icon("edit")),
    menuItem("Conclusiones",tabName = "conclusiones",icon=icon("lightbulb-o",lib="font-awesome"))
    ))

ui<-dashboardPage(
  skin = "black",
  header,
  sidebar,
  body
)

server<-function(input,output,session){
  
  
  output$cp <- renderUI({
    if(input$radio2=="com"){
      selectInput('cp',"a donde van los clientes del CP", c("Todos",unique(datos$CP_CLIENTE)),selected="Todos")
    }else{
      if(input$radio2=="cli"){
        selectInput('cp',"que compran en los comercios del CP", c("Todos",unique(datos$CP_COMERCIO)),selected="Todos")
      }
    }
  })

  datos.f<-eventReactive(input$go,{
    filtrado(input$cp,input$sector,input$dia,input$mes,isolate(input$radio2),input$fecha,input$de,input$hasta,input$sexo,input$edad,input$renta)
    }
  )
  
  observeEvent(input$help,{
    showModal(modalDialog(
      title = "¿Necesitas ayuda?",
      h4(HTML("<center><b>¿Cómo puedo navegar por los distintos apartados de esta web?</b></center>")),
      h5("Nuestra plataforma de visualización consta de varias pestañas a las que puedes acceder a través del icono (", icon("bars"),"). Cada una de ellas trata una temática diferente y te permitirán bucear por Murcia y sus datos."),
      h4(HTML("<center><b><font color='Red'>···</font>·</b></center>")),
      h4(HTML("<center><b>¿Cómo se usa el mapa interactivo?</b></center>")),
      h5("El mapa interactivo muestra información sobre el consumo en Murcia por código postal y contiene dos paneles: el de opciones y el de graficas. El panel de opciones permite filtrar el conjunto de datos para mostrar la información que te interese mientras que el panel de gráficas complementa la información del mapa."),
      h5(icon("cog"),HTML("<b>· Panel de opciones</b>")),
      h5("Para aplicar filtros a los datos dirigete al panel de opciones y juega con las posibilidades que tiene. Una vez seleccionados los filtros y el modo de ver el mapa, pulse (",icon("filter"),"Aplicar filtros ) y el mapa se actualizará. Si quiere reestablecer el filtrado predeterminado, pulse (",icon("repeat"),"Restaurar )."),
      h5(icon("area-chart"),HTML("<b>· Panel de gráficas</b>")),
      h5("El panel de gráficas contiene un calendario del importe efectuado por día ",icon("calendar"),", un reloj que muestra las horas en las que se transfiere mas dinero ",icon("time",lib="glyphicon"),", un gráfico de barras por sector ",icon("bar-chart"),", una serie temporal de los sectores ",icon("line-chart")," y tres pie-charts que muestran el porcentaje de operaciones por grupo poblacional ",icon("pie-chart"),"."),
      h4(HTML("<center><b><font color='Red'>···</font>·</b></center>")),
      h4(HTML("<center><b>¿Qué información me aporta el análisis comparativo?</b></center>")),
      h4(HTML("<center><b><font color='Red'>···</font>·</b></center>")),
      h4(HTML("<center><b>¿Cuál es el objetivo de Murcia en cifras?</b></center>")),
      h4(HTML("<center><b><font color='Red'>···</font>·</b></center>")),
      h4(HTML("<center><b>¿Cómo puedo generar un informe?</b></center>")),
      footer = modalButton("Cerrar")
    ))
  })
  
  observeEvent(input$go, {
    if(nrow(datos.f())==0){
    showModal(modalDialog(
      
      title = span(tagList(icon("warning-sign",lib="glyphicon"), "Imposible actualizar el mapa!")),
      "No hay datos para el filtrado seleccionado. Compruebe los filtros aplicados.",
      footer = modalButton("Cerrar")
    ))
    } 
  })
  
  output$map<-renderLeaflet({
    if(input$go==0){
      mapa()
    }else{
    validate(
      need(nrow(datos.f())!=0,"No hay datos con los filtros seleccionados")
      )
    
    mapa(datos.f(),isolate(input$radio),isolate(input$radio2))
    }
  })
  
  
  output$bar_sector<-renderHighchart({
    if(input$go==0){
      barras.sector()
    }else{
    barras.sector(datos.f())
    }
  })
  
  output$pie_sexo<-renderHighchart({
    if(input$go==0){
      pie_sexo()
    }else{
      pie_sexo(datos.f())
    }
  })
  
  output$pie_edad<-renderHighchart({
    if(input$go==0){
      pie_edad()
    }else{
      pie_edad(datos.f())
    }
  })
  
  output$pie_renta<-renderHighchart({
    if(input$go==0){
      pie_renta()
    }else{
      pie_renta(datos.f())
    }
  })
  
  output$bar_hora<-renderHighchart({
    if(input$go==0){
      barras.hora()
    }else{
      barras.hora(datos.f())
    }
  })
  
  output$calendar<-renderPlot(
    if(input$go==0){
      calendar()
    }else{
      calendar(datos.f())
    }
  )

  
  output$serie<-renderAmCharts(
    if(input$go==0){
      serie()
    }else{
      serie(datos.f())
    }
  )
  
  observeEvent(input$reset, {
    updateRadioButtons(session,inputId = "radio",selected="tot")
    updateRadioButtons(session,inputId = "radio2",selected="com")
    updateSelectizeInput(session, inputId = "dia",selected=dias )
    updateSelectizeInput(session,inputId = "mes",selected=meses)
    updateDateRangeInput(session,inputId="fecha",start="2015-10-01",end="2017-09-30")
    updateNumericInput(session,inputId = "hasta", value = 0)
    updateNumericInput(session,inputId = "de",value = 0)
    updateSelectizeInput(session,inputId = "sector",selected=sectores)
    updateSelectInput(session,inputId="cp",selected = "Todos")
    updateSelectInput(session,inputId="edad",selected = "Todos")
    updateSelectInput(session,inputId="renta",selected = "Todos")
    updateSelectInput(session,inputId="sexo",selected = "Todos")
  })
  
  output$fifita_com <- renderHighchart({
    validate( 
      need(length(input$radar1)>=1,"Por favor, introduzca los códigos postales de comercios.")
    )
    fifita_comercio(input$radar1,input$fecha2,input$riqueza,input$edad2,input$sexo2)
  })
  
  output$fifita_cli <- renderHighchart({ 
    validate( 
      need(length(input$radar2)>=1,"Por favor, introduzca los códigos postales de clientes.")
    )
    fifita_cliente(input$radar2,input$fecha2,input$riqueza,input$edad2,input$sexo2)
  })
  
  output$Combar <- renderHighchart({ 
    validate( 
      need(length(input$radar1)>=1,"Por favor, introduzca los códigos postales.")
    )
    BarRadar2(input$radar1,input$fecha2,input$riqueza,input$edad2,input$sexo2)
  })
  
  output$Tabla<-renderHighchart({
    validate( 
      need(length(input$radar1)>=1,"Por favor, introduzca los códigos postales de clientes.")
    )
    pie_clientes(input$radar2) 
  })
  
  output$clima <- renderHighchart({
    
    clima(input$sectores_clima)
  })
  output$parillo <- renderHighchart({
    
    paro2(input$parazo)
  })
  
  output$network <- renderVisNetwork({validate( 
    need(length(input$radar2)>=1,"Por favor, introduzca los códigos postales de clientes.")
  )
    grafo(input$radar2)
  })
  
  output$serieclientes <- renderAmCharts({validate( 
    need(length(input$radar2)>=1,"Por favor, introduzca los códigos postales de clientes.")
  )
    temp_clientes(input$Sector2,input$radar2)
  })
  
  output$seriecomercios <- renderAmCharts({validate( 
    need(length(input$radar2)>=1,"Por favor, introduzca los códigos postales de comercios.")
  )
    temp_comercios(input$Sector2,input$radar1)
  })
  
  

  
  
}

shinyApp(ui=ui,server=server)
