context("NLDI...")

test_that("NLDI messageing NULL", {
  skip_on_cran()
  skip_on_ci()
  xx <- findNLDI(
    wqp = "TCEQMAIN-10016",
    nav = "UM",
    find = "nwissite",
    distance_km = 2,
    warn = FALSE
  )

  expect_warning(findNLDI(
    wqp = "TCEQMAIN-10016",
    nav = "UM",
    find = "nwissite",
    distance_km = 2,
    warn = TRUE
  ))

  expect_true(class(xx) == "list")
  expect_true(nrow(xx[[1]]) == 1)
})


test_that("NLDI offerings...", {
  skip_on_cran()
  skip_on_ci()
  expect_true(nrow(get_nldi_sources()) > 1)
})


test_that("NLDI starting sources...", {
  skip_on_cran()
  skip_on_ci()

  # LINESTRING GEOMETERY
  expect_equal(
    sum(
      names(findNLDI(comid = 101, warn = FALSE)$origin) %in%
        c("sourceName", "identifier", "comid", "geometry")
    ),
    4
  )
  # POINT GEOMETERY
  expect_true(all(
    names(findNLDI(nwis = "11120000", warn = FALSE)$origin) %in%
      c(
        "sourceName",
        "identifier",
        "comid",
        "name",
        "mainstem",
        "reachcode",
        "measure",
        "X",
        "Y",
        "geometry"
      )
  ))
  # COMID
  expect_equal(
    findNLDI(comid = 101, warn = FALSE)$origin$sourceName,
    "NHDPlus comid"
  )
  # NWIS
  expect_equal(
    findNLDI(nwis = "11120000", warn = FALSE)$origin$sourceName,
    "NWIS Surface Water Sites"
  )
  # WQP
  expect_equal(
    findNLDI(wqp = "USGS-04024315", warn = FALSE)$origin$sourceName,
    "Water Quality Portal"
  )
  expect_equal(
    findNLDI(wqp = "CCU_EQL-2 H9", warn = FALSE)$origin$sourceName,
    "Water Quality Portal"
  )
  # LOCATION
  expect_equal(
    findNLDI(location = c(-115, 40), warn = FALSE)$origin$sourceName,
    "NHDPlus comid"
  )
  # ERROR: LOCATION COORDINATES FLIPPED
  expect_error(findNLDI(location = c(40, -115), warn = FALSE))
  # GENERAL START: STABLE
  expect_equal(
    findNLDI(origin = list("comid" = 101), warn = FALSE)$origin$sourceName,
    "NHDPlus comid"
  )
  # GENERAL START: NON-STABLE
  expect_equal(
    findNLDI(
      origin = list("nwissite" = "USGS-05427850"),
      warn = FALSE
    )$origin$sourceName,
    "NWIS Surface Water Sites"
  )
  # ERROR: TWO STARTS
  expect_error(findNLDI(nwis = 1000, comid = 101, warn = FALSE))
  # NON EXISTING SITE
  expect_message(findNLDI(comid = 1, warn = FALSE))
})

test_that("NLDI navigation sources...", {
  skip_on_cran()
  skip_on_ci()

  # UPPER TRIBUTARY
  expect_equal(
    length(findNLDI(nwis = "11120000", nav = "UT", warn = FALSE)$UT_flowlines),
    2
  )
  # UPPER MAIN
  expect_equal(
    length(findNLDI(nwis = "11120000", nav = "UM", warn = FALSE)$UM_flowlines),
    2
  )
  # DOWNSTREAM MAIN
  expect_equal(
    length(findNLDI(nwis = "11120000", nav = "DM", warn = FALSE)$DM_flowlines),
    2
  )
  # MULTI-REQUEST
  expect_equal(
    length(findNLDI(nwis = "11120000", nav = c("UT", "UM"), warn = FALSE)),
    3
  )
  # ERRORS: Bad NAV REQUEST
  expect_error(findNLDI(nwis = "11120000", nav = c("DT"), warn = FALSE))
  expect_error(findNLDI(nwis = "11120000", nav = c("DT", "UM"), warn = FALSE))
  # WARNING: Data not found
  # expect_warning(findNLDI(comid = 101, nav = "UM", find = "nwis", warn = TRUE))
})

test_that("NLDI find sources...", {
  skip_on_cran()
  skip_on_ci()

  expect_equal(
    length(findNLDI(
      nwis = "11120000",
      nav = "UT",
      distance_km = 999,
      find = "nwis",
      warn = FALSE
    )),
    2
  )
  # expect_equal(length(findNLDI(nwis = "11120000", nav = c("UT", "UM"), find = c("nwis", "wade", "flowlines"), warn = FALSE)), 7)
})

test_that("sf not installed...", {
  skip_on_cran()
  skip_on_ci()

  expect_true(
    !"geometry" %in%
      findNLDI(nwis = "11120000", no_sf = TRUE, warn = FALSE)[[1]]
  )
  expect_equal(
    class(findNLDI(
      nwis = "11120000",
      nav = "UT",
      find = c("nwis"),
      no_sf = TRUE,
      warn = FALSE
    )[[2]]),
    "data.frame"
  )
  expect_true(
    c("X") %in%
      names(findNLDI(
        nwis = "11120000",
        nav = "UT",
        find = c("nwis"),
        no_sf = TRUE,
        warn = FALSE
      )[[2]])
  )
})


test_that("Distance...", {
  skip_on_cran()
  skip_on_ci()

  full <- findNLDI(
    comid = 17595429,
    nav = "UT",
    find = "nwis",
    distance_km = 999,
    warn = FALSE
  )
  part <- findNLDI(
    comid = 17595429,
    nav = "UT",
    find = "nwis",
    distance_km = 2,
    warn = FALSE
  )
  expect_true(nrow(full$UT_nwissite) > nrow(part$UT_nwissite))
})

test_that("basin", {
  skip_on_cran()
  skip_on_ci()

  xx <- findNLDI(comid = 101, nav = "UT", find = "basin", warn = FALSE)
  xx2 <- findNLDI(
    comid = 101,
    nav = "UT",
    find = "basin",
    no_sf = TRUE,
    warn = FALSE
  )
  expect_true(sf::st_geometry_type(xx$basin) == "POLYGON")
  expect_equal(ncol(xx2$basin), 0)
})


test_that("ignore flowlines", {
  skip_on_cran()
  skip_on_ci()

  xx <- findNLDI(
    comid = 101,
    nav = "DM",
    find = c("nwis", "flowlines"),
    warn = FALSE
  )
  xx2 <- findNLDI(comid = 101, nav = "DM", find = "nwis", warn = FALSE)
  expect_gt(length(xx), length(xx2))
  expect_true("DM_flowlines" %in% names(xx))
  expect_true(!"DM_flowlines" %in% names(xx2))
})


test_that("sf points", {
  skip_on_cran()
  skip_on_ci()
  library(sf)
  p2 <- st_sfc(st_point(c(-119.8458, 34.4146)), crs = 4326)
  expect_equal(
    findNLDI(location = p2, warn = FALSE),
    findNLDI(location = sf::st_as_sf(p2))
  )
  expect_error(findNLDI(location = st_buffer(p2, .01), warn = FALSE))
})


test_that("warn_flag", {
  skip_on_ci()
  skip_on_cran()

  expect_warning(
    findNLDI(
      wqp = "TCEQMAIN-10016",
      nav = "UM",
      find = "nwissite",
      distance_km = 2,
      no_sf = TRUE,
      warn = FALSE
    ),
    regexp = NA
  )

  expect_warning(
    findNLDI(
      wqp = "TCEQMAIN-10016",
      nav = "UM",
      find = "nwissite",
      distance_km = 2,
      no_sf = TRUE,
      warn = TRUE
    )
  )
})
