# function to lookup reveal resource
reveal_resources <- function(...) {
  system.file("rmarkdown/templates/revealjs_presentation/resources",
              ...,
              package = "revealjs.ids")
}


revealjs_lib_path <- function(...) {
  pkg <- system.file(package = "revealjs.ids")
  lib_folder <- list.files(pkg, pattern = "reveal.js-")[1]
  system.file(lib_folder, ..., package = "revealjs.ids")
}

revealjs_version <- function() {
  as.numeric_version(gsub(".*reveal\\.js-(.*)$", "\\1", revealjs_lib_path()))
}

# Convert boolean from R to JS boolean
jsbool <- function(value) ifelse(value, "true", "false")

# transfrom reveal option as pandoc variable
process_reveal_option <- function(option, value) {
  if (is.logical(value)) {
    value <- jsbool(value)
  } else if (is.character(value)) {
    # Special handling for some vector options 
    if (
      # chalkboard plugin options
      # e.g: color: [ 'rgba(0,0,255,1)', 'rgba(255,255,255,0.5)' ]
      grepl("chalkboard-(background|draw)", option)
      # e.g autoAnimateStyles: ['opacity','color']
      || grepl("autoAnimateStyles", option)
    ) {
      if (length(value) > 1 || !grepl("^\\[.*\\]$", value)) {
        value <- sprintf("[%s]", paste(paste0("'", value, "'"), collapse = ", "))
      }
    }
    # Add quotes around some config that can be several type
    # like number or percent unit or slideNumber = true or slideNumber = 'c/t'
    if (
      option %in% c("slideNumber") ||
      (option %in% c("width", "height") && grepl("%$", value))) {
      value <- paste0("'", value, "'")
    }
  }
  pandoc_variable_arg(option, value)
}

# Resolve a logo image (yaml entries `partner_logo` / `funder_logo`) to a URL
# usable inside CSS: http(s) and data URLs pass through unchanged, local
# files are inlined as base64 data URIs. Inlining is required: CSS background
# URLs would resolve relative to the theme stylesheet, and document-relative
# files would be left behind when the rendered html is deployed elsewhere.
logo_uri <- function(path) {
  if (grepl("^(https?|data):", path)) {
    return(path)
  }
  if (!file.exists(path)) {
    stop("Logo file not found: ", path, call. = FALSE)
  }
  ext <- tolower(tools::file_ext(path))
  mime <- switch(ext,
    svg = "image/svg+xml", png = "image/png", jpg = , jpeg = "image/jpeg",
    gif = "image/gif", webp = "image/webp",
    stop("Unsupported logo format '", ext, "' (use svg, png, jpg, gif or webp)",
      call. = FALSE
    )
  )
  if (!requireNamespace("base64enc", quietly = TRUE)) {
    stop("Package \"base64enc\" needed to embed local logo files. Please install it.",
      call. = FALSE
    )
  }
  sprintf("data:%s;base64,%s", mime, base64enc::base64encode(path))
}

#' HTML code for a linked QR code
#'
#' Generates a QR code (inline SVG) linking to the given URL and returns the
#' corresponding HTML code, so a QR code can be placed anywhere in a
#' presentation with inline R code.
#'
#' The `website` YAML entry of [revealjs_presentation()] uses this to
#' place a linked QR code in the top left of the title slide.
#'
#' @param url Target URL for the QR code
#' @param logo Optional path to a logo image to place in the center of the QR
#'   code
#' @param text Optional caption displayed below the QR code (alias:
#'   `caption`)
#' @param caption Alias for `text`
#' @return Character string with HTML code for a linked QR code
#' @export
qrlink <- function(url, logo = NULL, text = NULL, caption = text) {
  if (!requireNamespace("qrcode", quietly = TRUE)) {
    stop("Package \"qrcode\" needed to generate QR codes. Please install it.",
      call. = FALSE
    )
  }
  tmp <- tempfile(fileext = ".svg")
  qrcode <- qrcode::qr_code(url, ecl = if (is.null(logo)) "L" else "H")
  if (!is.null(logo)) {
    qrcode <- qrcode::add_logo(qrcode, logo, ecl = "L")
  }
  qrcode::generate_svg(qrcode, tmp, show = FALSE)

  cap_html <- if (!is.null(caption) && nchar(trimws(caption)) > 0) {
    sprintf('<span class="qrcode-caption">%s</span>', caption)
  } else {
    ""
  }

  svg <- gsub("\r?\n|\r", "", readChar(tmp, 1e7))
  qr <- sprintf('<a class="qrcode" href="%s">%s</a>', url, svg)
  if (nchar(cap_html) > 0) {
    paste0('<div class="qrcode-container">', qr, cap_html, "</div>")
  } else {
    qr
  }
}
