# 1. EU-Trees4F -----------------------------------------------------------

## 1.1. Get data ------------------------

## Base with all periods
abies_alba_base <- fd_forest_eutrees4f(
  species = metadata_forestdata$eutrees4f_species[1]
)

## Download only one period
acer_campestre_1_period <- purrr::map(
  c("2005", "2035", "2065", "2065"),
  \(x) fd_forest_eutrees4f(
    species = metadata_forestdata$eutrees4f_species[2],
    period  = x,
    quiet   = TRUE
  )
)

## Scenario argument
betula_pendula_scenario <- purrr::map(
  c("rcp45", "rcp85"),
  \(x) fd_forest_eutrees4f(
    species = metadata_forestdata$eutrees4f_species[10],
    period  = "2035",
    scenario = x
  )
)

## Type and model argument
quercus_ilex_type <- purrr::map(
  c("bin", "prob", "std"),
  \(x) fd_forest_eutrees4f(
    species = "Quercus ilex",
    period  = "2095",
    model   = "sdms",
    type    = x
  )
)

## Distrib argument
tilia_cordata_distrib <- purrr::map(
  c("disp_lu", "disp", "pot"),
  \(x) fd_forest_eutrees4f(
    species = "Tilia cordata",
    period  = "2035",
    type    = "bin",
    distrib = x
  )
)

tilia_cordata_distrib_nat <-
  fd_forest_eutrees4f(
    "Abies alba",
    type = "bin",
    period = "2005",
    distrib = "nat"
  )


## 1.2. Unit tests ----------------------

## Check that all periods are downloaded properly
test_that("4 layers are downloaded", {

  expect_equal(terra::nlyr(abies_alba_base), 4)

  expect_equal(
    basename(terra::sources(abies_alba_base)),
    c(
      "Abies_alba_ens-clim_cur2005_bin_pot.tif",
      "Abies_alba_ens-clim_rcp45_fut2035_bin_pot.tif",
      "Abies_alba_ens-clim_rcp45_fut2065_bin_pot.tif",
      "Abies_alba_ens-clim_rcp45_fut2095_bin_pot.tif"
    )
  )

})

## Check that only 1 layer is downloaded when 1 year specified
test_that("There is only 1 layer per raster", {
  expect_equal(
    purrr::map_int(acer_campestre_1_period, terra::nlyr),
    rep(1, 4)
  )
})

## Check scenario argument
test_that("Scenario argument works properly", {

  expect_equal(
    purrr::map_chr(betula_pendula_scenario, \(x) basename(terra::sources(x))),
    c(
      "Betula_pendula_ens-clim_rcp45_fut2035_bin_pot.tif",
      "Betula_pendula_ens-clim_rcp85_fut2035_bin_pot.tif"
    )
  )

})

## Check type and model argument
test_that("Type and model arguments work properly", {

  expect_equal(
    purrr::map_chr(quercus_ilex_type, \(x) basename(terra::sources(x))),
    c(
      "Quercus_ilex_ens-sdms_rcp45_fut2095_bin_pot.tif",
      "Quercus_ilex_ens-sdms_rcp45_fut2095_prob_pot.tif",
      "Quercus_ilex_ens-sdms_rcp45_fut2095_std_pot.tif"
    )
  )
})

## Check distrib argument
test_that("Distrib argument behaves correctly", {
  expect_equal(
    purrr::map_chr(tilia_cordata_distrib, \(x) basename(terra::sources(x))),
    c(
      "Tilia_cordata_ens-clim_rcp45_fut2035_bin_disp_lu.tif",
      "Tilia_cordata_ens-clim_rcp45_fut2035_bin_disp.tif",
      "Tilia_cordata_ens-clim_rcp45_fut2035_bin_pot.tif"
    )
  )

  expect_equal(
    basename(terra::sources(tilia_cordata_distrib_nat)),
    "Abies_alba_ens-clim_cur2005_bin_nat.tif"
  )
})

## Test errors
test_that("Errors are working properly", {

  expect_error(fd_forest_eutrees4f("Abies alba", model = "clim", type = "std"))
  expect_error(fd_forest_eutrees4f("Abies alba", type = "prob", distrib = "nat"))
  expect_error(fd_forest_eutrees4f("Abies alba", type = "std", distrib = "nat"))
  expect_error(fd_forest_eutrees4f("Abies alba", type = "std", period = 2005))
  expect_error(fd_forest_eutrees4f("Abies alba", distrib = "disp", type = "std"))
  expect_error(fd_forest_eutrees4f("Abies alba", distrib = "disp_lu", type = "std"))
  expect_error(fd_forest_eutrees4f("Abies alba", distrib = "nat", period = 2065))

})