# =============================================================================
# Tests for v0.9.88 -- load_wosis_stratified_sample() now aliases
# site$wosis_rsg -> site$reference_wrb so generic benchmark loops
# (which read p$site$reference_wrb a la KSSL / AfSP / Redape) work
# off-the-shelf on the bundled WoSIS sample.
# =============================================================================


test_that("v0.9.88: load_wosis_stratified_sample populates reference_wrb on every pedon", {
  skip_on_cran()
  fp <- system.file("extdata", "wosis_stratified_sample.rds", package = "soilKey")
  if (!nzchar(fp)) fp <- "inst/extdata/wosis_stratified_sample.rds"
  skip_if_not(file.exists(fp), "wosis_stratified_sample.rds not bundled")
  s <- load_wosis_stratified_sample()
  refs <- vapply(s$pedons, function(p) p$site$reference_wrb %||% NA_character_,
                  character(1))
  expect_equal(sum(!is.na(refs)), length(s$pedons))
})


test_that("v0.9.88: reference_wrb mirrors wosis_rsg verbatim (back-compat preserved)", {
  skip_on_cran()
  fp <- system.file("extdata", "wosis_stratified_sample.rds", package = "soilKey")
  if (!nzchar(fp)) fp <- "inst/extdata/wosis_stratified_sample.rds"
  skip_if_not(file.exists(fp), "wosis_stratified_sample.rds not bundled")
  s <- load_wosis_stratified_sample()
  for (p in head(s$pedons, 5)) {
    expect_identical(p$site$reference_wrb, p$site$wosis_rsg)
  }
})


test_that("v0.9.88: existing reference_wrb is NOT overwritten if already present", {
  skip_on_cran()
  fp <- system.file("extdata", "wosis_stratified_sample.rds", package = "soilKey")
  if (!nzchar(fp)) fp <- "inst/extdata/wosis_stratified_sample.rds"
  skip_if_not(file.exists(fp), "wosis_stratified_sample.rds not bundled")
  # Round-trip: load the sample, then call load_wosis_stratified_sample again
  # via a bypass that injects a custom reference_wrb on one pedon. Confirm
  # the alias step does NOT clobber it.
  s <- load_wosis_stratified_sample()
  s$pedons[[1]]$site$reference_wrb <- "Custom-RSG"
  # Re-running the loader on the modified object isn't a real codepath
  # (the loader reads from disk) but the alias logic itself is the
  # contract. Confirm the contract: when reference_wrb is already set,
  # the loader's lapply should NOT overwrite (it only sets when the
  # field is NULL, per the v0.9.88 implementation).
  one <- s$pedons[[1]]
  if (inherits(one, "PedonRecord") &&
        !is.null(one$site$reference_wrb) &&
        !is.null(one$site$wosis_rsg)) {
    # Manually re-apply the v0.9.88 alias logic and confirm it's a no-op
    site <- one$site
    if (is.null(site$reference_wrb) && !is.null(site$wosis_rsg)) {
      site$reference_wrb <- site$wosis_rsg
    }
    expect_identical(site$reference_wrb, "Custom-RSG")
  } else {
    succeed("Pedon does not match the v0.9.88 alias precondition")
  }
})


test_that("v0.9.88: WoSIS stratified default canonical WRB accuracy is non-zero", {
  skip_on_cran()
  fp <- system.file("extdata", "wosis_stratified_sample.rds", package = "soilKey")
  if (!nzchar(fp)) fp <- "inst/extdata/wosis_stratified_sample.rds"
  skip_if_not(file.exists(fp), "wosis_stratified_sample.rds not bundled")
  s <- load_wosis_stratified_sample()
  correct <- 0L; n <- 0L
  for (p in s$pedons) {
    ref <- p$site$reference_wrb %||% NA_character_
    if (is.na(ref) || !nzchar(ref)) next
    cls <- tryCatch(suppressMessages(suppressWarnings(
      classify_wrb2022(p, on_missing = "silent"))),
      error = function(e) NULL)
    pred <- if (!is.null(cls)) cls$rsg_or_order %||% NA_character_
            else NA_character_
    ref_norm <- normalise_febr_wrb(ref)
    n <- n + 1L
    if (!is.na(pred) && !is.na(ref_norm) && pred == ref_norm) correct <- correct + 1L
  }
  expect_gte(n, 100L)
  expect_gt(correct, 10L)
})
