shinyPanelDiffex <- fluidPage(
  tags$script("Shiny.addCustomMessageHandler('close_dropDownDeHM', function(x){
                  $('html').click();
                });"),
  tags$script("Shiny.addCustomMessageHandler('close_dropDownDeVolcano', function(x){
                  $('html').click();
                });"),
  tags$script("Shiny.addCustomMessageHandler('close_dropDownDeViolin', function(x){
                  $('html').click();
                });"),
  tags$script("Shiny.addCustomMessageHandler('close_dropDownDeReg', function(x){
                  $('html').click();
                });"),
  tags$div(
    class = "container",
    h1("Differential Expression"),
    h5(tags$a(href = paste0(docs.artPath, "differential_expression.html"),
              "(help)", target = "_blank")),
    fluidRow(
      panel(
        style = "margin:2px;",
        h3("Method and Matrix"),
        fluidRow(
          column(
            4,
            selectInput('deMethod', "Choose analysis method",
                        c('wilcox', 'MAST', 'DESeq2', 'Limma', 'ANOVA'))
          ),
          column(
            4,
            selectizeInput(
              inputId = "deAssay", 
              label = "Select input matrix:", 
              choices = NULL, 
              selected = NULL, 
              multiple = FALSE,
              options = NULL)
          )
        ),
        useShinyjs(),
        actionButton("deViewThresh", label = "View Thresholding"),
        shinyjs::hidden(
          wellPanel(
            id = "deThreshpanel",
            textOutput("deSanityWarnThresh"),
            uiOutput("deThreshPlotDiv"),
            actionButton("deHideThresh", label = "Hide")
            )
          ),
        h3("Condition Setting"),
        p("Three approaches of setting provided for flexibility. ",
          style = "color:grey;"),
        radioButtons('deCondMethod', "Condition Selection:",
                     choiceNames = c("By annotations",
                                     "Manually select individual cells",
                                     "Manually enter cell IDs"),
                     choiceValues = c(1, 2, 3), inline = TRUE),
        fluidRow(
          column(width = 6,
                 textInput("deG1Name", "Name of Condition1", NULL,
                           placeholder = "Required")
          ),
          column(width = 6,
                 textInput("deG2Name", "Name of Condition2", NULL,
                           placeholder = "Required")
          )
        ),
        conditionalPanel(
          condition = "input.deCondMethod == 1",
          # Select by class UI ####
          panel(
            selectInput("deC1Class", "Choose Annotation Class:",
                        clusterChoice),
            fluidRow(
              column(width = 6,
                     uiOutput("deC1G1UI"),
                     uiOutput("deC1G1CellCheckUI"),
                     uiOutput("deC1G1NCell")
              ),
              column(width = 6,
                     uiOutput("deC1G2UI"),
                     uiOutput("deC1G2CellCheckUI"),
                     uiOutput("deC1G2NCell")
              )
            )
          )
        ),
        conditionalPanel(
          condition = "input.deCondMethod == 2",
          panel(
            tabsetPanel(
              tabPanel(
                "Condition 1",
                tagList(
                  selectInput(
                    'deC2G1Col',
                    "Columns to display",
                    clusterChoice, multiple = TRUE, width = '550px'
                  ),
                  DT::dataTableOutput("deC2G1Table"),
                  actionButton('deC2G1Table_addAll', "Add all filtered"),
                  actionButton('deC2G1Table_clear', "Clear selection"),
                )
              ),
              tabPanel(
                "Condition 2",
                tagList(
                  selectInput(
                    'deC2G2Col',
                    "Columns to display",
                    clusterChoice, multiple = TRUE, width = '550px'
                  ),
                  p("Leave unselected for all the others.",
                    style = 'color:grey;'),
                  DT::dataTableOutput("deC2G2Table"),
                  actionButton('deC2G2Table_addAll', "Add all filtered"),
                  actionButton('deC2G2Table_clear', "Clear selection"),
                )
              )
            ),
            h4("Summary", style = 'margin-top:10px'),
            uiOutput("deC2G1info"),
            uiOutput("deC2G2info")
          )
        ),
        conditionalPanel(
          condition = "input.deCondMethod == 3",
          # Direct enter name UI ####
          panel(
            fluidRow(
              column(width = 6,
                     h4("The Condition of Interests:"),
                     textAreaInput(
                       "deC3G1Cell", "Cell IDs:", height = '150px',
                       placeholder = "Enter cell IDs here, \none per line with no symbol separator."),
                     uiOutput("deC3G1NCell")
              ),
              column(width = 6,
                     h4("The Control Condition:"),
                     textAreaInput(
                       "deC3G2Cell", "Cell IDs:", height = '150px',
                       placeholder = "Leave this blank for all the others."),
                     uiOutput("deC3G2NCell")
              )
            )
          )
        ),
        h3("Parameters"),
        fluidRow(
          column(
            width = 3,
            selectInput("deCovar", "Select Covariates",
                        clusterChoice, multiple = TRUE)
          ),
          column(
            width = 3,
            numericInput("deFDRThresh", "Output FDR less than:",
                         min = 0, max = 1, step = 0.01, value = 0.05)
          ),
          # column(
          #   width = 3,
          #   numericInput("deFCThresh",
          #                "Output Log2FC Absolute value greater than:",
          #                min = 0, step = 0.05, value = NULL)
          # ),
          column(
            width = 3,
            style = 'margin-top: 18px;',
            checkboxInput("dePosOnly", "Only up-regulated genes",
                          value = FALSE)
          )
        ),
        # fluidRow(
        #   column(
        #     width = 3,
        #     numericInput("deMinExp1", 
        #                  "Output Group1 mean expression greater than:",
        #                  min = 0, step = 0.1, value = NULL)
        #   ),
        #   column(
        #     width = 3,
        #     numericInput("deMaxExp2", 
        #                  "Output Group2 mean expression less than:",
        #                  min = 0, step = 0.1, value = NULL)
        #   ),
        #   column(
        #     width = 3,
        #     numericInput("deMinExpPerc1",
        #                  "Output Group1 expression percentage greater than:",
        #                  min = 0, max = 1, step = 0.05, value = NULL)
        #   ),
        #   column(
        #     width = 3,
        #     numericInput("deMaxExpPerc2",
        #                  "Output Group2 expression percentage less than:",
        #                  min = 0, max = 1, step = 0.05, value = NULL)
        #   )
        # ),
        fluidRow(
          column(
            width = 3,
            textInput("deAnalysisName",
                      "Name of Differential Expression Analysis:",
                      placeholder = 'Required.')
          ),
          column(
            width = 2,
            style = 'margin-top: 25px;',
           actionButton("runDE", "Run")
          )
        )
      )
    ),
    h3("Visualization"),
    p('Select an analysis and click on "Update All" to show the results.', 
      style = "color:grey;"),
    fluidRow(
      selectInput("deResSel", "Select Differential Expression Analysis", choices = NULL),
      actionBttn(
        inputId = "deResSelUpdate",
        label = "Update All",
        style = "bordered",
        color = "primary",
        size = "sm", 
      ),
      hr(),
      tabsetPanel(
        tabPanel(
          "Heatmap",
          panel(
            fluidRow(
              column(
                width = 4,
                dropdown(
                  fluidRow(
                    column(12,
                           fluidRow(actionBttn(inputId = "closeDropDownDeHM", label = NULL, style = "simple", color = "danger", icon = icon("times"), size = "xs"), align = "right"),
                    )
                  ),
                  fluidRow(
                    column(
                      width = 6,
                      checkboxInput('deHMDoLog', "Do log transformation", FALSE),
                    ),
                    column(
                      width = 6,
                      checkboxInput('deHMPosOnly', "Only up-regulated",
                                    value = FALSE)
                    )
                  ),
                  fluidRow(
                    column(
                      width = 6,
                      numericInput("deHMFC", "Aboslute log2FC value greater than:",
                                   value = 0.5, min = 0, step = 0.05),
                    ),
                    column(
                      width = 6,
                      numericInput("deHMFDR", "FDR value less than", value = 0.05,
                                   max = 1, step = 0.01),
                    )
                  ),
                  
                  fluidRow(
                    column(
                      width = 6,
                      numericInput("deHMMinExp1", 
                                   "Group1 mean expression greater than:",
                                   value = NULL, min = 0, step = 0.1),
                    ),
                    column(
                      width = 6,
                      numericInput("deHMMaxExp2", 
                                   "Group2 mean expression less than:", 
                                   value = NULL, min = 0, step = 0.1),
                    )
                  ),
                  fluidRow(
                    column(
                      width = 6,
                      numericInput("deHMMinExpPerc1", 
                                   "Group1 expression percentage greater than:",
                                   value = NULL, min = 0, max = 1, step = 0.05),
                    ),
                    column(
                      width = 6,
                      numericInput("deHMMaxExpPerc2", 
                                   "Group2 expression percentage less than:", 
                                   value = NULL, min = 0, max = 1, step = 0.05),
                    )
                  ),
                  
                  fluidRow(
                    column(
                      width = 6,
                      selectInput("deHMcolData", "Additional cell annotation",
                                  choices = clusterChoice, multiple = TRUE),
                    ),
                    column(
                      width = 6,
                      selectInput("deHMrowData", "Additional feature annotation",
                                  choices = featureChoice, multiple = TRUE),
                    )
                  ),
                  fluidRow(
                    column(
                      width = 6,
                      uiOutput('deHMSplitColUI'),
                    ),
                    column(
                      width = 6,
                      uiOutput('deHMSplitRowUI'),
                    )
                  ),
                  fluidRow(
                    column(
                      width = 6,
                      materialSwitch(
                        inputId = "deHMShowRowLabel",
                        label = "Display row labels", status = "success",
                        value = TRUE
                      ),
                      selectInput(
                        inputId = "deHMrowLabel",
                        label = "Select row labels",
                        choices = c("Rownames (Default)",
                                    featureChoice)
                      )
                    ),
                    column(
                      width = 4,
                      br(),
                      withBusyIndicatorUI(
                        actionBttn(
                          inputId = "dePlotHM",
                          label = "Update",
                          style = "bordered",
                          color = "primary",
                          size = "sm"
                        )
                      )
                    )
                  ),
                  inputId = "dropDownDeHM",
                  icon = icon("cog"),
                  status = "primary",
                  circle = FALSE,
                  inline = TRUE,
                  width = "500px"
                )
              ),
              column(
                width = 7,
                fluidRow(
                  h6(
                    "A heatmap of the expression of DEGs in the selected cells, columns splitted by condition setting, and rows splitted by up-/down-regulation (whether log2FC is positive or negative, respectively)"),
                  align="center"
                )
              )
            ),
            hr(),
            br(),

            shinyjqui::jqui_resizable(plotOutput("deHeatmap"))
          )
        ),
        tabPanel("Results Table",
                 filterTableUI(id = "deResult")
                 # DT::dataTableOutput("deResult"),
                 # downloadButton("deDownload", "Download Result Table")
                 ),
        tabPanel(
          "Volcano Plot",
          panel(
            fluidRow(
              column(
                width = 4,
                dropdown(
                  fluidRow(
                    column(
                      12,
                      fluidRow(
                        actionBttn(
                          inputId = "closeDropDownDeVolcano", label = NULL, 
                          style = "simple", color = "danger", 
                          icon = icon("times"), size = "xs"
                        ), 
                        align = "right"
                      ),
                    )
                  ),
                  fluidRow(
                    column(
                      width = 6,
                      numericInput(
                        inputId = "deVolcLog2FC", 
                        label = "Aboslute log2FC value greater than:",
                        value = 0.5, min = 0, step = 0.05
                      )
                    ),
                    column(
                      width = 6,
                      numericInput(inputId = "deVolcFDR", 
                                   label = "FDR value less than",
                                   value = 0.05, min = 0, max = 1, step = 0.01)
                    )
                  ),
                  fluidRow(
                    column(
                      width = 12,
                      materialSwitch("deVolcShowLabel", "Label Top DEG",
                                     value = TRUE, status = "success" )
                    )
                  ),
                  fluidRow(
                    column(
                      width = 6,
                      numericInput(inputId = "deVolcTopN", 
                                   label = "N top DEG to label",
                                   value = 10, min = 1, step = 1)
                    ),
                    column(
                      width = 6,
                      selectInput("deVolcFeatureDisplay",
                                  "Display ID Type",
                                  c("Rownames (Default)",
                                    featureChoice))
                    )
                  ),
                  fluidRow(
                    column(
                      width = 4,
                      style = 'margin-top: 23px;',
                      withBusyIndicatorUI(
                        actionBttn(
                          inputId = "dePlotVolcano",
                          label = "Update",
                          style = "bordered",
                          color = "primary",
                          size = "sm"
                        )
                      )
                    )
                  ),
                  inputId = "dropDownDeVolcano",
                  icon = icon("cog"),
                  status = "primary",
                  circle = FALSE,
                  inline = TRUE,
                  width = "500px"
                )
              ),
              column(
                width = 7,
                fluidRow(
                  h6(
                    "Volcano plots of all identified DEGs in the selected analysis. DEG with top Log2FC could be labeled. Colors indicates the regulation"),
                  align="center"
                )
              )
            ),
            hr(),
            br(),
            shinyjqui::jqui_resizable(plotOutput("deVolcanoPlot"))
          )
        ),
        tabPanel(
          "Violin Plot",
          panel(
            fluidRow(
              column(
                width = 4,
                dropdown(
                  fluidRow(
                    column(12,
                           fluidRow(actionBttn(inputId = "closeDropDownDeViolin", label = NULL, style = "simple", color = "danger", icon = icon("times"), size = "xs"), align = "right"),
                    )
                  ),
                  fluidRow(
                    div(style="display: inline-block;vertical-align:center; width: 100px;margin-left:10px",
                        p('Plot the top')),
                    div(style="display: inline-block;vertical-align:center; width: 60px;",
                        numericInput('deVioNRow', label = NULL, value = 3, min = 1)),
                    div(style="display: inline-block;vertical-align:center; width: 12px;",
                        p('x')),
                    div(style="display: inline-block;vertical-align:center; width: 60px;",
                        numericInput('deVioNCol', label = NULL, value = 3, min = 1)),
                    div(style="display: inline-block;vertical-align:center; width: 10px;",
                        p('=')),
                    div(style="display: inline-block;vertical-align:center; width: 30px;",
                        uiOutput('deVioTotalUI')),
                    div(style="display: inline-block;vertical-align:center; width: 50px;",
                        p('genes'))
                  ),
                  fluidRow(
                    column(
                      width = 6,
                      selectInput('deVioLabel', "Label features by",
                                  c("Rownames (Default)",
                                    featureChoice))
                    ),
                    column(
                      width = 4,
                      style = 'margin-top: 23px;',
                      withBusyIndicatorUI(
                        actionBttn(
                          inputId = "dePlotVio",
                          label = "Update",
                          style = "bordered",
                          color = "primary",
                          size = "sm"
                        )
                      )
                    )
                  ),
                  inputId = "dropDownDeViolin",
                  icon = icon("cog"),
                  status = "primary",
                  circle = FALSE,
                  inline = TRUE,
                  width = "500px"
                )
              ),
              column(
                width = 7,
                fluidRow(
                  h6(
                    "Violin plots of the expression of top DEGs in the selected analysis. The violin plot for each DEG will be grouped by the condition setting."),
                  align="center"
                )
              )
            ),
            hr(),
            br(),
            textOutput("deSanityWarnViolin"),
            shinyjqui::jqui_resizable(plotOutput("deViolinPlot"))
          ),

        ),
        tabPanel(
          "Linear Model",
          panel(

            fluidRow(
              column(
                width = 4,
                dropdown(
                  fluidRow(
                    column(12,
                           fluidRow(actionBttn(inputId = "closeDropDownDeReg", label = NULL, style = "simple", color = "danger", icon = icon("times"), size = "xs"), align = "right"),
                    )
                  ),
                  fluidRow(
                    div(style="display: inline-block;vertical-align:center; width: 100px;margin-left:10px",
                        p('Plot the top')),
                    div(style="display: inline-block;vertical-align:center; width: 60px;",
                        numericInput('deRegNRow', label = NULL, value = 3, min = 1)),
                    div(style="display: inline-block;vertical-align:center; width: 12px;",
                        p('x')),
                    div(style="display: inline-block;vertical-align:center; width: 60px;",
                        numericInput('deRegNCol', label = NULL, value = 3, min = 1)),
                    div(style="display: inline-block;vertical-align:center; width: 10px;",
                        p('=')),
                    div(style="display: inline-block;vertical-align:center; width: 30px;",
                        uiOutput('deRegTotalUI')),
                    div(style="display: inline-block;vertical-align:center; width: 50px;",
                        p('genes'))
                  ),
                  fluidRow(
                    column(
                      width = 6,
                      selectInput('deRegLabel', "Label features by",
                                  c("Rownames (Default)",
                                    featureChoice))
                    ),
                    column(
                      width = 4,
                      style = 'margin-top: 23px;',
                      withBusyIndicatorUI(
                        actionBttn(
                          inputId = "dePlotReg",
                          label = "Update",
                          style = "bordered",
                          color = "primary",
                          size = "sm"
                        )
                      )
                    )
                  ),
                  inputId = "dropDownDeReg",
                  icon = icon("cog"),
                  status = "primary",
                  circle = FALSE,
                  inline = TRUE,
                  width = "500px"
                )
              ),
              column(
                width = 7,
                fluidRow(
                  h6(
                    "Linear regression plots of the expression of top DEGs in the selected analysis. The regression plot for each DEG will be grouped by the condition setting."),
                  align="center"
                )
              )
            ),
            hr(),
            br(),
            textOutput("deSanityWarnReg"),
            shinyjqui::jqui_resizable(plotOutput("deRegPlot"))
          )
        )
      )
    )
  ),
  nonLinearWorkflowUI(id = "nlw-de")
)

