argumentsDataUI <- function(id) {
  # Create a namespace function using the provided id
  ns <- NS(id)
  
  #UI Definition
  column(
    width=3,
    conditionalPanel(
      condition = "input.arg == 'yes'",
      h3("Parameters"),
      wellPanel(fluidRow(
        column(
          12,
          selectInput(ns("method"), "Choose method:",
                      choices = methodChoices),
          selectInput(ns("kcdf"), "Choose kcdf:",
                      c("Gaussian","Poisson","none")),
          radioButtons(ns("absRanking"), "abs.ranking:",
                       c("False" = FALSE,
                         "True" = TRUE)),
          numericInput(ns("minSz"),"min.sz:", value = 1),
          numericInput(ns("maxSz"),"max.sz (Write 0 for infinite):", value = 0),
          radioButtons(ns("mxDiff"), "mx.diff:",
                       c("True" = TRUE,
                         "False" = FALSE)),
          numericInput(ns("tau"),"tau:", value = 1),
          radioButtons(ns("ssgseaNorm"), "ssgsea.norm:",
                       c("True" = TRUE,
                         "False" = FALSE))
        )))
    )
  )
}

argumentsDataServer <- function(id){
  moduleServer(id, function(input, output, session){
    
    observeEvent(input$method, {
      toggleElement("kcdf", condition = input$method %in% c("gsva", "ssgsea"))
      toggleElement("absRanking", condition = input$method %in% c("gsva", "ssgsea"))
      toggleElement("ssgseaNorm", condition = input$method %in% "ssgsea")
      toggleElement("mxDiff", condition = input$method %in% "gsva")
      toggleElement("tau", condition = input$method %in% c("gsva", "ssgsea"))
      
      if(input$method == "gsva"){
        updateNumericInput(inputId = "tau", value = 1)
      } else {
        updateNumericInput(inputId = "tau", value = 0.25)
      }
      
      if(input$method %in% c("zscore", "plage")){
        updateSelectInput(inputId = "kcdf", selected = "Gaussian")
      }
      
    })
    
    #"absRanking", "ssgseaNorm", "mxDiff", "tau"
    varMinsz <-  reactive({
      validate(need(!is.na(input$minSz), "Value 'min.sz' cannot be empty and must be an integer value"))
      input$minSz })
    varMaxsz <- reactive({
      validate(need(!is.na(input$maxSz), "Value 'max.sz' cannot be empty and must be an integer value"))
      ifelse(input$maxSz==0, Inf, input$maxSz) })
    selectedTau <-  reactive({
      if(input$method %in% c("gsva", "ssgsea")){
        validate(need(!is.na(input$tau), "Value 'tau' cannot be empty and must be an integer value"))
        input$tau
      } else {
        NULL
      }
    })
    method <-  reactive({ input$method })
    kcdf <-  reactive({ input$kcdf })
    absRanking <-   reactive({ as.logical(input$absRanking) })
    mxDiff <-   reactive({ as.logical(input$mxDiff) })
    ssgseaNorm <-  reactive({ as.logical(input$ssgseaNorm) })
    
    return(list(
      varMinsz = varMinsz,
      varMaxsz = varMaxsz,
      selectedTau = selectedTau,
      method = method,
      kcdf = kcdf,
      absRanking = absRanking,
      mxDiff = mxDiff,
      ssgseaNorm = ssgseaNorm
    ))
  })
}