# Esboço validação

library(dplyr)
library(readxl)
library(stringr)
library(purrr)
library(arrow)

# carrega caminhos para dados

# caminho correlacao normal
path_ncm <- file.path(
  Sys.getenv("general"),
  "Bases",
  "correlacoes",
  "mercosul",
  "output",
  "correlacao_completa_ncm.xlsx"
)

correlacao_completa_ncm_mercosul <- read_xlsx(path_ncm, guess_max = 1e6) # agora

# caminho correlacao expandida
path_ncm_detalhada <- file.path(
  Sys.getenv("general"),
  "Bases",
  "correlacoes",
  "mercosul",
  "output",
  "correlacao_completa_ncm_detalhada.xlsx"
)

# Leitura de correlacao expandida
correlacao_ncm_detalhada <- read_xlsx(path_ncm_detalhada, guess_max = 1e6)

# funcao para obter linhas com mudancas de codigo em cada revisao NCM
filtra_mudancas <- function(x, padrao) {
  x |>
    select(matches(padrao)) |>
    filter(
      # seleciona as linhas que tem algum valor diferente de NA com exceção
      # de dados na primeira coluna
      if_any(-1, ~ !is.na(.))
    ) |>
    # cria uma coluna preenchendo-a com a primeira informação não NA da
    # direita para a esquerda
    mutate(!!padrao := do.call(coalesce, rev(as.list(across(-1))))) |>
    select(
      ncm_original = 1,
      last_col()
    ) |>
    distinct()
}

# cria lista de nomes para usar como input em filtra_mudancas
nomes_para_funcao <- names(correlacao_ncm_detalhada) |>
  str_extract("NCM_\\d{4}") |>
  unique()

# obtem lista com as ncms originais das revisoes
ncms_originais <- nomes_para_funcao |>
  map(~ filtra_mudancas(correlacao_ncm_detalhada, padrao = .x))

names(ncms_originais) <- nomes_para_funcao |>
  str_replace("_", " ")

# tamanho da lista de ncms originais
tamanho_lista <- length(ncms_originais)

# ultimo elemento da lista de ncms originais
ultima_revisao <- ncms_originais[[tamanho_lista]]

# ultimo arquivo do projeto ncms_originais
dados_gerados_ncms_originais <- readRDS("dados_gerados/ncms_originais.rds")

dados_gerados_ncms_originais <- dados_gerados_ncms_originais[[tamanho_lista]]

# compara coluna ncm original de agora com anterior
# indica que codigos que não estavam na revisão original apareceram agora. Isso é
# importante pois alguns códigos podem ter sido alterados agora ou podem ter sido esquecidos
# e não inseridos anteriorermente
setdiff(
  ultima_revisao$ncm_original,
  dados_gerados_ncms_originais$ncm_original
)

# obter nome da segunda coluna da ultima revisao
nome_segunda_coluna <- ultima_revisao |>
  select(-ncm_original) |>
  names()


# compara coluna de mudanças dentro da revisão. Indica códigos que
# apareceram agora em relação ao ultimo arquivo. Aqui vale a pena conferir se
# todos os códigos que aparececem foram de fato criados. Vale a pena conferir se todos os
# códigos criados (olhar nas resoluções) aparecem dentros os códigos seguintes.
setdiff(
  ultima_revisao[[nome_segunda_coluna]],
  dados_gerados_ncms_originais[[nome_segunda_coluna]]
)

# carrega dados da tec
tec <- read_xlsx(Sys.getenv("tec"), guess_max = 1e6)

# observa mudanças nos códigos ncm de um arquivo anterior
# e verifica se tem alguma ncm que não está mais na tec vigente.
# Se um código aparecer esse código deve ter sido alterado. Conferir.
dados_gerados_ncms_originais |>
  rename(ncm = all_of(nome_segunda_coluna)) |>
  mutate(ncm = str_remove_all(ncm, "\\.")) |>
  left_join(tec, by = "ncm") |>
  distinct() |>
  filter(is.na(descricao_tec)) |>
  pull(ncm)

#####################################
# compara codigos ncm da tabela de correlacao ncm de agora
# e verifica se todos estão presentes na tec vigente.

correlacao_completa <- correlacao_completa_ncm_mercosul |>
  distinct() |>
  rename_with(~ str_to_upper(.x)) |>
  tidyr::drop_na()

correlacao_ncm <- correlacao_completa |>
  rename(ncm = all_of(nome_segunda_coluna)) |>
  mutate(ncm = str_remove_all(ncm, "\\."))

# contagem de códigos únicos no arquivo com a última revisão
correlacao_ncm |>
  select(ncm) |>
  distinct()

# contagem linhas tec
nrow(tec)

# verifica se numero de linhas é igual ao número de linhas da tec
tec |>
  filter(ncm %in% correlacao_ncm[["ncm"]] |> unique()) |>
  nrow()


# compara codigos ncm da tabela correlação ncm antiga e
# verifica se todos estão presentes na tec vigente.
correlacao_ncm_antes <- read_parquet("dados_gerados/dataset_ncm.parquet") # antes

correlacao_ncm_antes <- correlacao_ncm_antes |>
  rename(ncm = all_of(nome_segunda_coluna)) |>
  mutate(ncm = str_remove_all(ncm, "\\."))

# um número menor de linhas indica que alguns códigos saíram da tabela de correlação e não estão mais presentes na tec vigente.
tec |>
  filter(ncm %in% unique(correlacao_ncm_antes$ncm)) |>
  nrow()

# verifica codigos que entraram na tabela correlacao ncm
setdiff(correlacao_ncm$ncm, correlacao_ncm_antes$ncm)
# compara com codigos ncms originais antes e depois. Os códigos da linha acima devem
# bater com a linha abaixo (sem pontos)
setdiff(
  ultima_revisao[[nome_segunda_coluna]],
  dados_gerados_ncms_originais[[nome_segunda_coluna]]
)

# codigos que saíram da tabela de correlacao
setdiff(correlacao_ncm_antes$ncm, correlacao_ncm$ncm)
