# Limpando o ambiente
rm(list = ls())
# =========== Área de bibliotecas =================
# Pacotes necessários
if (!require("openxlsx")) install.packages("openxlsx")
## Carregando pacotes exigidos: openxlsx
if (!require("fs")) install.packages("fs")
## Carregando pacotes exigidos: fs
if (!require("htmltools")) install.packages("htmltools")
## Carregando pacotes exigidos: htmltools
if (!require("htmlTable")) install.packages("htmlTable")
## Carregando pacotes exigidos: htmlTable
library(openxlsx)
library(fs)
library(htmltools)
library(htmlTable)

# =========== Área do código principal ============
#
# Leitura da Matriz e preparação inicial
#
nSetores = 68
PastaMipEstimada <- "./Outputs"
PastaMipEstimada <- fs::path_expand(PastaMipEstimada)

# Leitura do arquivo da Matriz de Insumo-Produto de 2019
dSheet <- read.xlsx(file.path(PastaMipEstimada, "MIP_2019_68x68MetodoGuilhoto.xlsx"),
                    sheet = "MIP",
                    rowNames = TRUE)
mMatriz  <- as.matrix(dSheet)
lNomeSetores <- rownames(dSheet)[1:nSetores] # Captura o nome dos setores
dimnames(mMatriz) <- NULL

# Extração das matrizes e vetores
mZ <- mMatriz[1:nSetores, 1:nSetores]
mDemanda  <- mMatriz[1:nSetores, 70:75]
mVA       <- mMatriz[76:89, 1:nSetores]
nLinhaVBP <- 13
nLinhaOcupacoes <- 14
vX        <- mVA[nLinhaVBP, ]

#################################################################################
# Calculo do Modelo Aberto
#################################################################################
mA <- t(t(mZ) / vX)
mA[!is.finite(mA)] <- 0 # Tratamento para divisões por zero
mI <- diag(nSetores)
mLeontief <- solve(mI - mA)


#################################################################################
# Calculo do Modelo Fechado
#################################################################################
nLinhaRendaTrabalho <- 2
nLinhaRendaCapital <- 9
nColunaFamilias <- 4
vDemandaFamilias <- matrix(mDemanda[, nColunaFamilias], nrow = nSetores, ncol = 1)
vRendaTrabalho <- matrix(mVA[nLinhaRendaTrabalho, ], nrow = 1, ncol = nSetores) + matrix(mVA[nLinhaRendaCapital, ], nrow = 1, ncol = nSetores) * 0.41

mZBarr <- rbind(mZ, vRendaTrabalho)
mAux <- rbind(vDemandaFamilias, matrix(0, nrow = 1, ncol = 1))
mZBarr <- cbind(mZBarr, mAux)

vVBPBarr <- c(vX, sum(vRendaTrabalho))
mABarr <- t(t(mZBarr) / vVBPBarr)
mABarr[!is.finite(mABarr)] <- 0 

mIBarr <- diag(nSetores + 1)
mLeontiefBarr <- solve(mIBarr - mABarr)


#################################################################################
# DEFINIÇÃO DO CHOQUE DESAGREGADO - PMCMV 2019 (R$ 4,6 bi)
#################################################################################

# 1. Parâmetros do investimento com base nos custos de Dez/2019
total_investimento <- 4600      # Valor em MILHÕES de R$ 
perc_materiais     <- 0.5226      # ALTERADO: Custo de materiais em Dez/2019 
perc_mao_de_obra   <- 0.4774      # ALTERADO: Custo de mão de obra em Dez/2019 

total_invest_materiais <- total_investimento * perc_materiais
total_invest_mao_de_obra <- total_investimento * perc_mao_de_obra

# 2. Choque de Materiais (distribuído nos setores com base no perfil de compras da Construção)
setores_materiais <- c(4, 16, 25, 26, 27, 29, 31, 32)
nSetorConstrucao <- which(grepl("Construção", lNomeSetores))
vComprasConstrucao_filtrado <- mZ[setores_materiais, nSetorConstrucao]
vPropCompras_filtrado <- vComprasConstrucao_filtrado / (sum(vComprasConstrucao_filtrado) + 1e-9)
vChoque_Materiais <- matrix(0, nrow = nSetores, ncol = 1)
vChoque_Materiais[setores_materiais, 1] <- vPropCompras_filtrado * total_invest_materiais

# 3. Choque de Mão de Obra (distribuído com base no perfil de consumo das Famílias)
vConsumoFamilias <- mDemanda[, nColunaFamilias]
vPropConsumo <- vConsumoFamilias / sum(vConsumoFamilias)
vChoque_MaoDeObra <- vPropConsumo * total_invest_mao_de_obra

# 4. Choque total para o modelo aberto
vChoque_Total_Aberto <- vChoque_Materiais + vChoque_MaoDeObra


#################################################################################
# ANÁLISE DE IMPACTO NO MODELO ABERTO
#################################################################################
vDeltaY_Aberto <- vChoque_Total_Aberto

# Cálculos de impacto
vDeltaX_Aberto <- mLeontief %*% vDeltaY_Aberto
nVariacaoVBP_Aberto <- sum(vDeltaX_Aberto)
nVariacaoPercentualVBP_Aberto <- (nVariacaoVBP_Aberto / sum(vX)) * 100

vRelacaoVA <- (mVA[1, ] / vX)
vRelacaoVA[!is.finite(vRelacaoVA)] <- 0
vDeltaVA_Aberto <- vDeltaX_Aberto * vRelacaoVA
nDeltaVA_Aberto <- sum(vDeltaVA_Aberto)
nDeltaVAPercentual_Aberto <- (nDeltaVA_Aberto / sum(mVA[1, ])) * 100

vRelacaoEmprego <- (mVA[nLinhaOcupacoes, ] / vX)
vRelacaoEmprego[!is.finite(vRelacaoEmprego)] <- 0
vDeltaEmprego_Aberto <- vDeltaX_Aberto * vRelacaoEmprego
nDeltaEmprego_Aberto <- sum(vDeltaEmprego_Aberto)
nDeltaEmpregoPercentual_Aberto <- (nDeltaEmprego_Aberto / sum(mVA[nLinhaOcupacoes, ])) * 100

# Geração da tabela de resultados do Modelo Aberto
resumo_aberto <- data.frame(
  Indicador = c("Valor Total da Produção (Milhões R$)",
                "Variação da Produção (Milhões R$)",
                "Variação da Produção (%)",
                "Variação do VA (Milhões R$)",
                "Variação do VA (%)",
                "Variação do Emprego (Nº Pessoas)",
                "Variação do Emprego (%)"
  ),
  Valor = c(format(sum(vX), big.mark = ".", decimal.mark = ",", nsmall = 2),
            format(nVariacaoVBP_Aberto, big.mark = ".", decimal.mark = ",", nsmall = 2),
            paste0(format(nVariacaoPercentualVBP_Aberto, digits = 4), " %"),
            format(nDeltaVA_Aberto, big.mark = ".", decimal.mark = ",", nsmall = 2),
            paste0(format(nDeltaVAPercentual_Aberto, digits = 4), " %"),
            format(trunc(nDeltaEmprego_Aberto), big.mark = ".", decimal.mark = ","),
            paste0(format(nDeltaEmpregoPercentual_Aberto, digits = 4), " %")
  )
)

html_out_aberto <- htmlTable(resumo_aberto,
                             align = "lr",
                             caption = "Impacto do Investimento PMCMV - 2019 (R$ 4,6 bi) - Modelo Aberto",
                             rnames = FALSE)
html_print(HTML(html_out_aberto))


#################################################################################
# ANÁLISE DE IMPACTO NO MODELO FECHADO 2
#################################################################################

# O valor da mão de obra é injetado na renda das famílias (69ª conta)
vDeltaY_Fechado <- rbind(matrix(vChoque_Materiais, nrow = nSetores, ncol = 1),
                         matrix(total_invest_mao_de_obra, nrow = 1, ncol = 1)) # <-- CORREÇÃO APLICADA

# Cálculos de impacto
vDeltaX_Fechado <- mLeontiefBarr %*% vDeltaY_Fechado
nVariacaoVBP_Fechado <- sum(vDeltaX_Fechado[1:nSetores])
nVariacaoPercentualVBP_Fechado <- (nVariacaoVBP_Fechado / sum(vX)) * 100

vDeltaVA_Fechado <- vDeltaX_Fechado[1:nSetores] * vRelacaoVA
nDeltaVA_Fechado <- sum(vDeltaVA_Fechado)
nDeltaVAPercentual_Fechado <- (nDeltaVA_Fechado / sum(mVA[1, ])) * 100

vDeltaEmprego_Fechado <- vDeltaX_Fechado[1:nSetores] * vRelacaoEmprego
nDeltaEmprego_Fechado <- sum(vDeltaEmprego_Fechado)
nDeltaEmpregoPercentual_Fechado <- (nDeltaEmprego_Fechado / sum(mVA[nLinhaOcupacoes, ])) * 100

# Geração da tabela de resultados do Modelo Fechado
resumo_fechado <- data.frame(
  Indicador = c("Valor Total da Produção (Milhões R$)",
                "Variação da Produção (Milhões R$)",
                "Variação da Produção (%)",
                "Variação do VA (Milhões R$)",
                "Variação do VA (%)",
                "Variação do Emprego (Nº Pessoas)",
                "Variação do Emprego (%)"
  ),
  Valor = c(format(sum(vX), big.mark = ".", decimal.mark = ",", nsmall = 2),
            format(nVariacaoVBP_Fechado, big.mark = ".", decimal.mark = ",", nsmall = 2),
            paste0(format(nVariacaoPercentualVBP_Fechado, digits = 4), " %"),
            format(nDeltaVA_Fechado, big.mark = ".", decimal.mark = ",", nsmall = 2),
            paste0(format(nDeltaVAPercentual_Fechado, digits = 4), " %"),
            format(trunc(nDeltaEmprego_Fechado), big.mark = ".", decimal.mark = ","),
            paste0(format(nDeltaEmpregoPercentual_Fechado, digits = 4), " %")
  )
)

html_out_fechado <- htmlTable(resumo_fechado,
                              align = "lr",
                              caption = "Impacto do Investimento PMCMV - 2019 (R$ 4,6 bi) - Modelo Fechado",
                              rnames = FALSE)
html_print(HTML(html_out_fechado))