get_data_path <- function(table_name) {
  tables_with_data_in_excel <-
    c("FOTEST", "no_timeval_or_codes", "zero_heading", "zero_stub")

  tabels_with_data_in_parquet <- "BEXSTA_parquet"

  if (tolower(table_name) %in% tolower(tables_with_data_in_excel)) {
    NULL
  } else if (tolower(table_name) %in% tolower(tabels_with_data_in_parquet)) {
    testthat::test_path("fixtures", "data", paste0(table_name, ".parquet"))
  } else {
    testthat::test_path("fixtures", "data", paste0(table_name, ".rds"))
  }
}

get_classification_path <- function(name) {
  testthat::test_path("fixtures", "classification", name)
}

classification_path <- function(name) {
  function() {
    get_classification_path(name = name)
  }
}

agg_10years_path <- classification_path("10-years_classes.agg")
agg_25years_path <- classification_path("25-years_classes.agg")
vs_age5_path <- classification_path("Age5.vs")
vs_age5_strangely_formatted_path <- classification_path(
  "Age5_strangely_formatted.vs"
)
vs_agg_dont_exists <- classification_path("non_existing_agg.vs")
agg_different_lengths <- classification_path("agg_different_lengths.agg")
vs_different_lengths <- classification_path("agg_different_lengths.vs")
vs_pxvsbrche_path <- classification_path("PXVSBRCHE.vs")

get_metadata_path <- function(table_name) {
  testthat::test_path(
    "fixtures", "metadata", stringr::str_glue("metadata_{table_name}.xlsx")
  )
}

get_px_file_path <- function(table_name) {
  testthat::test_path("fixtures", "px", paste0(table_name, ".px"))
}

get_pxjob_file_path <- function(table_name) {
  testthat::test_path("fixtures", paste0(table_name, "_pxjob.px"))
}

expect_equal_lines <- function(path1, path2) {
  lines1 <- readLines(path1)
  lines2 <- readLines(path2)

  testthat::expect_equal(lines1, lines2)
}

px_from_table_name <- function(table_name) {
  px(
    input = get_metadata_path(table_name),
    data = get_data_path(table_name)
  )
}

expect_px_px_save_preserves_everything <- function(x) {
  px1 <- temp_px_file()
  px2 <- temp_px_file()

  px_save(x, path = px1)

  px1 |>
    px() |>
    px_save(path = px2)

  expect_equal_lines(px1, px2)
}

#' Run pxjob and delete created files when environment is killed
pxjob_clean <- function(input, output, env = parent.frame()) {
  pxjob64Win::pxjob(input, output)

  withr::defer(envir = env, {
    file.remove(output)
  })
}

#' Run px() and px_save() for a specific table. Return path to file.
create_px_file <- function(table_name) {
  px_path <- temp_px_file()

  px(
    input = get_metadata_path(table_name),
    data = get_data_path(table_name)
  ) |>
    px_save(path = px_path)

  px_path
}

expect_save_read_preserves_classification <- function(c) {
  tempdir <- temp_dir()
  px_save_classification(c, tempdir)

  c2 <-
    px_classification(
      vs_path = list.files(tempdir, pattern = ".*\\.vs", full.names = TRUE)
    )

  testthat::expect_identical(c, c2)
}
