#!/usr/bin/env Rscript

# Auditoria independente do retrato publicado do primeiro gráfico da FAETEC.
# Uso: Rscript auditar-faetec.R [caminho-local-do-CSV]
# Sem argumento, baixa o CSV público. Requer apenas a instalação base do R.

CSV_URL <- "https://mapa.secti.rj.gov.br/dados/faetec-primeiro-grafico.csv"

falhar <- function(mensagem) stop(mensagem, call. = FALSE)
exigir <- function(condicao, mensagem) {
  if (!isTRUE(condicao)) falhar(mensagem)
}

auditar <- function(argumentos) {
  exigir(length(argumentos) <= 1L, "Informe no máximo um caminho local para o CSV.")
  temporario <- NULL
  if (length(argumentos) == 1L) {
    caminho <- argumentos[[1L]]
  } else {
    temporario <- tempfile(fileext = ".csv")
    tryCatch(
      utils::download.file(CSV_URL, temporario, mode = "wb", quiet = TRUE),
      error = function(e) falhar(paste("Não foi possível baixar o CSV:", conditionMessage(e)))
    )
    caminho <- temporario
  }
  if (!file.exists(caminho)) falhar(paste("CSV não encontrado:", caminho))
  if (!is.null(temporario)) on.exit(unlink(temporario), add = TRUE)

  dados <- tryCatch(
    utils::read.csv2(caminho, fileEncoding = "UTF-8-BOM", stringsAsFactors = FALSE,
                     check.names = FALSE, na.strings = c("", "NA"), comment.char = ""),
    error = function(e) falhar(paste("Não foi possível ler o CSV:", conditionMessage(e)))
  )

  regiao <- "Região de Governo"
  setor <- "Setor"
  participacoes <- c(
    "Participação no emprego formal (%)",
    "Participação nas vagas técnicas (%)",
    "Participação nas vagas FIC (%)"
  )
  contagens <- c("Vínculos formais 2025 (n)", "Vagas técnicas 2026 (n)", "Vagas FIC 2026 (n)")
  denominadores <- c("Denominador do emprego formal (n)", "Denominador das vagas técnicas (n)", "Denominador das vagas FIC (n)")
  exigidas <- c(regiao, setor,
                participacoes[[1L]], contagens[[1L]], denominadores[[1L]],
                participacoes[[2L]], contagens[[2L]], denominadores[[2L]],
                participacoes[[3L]], contagens[[3L]], denominadores[[3L]])
  exigir(identical(names(dados), exigidas), "As colunas do CSV diferem do formato auditado.")

  regioes_esperadas <- c("Estado", "Baixadas Litorâneas", "Centro-Sul Fluminense", "Costa Verde",
                         "Médio Paraíba", "Metropolitana", "Noroeste Fluminense", "Norte Fluminense", "Serrana")
  exigir(nrow(dados) == 180L, paste("Esperadas 180 linhas; encontradas", nrow(dados), "."))
  exigir(length(unique(dados[[regiao]])) == 9L && setequal(unique(dados[[regiao]]), regioes_esperadas),
         "A cobertura das nove regiões diverge do gráfico.")
  exigir(length(unique(dados[[setor]])) == 20L, "A cobertura dos 20 setores diverge do gráfico.")
  exigir(!anyDuplicated(dados[c(regiao, setor)]), "Há combinações repetidas de região e setor.")

  for (i in seq_along(contagens)) {
    pct <- dados[[participacoes[[i]]]]
    n <- dados[[contagens[[i]]]]
    denominador <- dados[[denominadores[[i]]]]
    ausencias <- cbind(is.na(pct), is.na(n), is.na(denominador))
    exigir(all(rowSums(ausencias) %in% c(0L, 3L)), paste("Série incompleta em", participacoes[[i]], "."))
    observados <- !is.na(pct)
    exigir(all(denominador[observados] > 0), paste("Denominador não positivo em", denominadores[[i]], "."))
    recalculado <- round(n[observados] / denominador[observados] * 100, 1)
    exigir(all(abs(pct[observados] - recalculado) < 0.001),
           paste("Participação não confere com contagem e denominador em", participacoes[[i]], "."))
    por_regiao <- split(denominador, dados[[regiao]])
    denominador_constante <- vapply(por_regiao, function(x) length(unique(x[!is.na(x)])) <= 1L, logical(1))
    exigir(all(denominador_constante), paste("Denominador varia dentro da região em", denominadores[[i]], "."))

    valor_estado <- dados[dados[[regiao]] == "Estado", contagens[[i]]]
    valor_regional <- dados[dados[[regiao]] != "Estado", contagens[[i]]]
    exigir(sum(valor_estado, na.rm = TRUE) == sum(valor_regional, na.rm = TRUE),
           paste("Total estadual não confere com a soma regional em", contagens[[i]], "."))
    for (nome_setor in unique(dados[[setor]])) {
      estado_setor <- dados[dados[[regiao]] == "Estado" & dados[[setor]] == nome_setor, contagens[[i]]]
      regioes_setor <- dados[dados[[regiao]] != "Estado" & dados[[setor]] == nome_setor, contagens[[i]]]
      exigir(sum(estado_setor, na.rm = TRUE) == sum(regioes_setor, na.rm = TRUE),
             paste("Total estadual não confere no setor", nome_setor, "para", contagens[[i]], "."))
    }
  }

  vagas_estado <- dados[dados[[regiao]] == "Estado", , drop = FALSE]
  exigir(sum(vagas_estado[[contagens[[2L]]]], na.rm = TRUE) == 12501,
         "O total estadual de vagas técnicas difere de 12.501.")
  exigir(sum(vagas_estado[[contagens[[3L]]]], na.rm = TRUE) == 83075,
         "O total estadual de vagas FIC difere de 83.075.")
  cat("Auditoria concluída: 180 linhas, 9 regiões, 20 setores.\n")
  cat("Vagas técnicas 2026: 12.501; vagas FIC 2026: 83.075.\n")
  cat("Participações recalculadas e somas regionais conferidas.\n")
  invisible(TRUE)
}

auditar(commandArgs(trailingOnly = TRUE))
