library(shiny)
library(shinydashboard)
library(shinyBS)
library(shinyWidgets)

conditionalPanel2 <- function(condition, ..., ns = NS(NULL), inline = FALSE, container = if (inline) span else div) {
  container(`data-display-if` = condition, `data-ns-prefix` = ns(""), ...)
}
conditionalMenuItem <- function(label,tabName,iconName,condition) {
  t <- menuItem(
    label,
    tabName = tabName,
    icon = icon(iconName)
  )
  t$attribs <- list('data-display-if'=condition,'data-ns-prefix'='')
  t
}

# Define UI for application that draws a histogram
ui <- 
  dashboardPage(
    dashboardHeader(title = "ResCenter",
                    dropdownMenu(type = "notifications",
                                 notificationItem(
                                   text = "Return to services list",
                                   icon = icon("right-from-bracket"),
                                   href = 'https://service.corentinchoisy.xyz',
                                   status = 'danger'),
                                 badgeStatus = NULL,
                                 icon = icon('right-from-bracket'),
                                 headerText = ''
                    ),
                    dropdownMenu(type='messages',
                                 messageItem(from = 'View source on Gitea',
                                             message = 'Browse and download',
                                             icon = icon('git'),
                                             href = 'https://gitlab.com/corentinchoisy/kids'),
                                 badgeStatus = NULL,
                                 icon = icon('circle-info'),
                                 headerText = "App info")
    ),
    
    dashboardSidebar(
      collapsed=TRUE,
      sidebarMenu(
        menuItem("Tables", tabName = "tables", icon = icon("table"))
        #,conditionalMenuItem(condition='input.predictions == 1',label = "Autres métriques", tabName = "metriques", iconName = "square-poll-vertical")
      )
    ),
    
    dashboardBody(
      tabItems(tabItem('tables',
                       fluidRow(
                         box(title = "Input",status="success",width=12,
                         pickerInput(
                               inputId = "typeres",
                               label = "DIF recovery",
                               options=list(style='btn'),
                               choices = c("None", "Perfect", "ROSALI", "Residuals")),
                         conditionalPanel2(condition='input.typeres == "ROSALI" | input.typeres == "Residuals"',checkboxInput(inputId = "weak",label = "Show only weak detection scenarios (p.moreflexible<0.15)")
                                           ,conditionalPanel2(condition="!input.dif",checkboxInput(inputId = "causal",label = "Hide DIF detection data")),
                                           conditionalPanel2(condition='!input.causal',checkboxInput(inputId = "dif",label = "Hide causal inference data"))
                                           )
                         )
                       ),
                       fluidRow(
                         box(title = "Compiled results",status="primary",width = 12,solidHeader = T,DT::dataTableOutput("res"))
                       )
          )
      )
      
      
      
      
      ,tags$head(tags$style(HTML('
                              .content-wrapper { overflow: auto; }
                              
                              #options .box-header{ display: none}
                              
                              button.btn.dropdown-toggle.btn-default {
                                background-color: #d32927;
                                border-color: #d32927;
                                border-radius: 0px;
                              }

                              .box.box-danger{                                 
                                background:#f5eceb
                              }
                              
                              .box.box-warning{                                 
                                background:#f7f4ed
                              }
                              
                              .box.box-danger .form-control{                                 
                                background-color:#f5eceb !important
                              }
                              
                              .box.box-success{                                 
                                background:#e1fff1
                              }
                              
                              .box.box-success .form-control{                                 
                                background-color:#e1fff1 !important
                              }
                              
                              .box.box-primary{                                 
                                background:#ebf4f9
                              }
                            
                              
                              .box.box-solid{                                 
                                background:#ffffff
                              }
                              
                              .navbar-nav > .messages-menu > .dropdown-menu > li .menu, .navbar-nav > .notifications-menu > .dropdown-menu > li .menu, .navbar-nav > .tasks-menu > .dropdown-menu > li .menu {
                                max-height: 500px; overflow-y: hidden;
                              }
                              
                              .content {
                                height: auto; overflow-y: auto;
                              }
                    
                              /* navbar (rest of the header) */
                               .skin-blue .main-header .navbar {
                              background-color: #d32927;
                              }
                                            
                              /* navbar (rest of the header) */
                               .skin-blue .main-header .logo {
                              background-color: #d32927;
                              }              
                                            
                              /* logo when hovered */
                              .skin-blue .main-header .logo:hover {
                              background-color: #931c1b;
                              }              
                              /* toggle button when hovered  */                    
                              .skin-blue .main-header .navbar .sidebar-toggle:hover{
                              background-color: #931c1b;
                              }
                              
                              /* main sidebar */
                              .skin-blue .main-sidebar {
                              background-color: #4e4c4c;
                              }
                                            
                              /* active selected tab in the sidebarmenu */
                              .skin-blue .main-sidebar .sidebar .sidebar-menu .active a{
                              background-color: #282828;
                              border-left: 3px solid #d32927;
                              }
                         
                              /* other links in the sidebarmenu when hovered */
                              .skin-blue .main-sidebar .sidebar .sidebar-menu a:hover{
                              background-color: #282828;
                              border-left: 3px solid #d32927;
                              }
              '))))
  )
    
    
    
    
    
    
    
    
    
    
    
    
    

# Define server logic required to draw a histogram
server <- function(input, output) {
  res.dat <- read.csv("res_dat.csv")
  res.dat.dif <- read.csv("res_dat_dif.csv")
  res.dat.dif.resali <- read.csv("res_dat_dif_resali.csv")
  res.dat.dif.rosali <- read.csv("res_dat_dif_rosali.csv")
  
  df_res <- reactive({
    if(input$typeres=="None") {
      dd <- res.dat
    }
    if(input$typeres=="Perfect") {
      dd <- res.dat.dif
    }
    if(input$typeres=="ROSALI") {
      dd <- res.dat.dif.rosali
    }
    if(input$typeres=="Residuals") {
      dd <- res.dat.dif.resali
    }
    dd
  })
  

  
  df_res_r <- reactive({
    rs <- df_res()
    if(input$typeres=="None") {
      rs <- rs[,c('scenario','N','J','M','eff.size',"nb.dif","dif.size","theoretical.power","m.beta","se.empirical.beta","se.analytical.beta",
                  "m.low.ci.beta","m.high.ci.beta","true.value.in.ci.p","h0.rejected.p","beta.same.sign.truebeta.p",
                  "beta.same.sign.truebeta.signif.p","bias")]
      rs <- dplyr::mutate_if(rs,is.numeric,round,3)
      rs <- dplyr::mutate_all(rs,as.character)
    }
    if(input$typeres=="Perfect") {
      rs <- rs[,c('scenario','N','J','M','eff.size',"nb.dif","dif.size","theoretical.power","m.beta","se.empirical.beta","se.analytical.beta",
                  "m.low.ci.beta","m.high.ci.beta","true.value.in.ci.p","h0.rejected.p","beta.same.sign.truebeta.p",
                  "beta.same.sign.truebeta.signif.p","bias")]
      rs <- dplyr::mutate_if(rs,is.numeric,round,3)
      rs <- dplyr::mutate_all(rs,as.character)
    }
    if(input$typeres=="ROSALI") {
      rs <- rs[,c('scenario','N','J','M','eff.size',"nb.dif","dif.size","theoretical.power","m.beta","se.empirical.beta","se.analytical.beta",
                  "m.low.ci.beta","m.high.ci.beta","true.value.in.ci.p","h0.rejected.p","beta.same.sign.truebeta.p",
                  "beta.same.sign.truebeta.signif.p","bias","dif.detected","prop.perfect","flexible.detect","moreflexible.detect","any.detect")]
      if (input$causal) {
        rs <- rs[,c('scenario','N','J','M','eff.size',"nb.dif","dif.size","theoretical.power","m.beta","se.empirical.beta","se.analytical.beta",
                    "m.low.ci.beta","m.high.ci.beta","true.value.in.ci.p","h0.rejected.p","beta.same.sign.truebeta.p",
                    "beta.same.sign.truebeta.signif.p","bias")]
      }
      if (input$dif) {
        rs <- rs[,c('scenario','N','J','M','eff.size',"nb.dif","dif.size","dif.detected","prop.perfect","flexible.detect","moreflexible.detect","any.detect")]
      }
      if (input$weak) {
        rs <- rs[rs$moreflexible.detect<0.15 & !is.na(rs$moreflexible.detect),]
      }

      rs <- dplyr::mutate_if(rs,is.numeric,round,3)
      rs <- dplyr::mutate_all(rs,as.character)
    }
    if(input$typeres=="Residuals") {
      rs <- rs[,c('scenario','N','J','M','eff.size',"nb.dif","dif.size","theoretical.power","m.beta","se.empirical.beta","se.analytical.beta",
                  "m.low.ci.beta","m.high.ci.beta","true.value.in.ci.p","h0.rejected.p","beta.same.sign.truebeta.p",
                  "beta.same.sign.truebeta.signif.p","bias","dif.detected","prop.perfect","flexible.detect","moreflexible.detect","any.detect")]
      if (input$causal) {
        rs <- rs[,c('scenario','N','J','M','eff.size',"nb.dif","dif.size","theoretical.power","m.beta","se.empirical.beta","se.analytical.beta",
                    "m.low.ci.beta","m.high.ci.beta","true.value.in.ci.p","h0.rejected.p","beta.same.sign.truebeta.p",
                    "beta.same.sign.truebeta.signif.p","bias")]
      }
      if (input$dif) {
        rs <- rs[,c('scenario','N','J','M','eff.size',"nb.dif","dif.size","dif.detected","prop.perfect","flexible.detect","moreflexible.detect","any.detect")]
      }
      if (input$weak) {
        rs <- rs[rs$moreflexible.detect<0.15 & !is.na(rs$moreflexible.detect),]
      }
      rs <- dplyr::mutate_if(rs,is.numeric,round,3)
      rs <- dplyr::mutate_all(rs,as.character)
    }
    rs
  })

  
  output$res <- DT::renderDataTable(df_res_r(),
                                        options = list(columnDefs = list(list(className = 'dt-center',width=ifelse(input$dif & !is.na(input$dif),"119px","50px"), targets = "_all")),
                                          pageLength=100,autoWidth=T,scrollY=400,scrollX = T,server=F,buttons=c("csv","excel")),
                                        rownames = FALSE,
                                    selection="single",
                                    filter=list(plain=F,clear=F,position="top"))
}

# Run the application 
shinyApp(ui = ui, server = server)