#' Header Function
#'
#' This function create a header banner. For use at top of the screen
#' @param org_name Organisation name that goes in the header
#' @param service_name Service name to supplement the organisation name
#' @param logo Add a link to a logo which will apply in the header. Use crown to
#' use the crown SVG version on GOV UK
#' @param main_text `r lifecycle::badge("deprecated")` Use `org_name` instead
#' @param secondary_text `r lifecycle::badge("deprecated")` Use `service_name`
#' instead
#' @param main_link Add a link for clicking on main text
#' `r lifecycle::badge("deprecated")`
#' @param secondary_link Add a link for clicking on secondary
#' header `r lifecycle::badge("deprecated")`
#' @param logo_alt_text Add alternative text for the logo. Should be used when a
#' logo is used
#' @param main_alt_text Add alternative text for the main link. Should be used
#' when a main link is used `r lifecycle::badge("deprecated")`
#' @param secondary_alt_text Add alternative text for the secondary link. Should
#' be used when a secondary link is used `r lifecycle::badge("deprecated")`
#' @param logo_width Change the logo size width CSS to improve fit
#' @param logo_height Change the logo size height CSS to improve fit
#' @return a header HTML shiny tag object
#' @family Govstyle page structure
#' @export
#' @examples
#' ui <- shiny::fluidPage(
#'   shinyGovstyle::header(
#'     org_name = "Example",
#'     service_name = "User Examples",
#'     logo = "shinyGovstyle/images/moj_logo.png",
#'     logo_alt_text = "Ministry of Justice Logo"
#'   )
#' )
#'
#' server <- function(input, output, session) {}
#'
#' if (interactive()) shinyApp(ui = ui, server = server)
header <- function(
  org_name = "Shiny example app",
  service_name = NULL,
  logo = "shinyGovstyle/images/Dept_logo.svg",
  main_text = lifecycle::deprecated(),
  secondary_text = lifecycle::deprecated(),
  main_link = NULL,
  secondary_link = NULL,
  logo_alt_text = "Departmental logo",
  main_alt_text = NULL,
  secondary_alt_text = NULL,
  logo_width = 66,
  logo_height = 34
) {
  if (lifecycle::is_present(main_text)) {
    lifecycle::deprecate_warn(
      when = "0.2.0",
      what = "header(main_text)",
      with = "header(org_name)"
    )
    org_name <- main_text
  }

  if (lifecycle::is_present(secondary_text)) {
    lifecycle::deprecate_warn(
      when = "0.2.0",
      what = "header(secondary_text)",
      with = "header(service_name)"
    )
    service_name <- secondary_text
  }

  # checks for alt text
  if (!is.null(logo) && is.null(logo_alt_text)) {
    warning(
      paste(
        "Please use logo_alt_text to provide alternative",
        "text for the logo you used."
      )
    )
  }

  if (lifecycle::is_present(main_link)) {
    lifecycle::deprecate_warn(
      when = "0.2.0",
      what = "header(main_link)",
      details = "main_link will be dropped in v1.0.0"
    )
  }

  if (lifecycle::is_present(main_alt_text)) {
    lifecycle::deprecate_warn(
      when = "0.2.0",
      what = "header(main_alt_text)",
      details = "main_alt_text will be dropped in v1.0.0"
    )
  }

  if (lifecycle::is_present(secondary_alt_text)) {
    lifecycle::deprecate_warn(
      when = "0.2.0",
      what = "header(secondary_alt_text)",
      details = "secondary_alt_text will be dropped in v1.0.0"
    )
  }

  if (lifecycle::is_present(secondary_link)) {
    lifecycle::deprecate_warn(
      when = "0.2.0",
      what = "header(secondary_link)",
      details = "secondary_link will be dropped in v1.0.0"
    )
  }

  gov_header <- shiny::tags$header(
    class = "govuk-header",
    role = "banner",
    shinyjs::inlineCSS(paste0(
      ".govuk-header__logotype-crown-fallback-image {width: ",
      logo_width,
      "px;
      height: ",
      logo_height,
      "px;}",
      ".govuk-header__link:focus .govuk-header__logotype-crown-fallback-image",
      ", .govuk-header__link:active .govuk-header__logotype-crown-fallback-",
      "image {filter: invert(1);}"
    )),
    shiny::tags$div(
      class = "govuk-header__container govuk-width-container",
      shiny::tags$div(
        class = "govuk-header__logo",
        shiny::tags$span(
          shiny::tags$span(
            class = "govuk-header__logotype",
            if (!is.null(logo) && logo == "crown") {
              shiny::tags$svg(
                `aria-hidden` = "true",
                focusable = "false",
                class = "govuk-header__logotype-crown",
                xmlns = "http://www.w3.org/2000/svg",
                viewBox = "0 0 132 97",
                height = "30",
                width = "36",
                shiny::tags$path(
                  fill = "currentColor",
                  `fill-rule` = "evenodd",
                  d = paste0(
                    "M25 30.2c3.5 1.5 7.7-.2 9.1-3.7 1.5-3.6-.2-7.8-3.9-9.2-3",
                    ".6-1.4-7.6.3-9.1 3.9-1.4 3.5.3 7.5 3.9 9zM9 39.5c3.6 1.5",
                    " 7.8-.2 9.2-3.7 1.5-3.6-.2-7.8-3.9-9.1-3.6-1.5-7.6.2-9.1",
                    " 3.8-1.4 3.5.3 7.5 3.8 9zM4.4 57.2c3.5 1.5 7.7-.2 9.1-3.",
                    "8 1.5-3.6-.2-7.7-3.9-9.1-3.5-1.5-7.6.3-9.1 3.8-1.4 3.5.3",
                    " 7.6 3.9 9.1zm38.3-21.4c3.5 1.5 7.7-.2 9.1-3.8 1.5-3.6-.",
                    "2-7.7-3.9-9.1-3.6-1.5-7.6.3-9.1 3.8-1.3 3.6.4 7.7 3.9 9.",
                    "1zm64.4-5.6c-3.6 1.5-7.8-.2-9.1-3.7-1.5-3.6.2-7.8 3.8-9.",
                    "2 3.6-1.4 7.7.3 9.2 3.9 1.3 3.5-.4 7.5-3.9 9zm15.9 9.3c-",
                    "3.6 1.5-7.7-.2-9.1-3.7-1.5-3.6.2-7.8 3.7-9.1 3.6-1.5 7.7",
                    ".2 9.2 3.8 1.5 3.5-.3 7.5-3.8 9zm4.7 17.7c-3.6 1.5-7.8-.",
                    "2-9.2-3.8-1.5-3.6.2-7.7 3.9-9.1 3.6-1.5 7.7.3 9.2 3.8 1.",
                    "3 3.5-.4 7.6-3.9 9.1zM89.3 35.8c-3.6 1.5-7.8-.2-9.2-3.8-",
                    "1.4-3.6.2-7.7 3.9-9.1 3.6-1.5 7.7.3 9.2 3.8 1.4 3.6-.3 7",
                    ".7-3.9 9.1zM69.7 17.7l8.9 4.7V9.3l-8.9 2.8c-.2-.3-.5-.6-",
                    ".9-.9L72.4 0H59.6l3.5 11.2c-.3.3-.6.5-.9.9l-8.8-2.8v13.1",
                    "l8.8-4.7c.3.3.6.7.9.9l-5 15.4v.1c-.2.8-.4 1.6-.4 2.4 0 4",
                    ".1 3.1 7.5 7 8.1h.2c.3 0 .7.1 1 .1.4 0 .7 0 1-.1h.2c4-.6",
                    " 7.1-4.1 7.1-8.1 0-.8-.1-1.7-.4-2.4V34l-5.1-15.4c.4-.2.7",
                    "-.6 1-.9zM66 92.8c16.9 0 32.8 1.1 47.1 3.2 4-16.9 8.9-26",
                    ".7 14-33.5l-9.6-3.4c1 4.9 1.1 7.2 0 10.2-1.5-1.4-3-4.3-4",
                    ".2-8.7L108.6 76c2.8-2 5-3.2 7.5-3.3-4.4 9.4-10 11.9-13.6",
                    " 11.2-4.3-.8-6.3-4.6-5.6-7.9 1-4.7 5.7-5.9 8-.5 4.3-8.7-",
                    "3-11.4-7.6-8.8 7.1-7.2 7.9-13.5 2.1-21.1-8 6.1-8.1 12.3-",
                    "4.5 20.8-4.7-5.4-12.1-2.5-9.5 6.2 3.4-5.2 7.9-2 7.2 3.1-",
                    ".6 4.3-6.4 7.8-13.5 7.2-10.3-.9-10.9-8-11.2-13.8 2.5-.5 ",
                    "7.1 1.8 11 7.3L80.2 60c-4.1 4.4-8 5.3-12.3 5.4 1.4-4.4 8",
                    "-11.6 8-11.6H55.5s6.4 7.2 7.9 11.6c-4.2-.1-8-1-12.3-5.4l",
                    "1.4 16.4c3.9-5.5 8.5-7.7 10.9-7.3-.3 5.8-.9 12.8-11.1 13",
                    ".8-7.2.6-12.9-2.9-13.5-7.2-.7-5 3.8-8.3 7.1-3.1 2.7-8.7-",
                    "4.6-11.6-9.4-6.2 3.7-8.5 3.6-14.7-4.6-20.8-5.8 7.6-5 13.",
                    "9 2.2 21.1-4.7-2.6-11.9.1-7.7 8.8 2.3-5.5 7.1-4.2 8.1.5.",
                    "7 3.3-1.3 7.1-5.7 7.9-3.5.7-9-1.8-13.5-11.2 2.5.1 4.7 1.",
                    "3 7.5 3.3l-4.7-15.4c-1.2 4.4-2.7 7.2-4.3 8.7-1.1-3-.9-5.",
                    "3 0-10.2l-9.5 3.4c5 6.9 9.9 16.7 14 33.5 14.8-2.1 30.8-3",
                    ".2 47.7-3.2z"
                  )
                )
              )
            } else if (!is.null(logo)) {
              shiny::tags$img(
                src = logo,
                class = "govuk-header__logotype-crown-fallback-image",
                alt = logo_alt_text
              )
            },
            shiny::tags$span(org_name, class = "govuk-header__product-name")
          )
        )
      ),
      if (!is.null(service_name)) {
        shiny::tags$div(
          class = "govuk-header__content",
          shiny::tags$span(service_name, class = "govuk-header__service-name")
        )
      }
    )
  )

  header_css <- htmltools::htmlDependency(
    name = "header",
    version = as.character(utils::packageVersion("shinyGovstyle")[[1]]),
    src = c(href = "shinyGovstyle/css"),
    stylesheet = "header-overrides.css"
  )

  htmltools::attachDependencies(
    attachDependency(gov_header), # nolint
    header_css,
    append = TRUE
  )
}
