#' Alternative HTML themes
#'
#' @description kableExtra uses the built-in bootstrap themes by default in
#' `kable_styling()`. Alternatively, you can use a customized table themes for
#' your table. This `lightable` table style sheet comes with three formats,
#' namely `lightable-minimal`, `lightable-classic`, `lightable-material` and
#' `lightable-material-dark` with `hover` and `striped` options.
#'
#' @param kable_input A HTML kable object.
#' @param lightable_options Options to customize lightable. Similar with
#' `bootstrap_options` in `kable_styling`. Choices include `basic`, `striped`
#' and `hover`.
#' @param ... Everything else you need to specify in `kable_styling`.
#'
#' @export
kable_classic <- function(kable_input, lightable_options = "basic", ...) {
  kable_light(kable_input, "lightable-classic", lightable_options, ...)
}

#' @rdname kable_classic
#' @export
kable_classic_2 <- function(kable_input, lightable_options = "basic", ...) {
  kable_light(kable_input, "lightable-classic-2", lightable_options, ...)
}

#' @rdname kable_classic
#' @export
kable_minimal <- function(kable_input, lightable_options = "basic", ...) {
  kable_light(kable_input, "lightable-minimal", lightable_options, ...)
}

#' @rdname kable_classic
#' @export
kable_material <- function(kable_input, lightable_options = "basic", ...) {
  kable_light(kable_input, "lightable-material", lightable_options, ...)
}

#' @rdname kable_classic
#' @export
kable_material_dark <- function(kable_input, lightable_options = "basic", ...) {
  kable_light(kable_input, "lightable-material-dark", lightable_options, ...)
}

kable_light <- function(kable_input, light_class, lightable_options, ...) {
  lightable_options <- match.arg(lightable_options,
                                 choices = c("basic", "striped", "hover"),
                                 several.ok = TRUE)
  if ("striped" %in% lightable_options) {
    light_class <- paste(light_class, "lightable-striped")
  }
  if ("hover" %in% lightable_options) {
    light_class <- paste(light_class, "lightable-hover")
  }
  out <- kable_styling(kable_input, "none", lightable_class = light_class, ...)
  attr(out, "lightable") <- TRUE
  attr(out, "lightable_class") <- light_class
  return(out)
}
