test_that("stack_rasters works", {
  expect_equal(
    terra::values(
      terra::rast(
        stack_rasters(
          list(
            system.file("rasters/example_sentinel1.tif", package = "rsi")
          ),
          tempfile(fileext = ".vrt")
        )
      )
    ),
    terra::values(terra::rast(system.file(
      "rasters/example_sentinel1.tif",
      package = "rsi"
    )))
  )
})

test_that("stack_rasters works with non-VRT outputs", {
  expect_no_error(
    out_tif <- stack_rasters(
      list(
        system.file("rasters/example_sentinel1.tif", package = "rsi")
      ),
      tempfile(fileext = ".tif")
    )
  )

  # the re-compression means we don't expect this to necessarily be the same size
  # but it should still be a decent sized file, not just a text file
  expect_true(
    file.info(out_tif)$size >
      (file.info(system.file(
        "rasters/example_sentinel1.tif",
        package = "rsi"
      ))$size /
        2)
  )

  expect_equal(
    terra::values(terra::rast(out_tif, drivers = "GTiff")),
    terra::values(terra::rast(system.file(
      "rasters/example_sentinel1.tif",
      package = "rsi"
    )))
  )
})

test_that("stack_rasters fails when reference_raster isn't in the vector", {
  expect_error(
    stack_rasters(
      list(
        system.file("rasters/example_sentinel1.tif", package = "rsi")
      ),
      tempfile(fileext = ".vrt"),
      reference_raster = 2
    ),
    class = "rsi_not_in_vec"
  )

  expect_error(
    stack_rasters(
      list(
        system.file("rasters/example_sentinel1.tif", package = "rsi")
      ),
      tempfile(fileext = ".vrt"),
      reference_raster = "some_raster"
    ),
    class = "rsi_not_in_vec"
  )
})

test_that("stack_rasters fails when extent isn't four numbers", {
  expect_error(
    stack_rasters(
      list(
        system.file("rasters/example_sentinel1.tif", package = "rsi")
      ),
      tempfile(fileext = ".vrt"),
      extent = 20
    ),
    class = "rsi_bad_extent"
  )
})

test_that("stack_rasters fails when resolution isn't 1-2 numbers", {
  expect_error(
    stack_rasters(
      list(
        system.file("rasters/example_sentinel1.tif", package = "rsi")
      ),
      tempfile(fileext = ".vrt"),
      resolution = c(20, 30, 40)
    ),
    class = "rsi_bad_resolution"
  )
})

test_that("stack_rasters fails when rasters don't share a CRS", {
  s1 <- tempfile(fileext = ".tif")
  terra::writeRaster(
    terra::project(
      terra::rast(
        system.file("rasters/example_sentinel1.tif", package = "rsi")
      ),
      "EPSG:4326"
    ),
    s1
  )

  expect_error(
    stack_rasters(
      list(
        system.file("rasters/example_sentinel1.tif", package = "rsi"),
        s1
      ),
      tempfile(fileext = ".vrt")
    ),
    class = "rsi_multiple_crs"
  )
})

test_that("stack_rasters fails when rasters are not character vectors", {
  r1 <- terra::rast(matrix(rnorm(100), 10))
  expect_snapshot(
    stack_rasters(r1, "a"),
    error = TRUE
  )
})

test_that("stack_rasters warns when arguments are being ignored", {
  expect_warning(
    stack_rasters(
      list(
        system.file("rasters/example_sentinel1.tif", package = "rsi")
      ),
      tempfile(fileext = ".vrt"),
      gdalwarp_options = c("THIS IS IGNORED")
    ),
    class = "rsi_gdal_options_ignored"
  )
})

test_that("type_and_length checks", {
  expect_snapshot(
    stack_rasters("a", c("a", "b")),
    error = TRUE
  )

  expect_snapshot(
    stack_rasters("a", "b", resampling_method = c("a", "b")),
    error = TRUE
  )
})

test_that("stack_rasters warns when band names aren't the right length", {
  expect_warning(
    stack_rasters(
      list(system.file("rasters/example_sentinel1.tif", package = "rsi")),
      tempfile(fileext = ".vrt"),
      band_names = "VH"
    ),
    class = "rsi_band_name_length_mismatch"
  )

  expect_warning(
    stack_rasters(
      list(system.file("rasters/example_sentinel1.tif", package = "rsi")),
      tempfile(fileext = ".vrt"),
      band_names = c("VH", "VV", "EXTRA")
    ),
    class = "rsi_band_name_length_mismatch"
  )
})
