# test-data-integrity.R
# Pruebas de integridad del dataset cie10_cl

# ============================================================
# PRUEBAS DE ESTRUCTURA DEL DATASET
# ============================================================

test_that("cie10_cl tiene estructura correcta", {
  # Cargar dataset
  data(cie10_cl, package = "ciecl", envir = environment())

  expect_s3_class(cie10_cl, "tbl_df")

  # Columnas esperadas
 columnas_esperadas <- c(
    "codigo", "descripcion", "categoria", "seccion",
    "capitulo_nombre", "inclusion", "exclusion", "capitulo",
    "es_daga", "es_cruz"
  )

  expect_true(all(columnas_esperadas %in% names(cie10_cl)),
              info = paste("Columnas faltantes:",
                           paste(setdiff(columnas_esperadas, names(cie10_cl)),
                                 collapse = ", ")))
})

test_that("cie10_cl tiene tipos de columna correctos", {
  data(cie10_cl, package = "ciecl", envir = environment())

  # Columnas character
  expect_type(cie10_cl$codigo, "character")
  expect_type(cie10_cl$descripcion, "character")

  # Columnas logical
  expect_type(cie10_cl$es_daga, "logical")
  expect_type(cie10_cl$es_cruz, "logical")
})

test_that("cie10_cl tiene numero esperado de codigos", {
  data(cie10_cl, package = "ciecl", envir = environment())

  # El dataset MINSAL tiene aproximadamente 39877 codigos
  # Verificar rango razonable
  expect_gte(nrow(cie10_cl), 39000)
  expect_lte(nrow(cie10_cl), 40000)
})

test_that("cie10_cl no tiene duplicados en codigo", {
  data(cie10_cl, package = "ciecl", envir = environment())

  n_total <- nrow(cie10_cl)
  n_unique <- length(unique(cie10_cl$codigo))

  expect_equal(n_total, n_unique,
               info = paste("Duplicados encontrados:", n_total - n_unique))
})

test_that("cie10_cl no tiene codigos NA", {
  data(cie10_cl, package = "ciecl", envir = environment())

  n_na <- sum(is.na(cie10_cl$codigo))
  expect_equal(n_na, 0,
               info = paste("Codigos NA encontrados:", n_na))
})

test_that("cie10_cl no tiene descripciones NA o vacias", {
  data(cie10_cl, package = "ciecl", envir = environment())

  n_na <- sum(is.na(cie10_cl$descripcion))
  n_empty <- sum(nchar(trimws(cie10_cl$descripcion)) == 0, na.rm = TRUE)

  expect_equal(n_na, 0, info = paste("Descripciones NA:", n_na))
  expect_equal(n_empty, 0, info = paste("Descripciones vacias:", n_empty))
})

# ============================================================
# PRUEBAS DE FORMATO DE CODIGOS
# ============================================================

test_that("codigos siguen formato CIE-10 valido", {
  data(cie10_cl, package = "ciecl", envir = environment())

  # Patron CIE-10: letra + 2 digitos + opcional (.digitos)
  patron <- "^[A-Z][0-9]{2}(\\.[0-9X]{1,2})?$"

  # Excluir codigos especiales de morfologia
  codigos_regulares <- cie10_cl$codigo[!grepl("^M80", cie10_cl$codigo)]

  validos <- grepl(patron, codigos_regulares)
  porcentaje <- sum(validos) / length(validos) * 100

  # Al menos 95% deben cumplir el patron
  expect_gt(porcentaje, 95)
})

test_that("todos los capitulos estan representados", {
  data(cie10_cl, package = "ciecl", envir = environment())

  # Capitulos CIE-10: A-Z (algunos no usados)
  capitulos <- unique(substr(cie10_cl$codigo, 1, 1))

  # Capitulos esperados en CIE-10 Chile
  esperados <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
                 "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
                 "U", "V", "W", "X", "Y", "Z")

  # Al menos los principales deben estar
  principales <- c("A", "B", "C", "D", "E", "F", "G", "I", "J", "K")
  expect_true(all(principales %in% capitulos),
              info = paste("Capitulos faltantes:",
                           paste(setdiff(principales, capitulos), collapse = ", ")))
})

# ============================================================
# PRUEBAS DE CODIGOS ESPECIFICOS CONOCIDOS
# ============================================================

test_that("codigos diabetes existen", {
  data(cie10_cl, package = "ciecl", envir = environment())

  codigos_dm <- cie10_cl$codigo[grepl("^E1[0-4]", cie10_cl$codigo)]
  expect_gt(length(codigos_dm), 50)

  # Codigo especifico
  expect_true("E11.0" %in% cie10_cl$codigo)
})

test_that("codigos hipertension existen", {
  data(cie10_cl, package = "ciecl", envir = environment())

  codigos_hta <- cie10_cl$codigo[grepl("^I1[0-5]", cie10_cl$codigo)]
  expect_gt(length(codigos_hta), 10)  # Hay al menos 10 codigos de hipertension

  # Codigo especifico
  expect_true("I10" %in% cie10_cl$codigo)
})

test_that("codigos neoplasias malignas existen", {
  data(cie10_cl, package = "ciecl", envir = environment())

  codigos_neo <- cie10_cl$codigo[grepl("^C[0-9]", cie10_cl$codigo)]
  expect_gt(length(codigos_neo), 200)
})

test_that("codigos infarto miocardio existen", {
  data(cie10_cl, package = "ciecl", envir = environment())

  codigos_iam <- cie10_cl$codigo[grepl("^I2[1-2]", cie10_cl$codigo)]
  expect_gt(length(codigos_iam), 10)

  expect_true("I21.0" %in% cie10_cl$codigo)
})

test_that("codigos COVID-19 existen", {
  data(cie10_cl, package = "ciecl", envir = environment())

  # COVID-19 usa codigo U07 (capitulo especial)
  codigos_covid <- cie10_cl$codigo[grepl("^U07", cie10_cl$codigo)]

  # Puede que no esten en version 2018
  # Solo verificar si existen que sean validos
  if (length(codigos_covid) > 0) {
    expect_true(all(grepl("^U07", codigos_covid)))
  }
})

# ============================================================
# PRUEBAS DE COLUMNAS DAGA/CRUZ
# ============================================================

test_that("columnas es_daga y es_cruz son consistentes", {
  data(cie10_cl, package = "ciecl", envir = environment())

  # No deben ser todos TRUE ni todos FALSE
  expect_true(any(cie10_cl$es_daga, na.rm = TRUE) || all(!cie10_cl$es_daga, na.rm = TRUE),
              info = "es_daga debe tener variabilidad o todos FALSE")

  expect_true(any(cie10_cl$es_cruz, na.rm = TRUE) || all(!cie10_cl$es_cruz, na.rm = TRUE),
              info = "es_cruz debe tener variabilidad o todos FALSE")
})
