#' ggplot2 theme wrapper with fonts and colors
#'
#' @param font_family The font family for all plot's texts. Default to "Segoe UI".
#' @param title_size The size of the title. Defaults to 12.
#' @param title_color Title color.
#' @param title_font_face Title font face. Default to "bold". Font face ("plain", "italic", "bold", "bold.italic").
#' @param title_hjust Title horizontal justification. Default to NULL. Use 0.5 to center the title.
#' @param title_font_family Title font family. Default to "Roboto Condensed".
#' @param text_size The size of all text other than the title, subtitle and caption. Defaults to 10.
#' @param text_color Text color.
#' @param text_font_face Text font face. Default to "bold". Font face ("plain", "italic", "bold", "bold.italic").
#' @param panel_background_color The color for the panel background color. Default to white.
#' @param panel_border Boolean. Plot a panel border? Default to FALSE.
#' @param panel_border_color A color. Default to REACH main grey.
#' @param legend_position Position of the legend; Default to "right". Can take "right", "left", "top", "bottom" or "none".
#' @param legend_direction Direction of the legend. Default to "vertical". Can take "vertical" or "horizontal".
#' @param legend_justification In addition to legend_direction, place the legend. Can take "left", "bottom", "center", "right", "top".
#' @param legend_title_size Legend title size.
#' @param legend_title_color Legend title color.
#' @param legend_title_font_face Legend title font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
#' @param legend_text_size Legend text size.
#' @param legend_text_color Legend text color.
#' @param legend_text_font_face Legend text font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
#' @param legend_reverse Reverse the color in the guide? Default to TRUE.
#' @param title_size The size of the legend title. Defaults to 11.
#' @param title_color Legend title color.
#' @param title_font_face Legend title font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
#' @param title_position_to_plot TRUE or FALSE. Positioning to plot or to panel?
#' @param axis_x Boolean. Do you need x-axis?
#' @param axis_y Boolean. Do you need y-axis?
#' @param axis_text_size Axis text size.
#' @param axis_text_color Axis text color.
#' @param axis_text_font_face Axis text font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
#' @param axis_text_x Boolean. Do you need the text for the x-axis?
#' @param axis_line_x Boolean. Do you need the line for the x-axis?
#' @param axis_ticks_x Boolean. Do you need the line for the x-axis?
#' @param axis_text_x_angle Angle for the x-axis text.
#' @param axis_text_x_vjust Vertical adjustment for the x-axis text.
#' @param axis_text_x_hjust Vertical adjustment for the x-axis text.
#' @param axis_text_y Boolean. Do you need the text for the y-axis?
#' @param axis_line_y Boolean. Do you need the line for the y-axis?
#' @param axis_ticks_y Boolean. Do you need the line for the y-axis?
#' @param axis_title_size Axis title size.
#' @param axis_title_color Axis title color.
#' @param axis_title_font_face Axis title font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
#' @param grid_major_x Boolean. Do you need major grid lines for x-axis?
#' @param grid_major_y Boolean. Do you need major grid lines for y-axis?
#' @param grid_major_x_size Major X line size.
#' @param grid_major_y_size Major Y line size.
#' @param grid_major_color Major grid lines color.
#' @param grid_minor_x Boolean. Do you need minor grid lines for x-axis?
#' @param grid_minor_y Boolean. Do you need minor grid lines for y-axis?
#' @param grid_minor_x_size Minor X line size.
#' @param grid_minor_y_size Minor Y line size.
#' @param grid_minor_color Minor grid lines color.
#' @param caption_position_to_plot TRUE or FALSE. Positioning to plot or to panel?
#' @param ... Additional arguments passed to [ggplot2::theme()].
#'
#'
#' @description Give some reach colors and fonts to a ggplot.
#'
#' @export
theme_default <- function(
  title_font_family = "Carlito",
  title_size = 20,
  title_color = color("dark_grey"),
  title_font_face = "bold",
  title_hjust = NULL,
  title_position_to_plot = TRUE,
  subtitle_font_family = "Carlito",
  subtitle_size = 16,
  subtitle_color = color("dark_grey"),
  subtitle_font_face = "plain",
  subtitle_hjust = NULL,
  text_font_family = "Carlito",
  text_size = 14,
  text_color = color("dark_grey"),
  text_font_face = "plain",
  panel_background_color = "#FFFFFF",
  panel_border = FALSE,
  panel_border_color = color("dark_grey"),
  legend_position = "top",
  legend_direction = "horizontal",
  legend_justification = "center",
  legend_reverse = TRUE,
  legend_title_size = 14,
  legend_title_color = color("dark_grey"),
  legend_title_font_face = "plain",
  legend_title_font_family = "Carlito",
  legend_text_size = 14,
  legend_text_color = color("dark_grey"),
  legend_text_font_face = "plain",
  legend_text_font_family = "Carlito",
  facet_size = 15,
  facet_color = color("dark_grey"),
  facet_font_face = "bold",
  facet_font_family = "Carlito",
  facet_bg_color = color("lighter_grey"),
  axis_x = TRUE,
  axis_y = TRUE,
  axis_text_x = TRUE,
  axis_line_x = FALSE,
  axis_ticks_x = FALSE,
  axis_text_y = TRUE,
  axis_line_y = TRUE,
  axis_ticks_y = TRUE,
  axis_text_font_family = "Carlito",
  axis_text_size = 14,
  axis_text_color = color("dark_grey"),
  axis_text_font_face = "plain",
  axis_title_size = 15,
  axis_title_color = color("dark_grey"),
  axis_title_font_face = "plain",
  axis_text_x_angle = 0,
  axis_text_x_vjust = 0.5,
  axis_text_x_hjust = 0.5,
  grid_major_x = TRUE,
  grid_major_y = FALSE,
  grid_major_color = color("dark_grey"),
  grid_major_x_size = 0.1,
  grid_major_y_size = 0.1,
  grid_minor_x = TRUE,
  grid_minor_y = FALSE,
  grid_minor_color = color("dark_grey"),
  grid_minor_x_size = 0.05,
  grid_minor_y_size = 0.05,
  caption_font_family = "Carlito",
  caption_font_face = "plain",
  caption_position_to_plot = TRUE,
  caption_size = 12,
  caption_color = color("dark_grey"),
  ...
) {
  # Basic simple theme
  theme <- ggplot2::theme_minimal()

  theme <- theme +
    ggplot2::theme(
      # # Text - design
      text = ggplot2::element_text(
        family = text_font_family,
        color = text_color,
        size = text_size,
        face = text_font_face
      ),
      # Default legend to right position
      legend.position = legend_position,
      # Defaut legend to vertical direction
      legend.direction = legend_direction,
      # Text sizes
      axis.text = ggplot2::element_text(
        size = axis_text_size,
        family = axis_text_font_family,
        face = axis_text_font_face,
        color = axis_text_color
      ),
      axis.title = ggplot2::element_text(
        size = axis_title_size,
        family = axis_text_font_family,
        face = axis_title_font_face,
        color = axis_title_color
      ),
      # # Wrap title
      plot.title = ggtext::element_textbox_simple(
        hjust = title_hjust,
        family = title_font_family,
        color = title_color,
        size = title_size,
        face = title_font_face,
        width = grid::unit(0.9, "npc"),
        margin = ggplot2::margin(b = 10)
      ),
      plot.subtitle = ggtext::element_textbox_simple(
        hjust = title_hjust,
        family = subtitle_font_family,
        color = subtitle_color,
        size = subtitle_size,
        face = subtitle_font_face,
        margin = ggplot2::margin(t = 5, b = 10)
      ),
      plot.caption = ggtext::element_textbox_simple(
        size = caption_size,
        face = caption_font_face,
        family = caption_font_family,
        color = caption_color,
        margin = ggplot2::margin(t = 10)
      ),
      legend.title = ggplot2::element_text(
        size = legend_title_size,
        face = legend_title_font_face,
        family = legend_title_font_family,
        color = legend_title_color
      ),
      legend.text = ggplot2::element_text(
        size = legend_text_size,
        face = legend_text_font_face,
        family = legend_text_font_family,
        color = legend_text_color
      ),
      axis.text.x = ggplot2::element_text(
        angle = axis_text_x_angle,
        vjust = axis_text_x_vjust,
        hjust = axis_text_x_hjust
      )
    )

  # Position of title
  if (title_position_to_plot) {
    theme <- theme +
      ggplot2::theme(
        plot.title.position = "plot"
      )
  }

  if (caption_position_to_plot) {
    theme <- theme +
      ggplot2::theme(
        plot.caption.position = "plot"
      )
  }
  # Position of caption

  # Axis lines ?
  if (axis_x & axis_y) {
    theme <- theme +
      ggplot2::theme(
        axis.line = ggplot2::element_line(color = text_color)
      )
  }

  if (!axis_x) {
    theme <- theme +
      ggplot2::theme(
        axis.line.x = ggplot2::element_blank(),
        axis.ticks.x = ggplot2::element_blank(),
        axis.text.x = ggplot2::element_blank()
      )
  }

  if (!axis_y) {
    theme <- theme +
      ggplot2::theme(
        axis.line.y = ggplot2::element_blank(),
        axis.ticks.y = ggplot2::element_blank(),
        axis.text.y = ggplot2::element_blank()
      )
  }

  if (!axis_line_x) {
    theme <- theme +
      ggplot2::theme(
        axis.line.x = ggplot2::element_blank()
      )
  }

  if (!axis_ticks_x) {
    theme <- theme +
      ggplot2::theme(
        axis.ticks.x = ggplot2::element_blank()
      )
  }

  if (!axis_text_x) {
    theme <- theme +
      ggplot2::theme(
        axis.text.x = ggplot2::element_blank()
      )
  }

  if (!axis_line_y) {
    theme <- theme +
      ggplot2::theme(
        axis.line.y = ggplot2::element_blank()
      )
  }

  if (!axis_ticks_y) {
    theme <- theme +
      ggplot2::theme(
        axis.ticks.y = ggplot2::element_blank()
      )
  }

  if (!axis_text_y) {
    theme <- theme +
      ggplot2::theme(
        axis.text.y = ggplot2::element_blank()
      )
  }

  # X - major grid lines
  if (!grid_major_x) {
    theme <- theme +
      ggplot2::theme(
        panel.grid.major.x = ggplot2::element_blank()
      )
  } else {
    theme <- theme +
      ggplot2::theme(
        panel.grid.major.x = ggplot2::element_line(
          color = grid_major_color,
          linewidth = grid_major_x_size
        )
      )
  }

  # Y - major grid lines
  if (!grid_major_y) {
    theme <- theme +
      ggplot2::theme(
        panel.grid.major.y = ggplot2::element_blank()
      )
  } else {
    theme <- theme +
      ggplot2::theme(
        panel.grid.major.y = ggplot2::element_line(
          color = grid_major_color,
          linewidth = grid_major_y_size
        )
      )
  }

  # X - minor grid lines
  if (!grid_minor_x) {
    theme <- theme +
      ggplot2::theme(
        panel.grid.minor.x = ggplot2::element_blank()
      )
  } else {
    theme <- theme +
      ggplot2::theme(
        panel.grid.minor.x = ggplot2::element_line(
          color = grid_minor_color,
          linewidth = grid_minor_x_size
        )
      )
  }

  # Y - minor grid lines
  if (!grid_minor_y) {
    theme <- theme +
      ggplot2::theme(
        panel.grid.minor.y = ggplot2::element_blank()
      )
  } else {
    theme <- theme +
      ggplot2::theme(
        panel.grid.minor.y = ggplot2::element_line(
          color = grid_minor_color,
          linewidth = grid_minor_y_size
        )
      )
  }
  if (!panel_border) {
    theme <- theme +
      ggplot2::theme(
        panel.border = ggplot2::element_blank()
      )
  } else {
    theme <- theme +
      ggplot2::theme(
        panel.border = ggplot2::element_rect(color = panel_background_color)
      )
  }

  # Add facet title text size
  theme <- theme +
    ggplot2::theme(
      strip.text = ggplot2::element_text(
        size = facet_size,
        family = facet_font_family,
        face = facet_font_face,
        color = facet_color
      ),
      strip.background = ggplot2::element_rect(
        fill = facet_bg_color,
        linewidth = 0
      )
    )

  # Other parameters
  theme <- theme + ggplot2::theme(...)

  return(theme)
}
