
testthat::skip_on_cran()

test_that("ddbs_collect supports all output formats", {
  skip_if_not_installed("sf")
  skip_if_not_installed("duckdb")
  
  conn <- ddbs_create_conn()
  on.exit(ddbs_stop_conn(conn))
  
  # Setup data
  nc_sf <- sf::st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)[1:5,]
  ddbs_write_table(conn, nc_sf, "nc_data")
  
  nc_lazy <- as_duckspatial_df("nc_data", conn)
    
  # 1. Default (sf)
  res_sf <- ddbs_collect(nc_lazy)
  expect_s3_class(res_sf, "sf")
  expect_s3_class(res_sf$geometry, "sfc")
  expect_equal(nrow(res_sf), 5)
  
  # 2. Tibble (no geometry vs geometry dropped?)
  # The implementation of collect.duckspatial_df(as="tibble") drops geometry if it exists in lazy table
  res_tbl <- ddbs_collect(nc_lazy, as = "tibble")
  expect_s3_class(res_tbl, "tbl_df")
  expect_false(inherits(res_tbl, "sf"))
  expect_false("geometry" %in% names(res_tbl)) # Should be dropped by logic
  
  # 3. Raw (WKB)
  res_raw <- ddbs_collect(nc_lazy, as = "raw")
  expect_s3_class(res_raw, "tbl_df")
  expect_true("geometry" %in% names(res_raw))
  # Check content is raw list or blob
  expect_true(is.list(res_raw$geometry))
  expect_true(is.raw(res_raw$geometry[[1]]) || inherits(res_raw$geometry[[1]], "blob"))
  
  # 4. GeoArrow
  # Only if geoarrow package is available (optional dependency)
  if (requireNamespace("geoarrow", quietly = TRUE)) {
    res_ga <- ddbs_collect(nc_lazy, as = "geoarrow")
    expect_s3_class(res_ga, "tbl_df")
    expect_true("geometry" %in% names(res_ga))
    expect_true(inherits(res_ga$geometry, "geoarrow_vctr"))
  }
})

test_that("st_as_sf.duckspatial_df delegates to collect(as='sf')", {
  conn <- ddbs_create_conn()
  on.exit(ddbs_stop_conn(conn))
  
  nc_sf <- sf::st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)[1:5,]
  ddbs_write_table(conn, nc_sf, "nc_as_sf")
  nc_lazy <- as_duckspatial_df("nc_as_sf", conn)
  
  res <- sf::st_as_sf(nc_lazy)
  expect_s3_class(res, "sf")
})
