# Esboço validação

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

# carrega caminhos para dados

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

path_ncm <- "correlacao_completa_ncm.xlsx"

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

path_ncm_detalhada <- "correlacao_completa_ncm_detalhada.xlsx"

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 
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
setdiff(
    ultima_revisao[[nome_segunda_coluna]],
    dados_gerados_ncms_originais[[nome_segunda_coluna]]
)

# carrega dados da tec
tec <- read_xlsx("tec_oficial.xlsx", 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.
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_ncm_mercosul <- read_xlsx(path_ncm, guess_max = 1e6) # agora

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, "\\."))

correlacao_ncm |> 
    select(ncm) |> 
    distinct()

tec |> 
    filter(ncm %in% correlacao_ncm$NCM_2022)


# 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, "\\."))

tec |> 
    filter(ncm %in% correlacao_ncm_antes$ncm)

# verifica codigos que entraram na tabela correlacao ncm
setdiff(correlacao_ncm$ncm, correlacao_ncm_antes$ncm)
# compara com codigos ncms originais antes e depois
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)
