# Test .process_config ---------------------------------------------------------

test_that("error if config file doesn't exist", {

  expect_error(
    generate_workbook(
      as_aftable(demo_df),
      author = NULL,
      title = NULL,
      keywords = NULL,
      config_path = testthat::test_path("configs/DOES_NOT_EXIST.yaml"),
      config_name = NULL
    ),
    "DOES_NOT_EXIST.yaml does not exist"
  )

})

test_that("error if config doesn't have aftables key", {

  expect_error(
    generate_workbook(
      as_aftable(demo_df),
      author = NULL,
      title = NULL,
      keywords = NULL,
      config_path = testthat::test_path("configs/test_missing_aftable_config.yaml"),
      config_name = NULL
    ),
    "does not contain an aftables key"
  )

})

test_that("error if default is missing and not using custom key", {

  expect_error(
    generate_workbook(
      as_aftable(demo_df),
      author = NULL,
      title = NULL,
      keywords = NULL,
      config_path = testthat::test_path("configs/test_missing_default_config.yaml"),
      config_name = NULL
    ),
    "does not contain a default aftables configuration and a custom key is not being used"
  )

})

test_that("error if default config not a named list", {

  expect_error(
    generate_workbook(
      as_aftable(demo_df),
      config_path = testthat::test_path("configs/test_wrong_default.yaml")
    ),
    "Default configuration key must be a named list. It can only contain keys `workbook_properties` and `workbook_format`."
  )

  expect_error(
    generate_workbook(
      as_aftable(demo_df),
      config_path = testthat::test_path("configs/test_wrong_default2.yaml")
    ),
    "Default configuration key must be a named list. It can only contain keys `workbook_properties` and `workbook_format`."
  )

})

test_that("error if default workbook properties is not a named list", {

  expect_error(
    generate_workbook(
      as_aftable(demo_df),
      config_path = testthat::test_path("configs/test_wrong_default3.yaml")
    ),
    "Default configuration workbook_properties must be a named list"
  )

})

test_that("error if default workbook format is not a named list", {

  expect_error(
    generate_workbook(
      as_aftable(demo_df),
      config_path = testthat::test_path("configs/test_wrong_default4.yaml")
    ),
    "Default configuration workbook_format must be a named list"
  )

})

test_that("error if aftables cannot find custom config requested by user", {

  expect_error(
    generate_workbook(
      as_aftable(demo_df),
      config_path = testthat::test_path("configs/test_config.yaml"),
      config_name = "MISSING_custom"
    ),
    "does not contain key `MISSING_custom`"
  )

})

test_that("error if custom config not a named list", {

  expect_error(
    generate_workbook(
      as_aftable(demo_df),
      config_path = testthat::test_path("configs/test_wrong_custom.yaml"),
      config_name = "custom"
    ),
    "Configuration key custom must be a named list. It can only contain keys `workbook_properties` and `workbook_format`."
  )

  expect_error(
    generate_workbook(
      as_aftable(demo_df),
      config_path = testthat::test_path("configs/test_wrong_custom2.yaml"),
      config_name = "custom"
    ),
    "Configuration key custom must be a named list. It can only contain keys `workbook_properties` and `workbook_format`."
  )

})

test_that("error if custom workbook properties is not a named list", {

  expect_error(
    generate_workbook(
      as_aftable(demo_df),
      config_path = testthat::test_path("configs/test_wrong_custom3.yaml"),
      config_name = "custom"
    ),
    "Custom configuration workbook_properties must be a named list"
  )

})

test_that("error if custom workbook format is not a named list", {

  expect_error(
    generate_workbook(
      as_aftable(demo_df),
      config_path = testthat::test_path("configs/test_wrong_custom4.yaml"),
      config_name = "custom"
    ),
    "Custom configuration workbook_format must be a named list"
  )

})

test_that(".process_config correctly combines config options", {

  # User + default + custom config ---------------------------------------------

  user_config <- list(
    workbook_properties = list(
      author = "user author",
      title = NULL,
      keywords = c("user", "keywords")
    ),
    workbook_format = list()
  )

  config <- .process_config(
    user_config = user_config,
    config_path = testthat::test_path("configs/test_valid_config.yaml"),
    config_name = "custom"
  )

  expected_config <- list(
    workbook_properties = list(
      author = "user author",
      title = "default config title",
      keywords = c("user", "keywords"),
      subject = "default config subject",
      category = "default config category",
      comments = "default config comments"
    ),
    workbook_format = list(
      base_font_name = "default font",
      base_font_size = 1,
      table_header_size = 1,
      sheet_subheading_size = 26,
      sheet_heading_size = 50,
      cellwidth_default = 1,
      cellwidth_wider = 1,
      nchar_break = 1
    )
  )

  expect_equal(config, expected_config)


  # User + default config ------------------------------------------------------

  config_default <- .process_config(
    user_config = user_config,
    config_path = testthat::test_path("configs/test_valid_config.yaml"),
    config_name = NULL
  )

  expected_config_default <- list(
    workbook_properties = list(
      author = "user author",
      title = "default config title",
      keywords = c("user", "keywords"),
      subject = "default config subject",
      category = "default config category",
      comments = "default config comments"
    ),
    workbook_format = list(
      base_font_name = "default font",
      base_font_size = 1,
      table_header_size = 1,
      sheet_subheading_size = 1,
      sheet_heading_size = 1,
      cellwidth_default = 1,
      cellwidth_wider = 1,
      nchar_break = 1
    )
  )

  expect_equal(config_default, expected_config_default)


  # Custom config only ---------------------------------------------------------

  config_custom <- .process_config(
    user_config = list(workbook_properties = list(), workbook_format = list()),
    config_path = testthat::test_path("configs/test_valid_config2.yaml"),
    config_name = "custom"
  )

  expected_config_custom <- list(
    workbook_properties = list(
      author = "custom config author",
      title = "custom config title",
      keywords = c("customconfig1", "customconfig2")
    ),
    workbook_format = list(
      sheet_subheading_size = 26,
      sheet_heading_size = 50
    )
  )

  expect_equal(config_custom, expected_config_custom)


  # user only ------------------------------------------------------------------
  # this test needs title to be set to avoid recommended properties warning
  user_config <- list(
    workbook_properties = list(
      author = "user author",
      title = "user title",
      keywords = c("user", "keywords")
    ),
    workbook_format = list()
  )

  config_user <- .process_config(
    user_config = user_config,
    config_path = NULL,
    config_name = NULL
  )

  expected_config_user <- list(
    workbook_properties = list(
      author =  "user author",
      title =  "user title",
      keywords = c("user", "keywords")
    ),
    workbook_format = list()
  )

  expect_equal(config_user, expected_config_user)

})

test_that("warnings for config file with identical values to example config", {

  expect_warning(
    generate_workbook(
      as_aftable(demo_df),
      config_path = testthat::test_path("configs/test_same_config.yaml")
    ),
    "Your config file contains values identical to the aftables example config. Please check your config file."
  )

})


# Test .validate_config --------------------------------------------------------

test_that("error when config entries have invalid names or in wrong place", {

  expect_warning(
    generate_workbook(
      as_aftable(demo_df),
      config_path = testthat::test_path("configs/test_wrong_config.yaml")
    ),
    "Some entries in your config file could not be processed."
  )

})

test_that("error when entries apart from keywords have more than 1 value", {

  expect_error(
    generate_workbook(
      as_aftable(demo_df),
      config_path = testthat::test_path("configs/test_wrong_lengths_config.yaml"),
      config_name = "wrong-lengths"
    ),
    "Config entries must contain only one value apart from keywords. Please check your config file."
  )
})

test_that("error when values in config.yaml are wrong datatype (character/numeric/list)", {

  expect_error(
    generate_workbook(
      as_aftable(demo_df),
      config_path = testthat::test_path("configs/test_wrong_datatypes_config.yaml"),
      config_name = "wrong-datatypes"
    ),
    "Please review the following invalid config entries"
  )

})

test_that("Warn users when they haven't provided AF recommended workbook properties", {

  # Warn if config from file is missing recommended entries
  expect_warning(
    generate_workbook(
      as_aftable(demo_df),
      author = "aftables test",
      config_path = testthat::test_path("configs/test_missing_arguments_config.yaml")
    ),
    "Some of the recommended workbook properties are missing. Analysis Function guidance recommends completing the author, title and keywords fields."
  )

  # Warn if user does not provide all recommended arguments
  expect_warning(
    generate_workbook(
      as_aftable(demo_df),
      author = "aftables test",
      config_path = NULL
    ),
    "Some of the recommended workbook properties are missing. Analysis Function guidance recommends completing the author, title and keywords fields."
  )

})
