
library(shiny)
library(shinythemes)
library(shinyWidgets)
library(plotly)
library(dplyr)

functionCode = "danstemDatabaseFunctions.R"
if (file.exists(functionCode)){
  print("Sourcing local code",functionCode,"...")
  source(functionCode)
} else {
  SNIPPETS = "~/local/bitbucket/snippets"
  source(paste0(SNIPPETS,"/bash/",functionCode))
}

dbFile = "database.xlsx"
if (file.exists(dbFile)){
  print("Loading local file",dbFile,"...")
  db = parseGenomicsPlatformProjectFile(dbFile)
} else {
  DB = loadDB(update=F)
  db = DB$db
}

PROJECTS = db$proj
DATASETS = db$db
RUNS = db$run
DATA = flattenDB(db)
USERS = unique(DATA[,c("owner","email")])
colnames(DATA)[colnames(DATA)=="name.x"] = "project_name"
colnames(DATA)[colnames(DATA)=="name.y"] = "dataset_name"
info_to_keep = c(
  "id","center","group","dataset_name","project_name","owner",
  "year","month","date_run","kit",
  "data_type","data_type_detail",
  "nb_samples","organism","shared",
  "dataset_ids","project_id")
DATA = DATA[,info_to_keep]


ui = fluidPage(
  #shinythemes::shinytheme("cosmo"),
  titlePanel("Genomics Platform Database"),
  #shinythemes::themeSelector(),
  sidebarLayout(
    sidebarPanel(
      selectInput("center","Center",choices=unique(DATA$center),selected=unique(DATA$center),multiple = T),
      selectInput("group","Group",choices=unique(DATA$group),selected=unique(DATA$group),multiple=T),
      selectInput("data_type","Data type",choices=unique(DATA$data_type),selected=unique(DATA$data_type),multiple=T),
      dateRangeInput(
        "date_range","Period",weekstart=1,
        start=sort(DATA$date_run)[[1]],
        end=sort(DATA$date_run,decreasing = T)[[1]]
      )
    ),
    mainPanel(
      tabsetPanel(
        tabPanel(
          "Runs",
          #tableOutput("tableNbRunsYear"),
          tableOutput("tableNbRunsYearCenter"),
          tableOutput("tableNbRunsGroups")
          #DT::DTOutput("plotGroupsDT")
          #plotly::renderPlotly("")
          #plotOutput("plotGroups")
        ),
        tabPanel(
          "Data Type",
          titlePanel("Overall"),
          plotOutput("plotDataType"),
          titlePanel("More details"),
          plotOutput("plotDataTypeDetails")
        ),
        tabPanel(
          "Table",
          DT::dataTableOutput("dataTable")
        )
      )
    )
  )
)

server = function(input,output,session){

  rv_data = reactive({
    filter(DATA,
           center %in% input$center,
           group %in% input$group,
           data_type %in% input$data_type,
           date_run >= input$date_range[[1]],
           date_run <= input$date_range[[2]]
           )
  })
  
  output$dataTable = DT::renderDataTable(rv_data())
  
  output$plotGroupsDT = DT::renderDT({
    rv_data() %>% 
        count(group, name = 'nb_runs') %>% 
        arrange(desc(nb_runs))
  })
  
  # output$tableNbRunsYear = renderTable({
  #   rv_data() %>% 
  #     count(year, name = 'nb_runs') %>% 
  #     arrange(year)
  # })
  
  output$tableNbRunsYearCenter = renderTable({
    df = rv_data()
    t = as.data.frame.matrix(table(df$year,df$center))
    t$Year = rownames(t)
    t$TOTAL = t$DanStem + t$CPR
    t[,c("Year","DanStem","CPR","TOTAL")]
    #df %>%
    #   group_by(center,year) %>%
    #   summarise(nb_runs=n()) %>%
    #   arrange(year)
  })
  
  output$tableNbRunsGroups = renderTable({
    rv_data() %>% 
      group_by(group) %>%
      summarise(nb_runs = n()) %>%
      arrange(desc(nb_runs))
      #count(group, name = 'nb_runs') %>%
      #arrange(year)
  })
  
  output$plotGroups <- renderPlot({
    counts = table(rv_data()$group)
    barplot(sort(counts),las=1,horiz = T,xlab="Number of runs")
    grid()
  })
  
  output$plotDataType <- renderPlot({
    counts = sort(table(rv_data()$data_type))
    pie(counts)
  })
  
  output$plotDataTypeDetails <- renderPlot({
    counts = sort(table(rv_data()$data_type_detail))
    pie(counts)
  })
}

shiny = shinyApp(ui,server)
