"""Reproduz o acumulado do IPCA de 2022 a partir do snapshot do StudyHub."""

from pathlib import Path

import matplotlib.pyplot as plt
import pandas as pd


BASE = Path(__file__).resolve().parent
DATA_FILE = BASE / "ipca-2022.csv"
OUTPUT_FILE = BASE / "ipca-2022.png"

df = pd.read_csv(DATA_FILE, parse_dates=["data"])

# Contrato do dado: 12 meses únicos, ordenáveis e sem valor ausente.
assert len(df) == 12, "o snapshot deve conter exatamente 12 meses"
assert df["data"].is_unique, "há meses duplicados"
assert df["data"].notna().all(), "há datas inválidas"
assert df["valor"].notna().all(), "há valores ausentes"
assert pd.api.types.is_numeric_dtype(df["valor"]), "a coluna valor deve ser numérica"

df = df.sort_values("data").reset_index(drop=True)
expected_months = pd.date_range("2022-01-01", "2022-12-01", freq="MS")
assert df["data"].tolist() == expected_months.tolist(), "a sequência mensal está incompleta"

# Taxas mensais se compõem: o acumulado não é a soma aritmética.
df["fator"] = 1 + df["valor"] / 100
df["indice"] = 100 * df["fator"].cumprod()
acumulado = 100 * (df["fator"].prod() - 1)
soma_simples = df["valor"].sum()

assert abs(acumulado - 5.7848) < 0.001, "resultado fora da referência esperada"
print(f"Soma simples: {soma_simples:.2f}%")
print(f"IPCA 2022 composto: {acumulado:.4f}%")

fig, ax = plt.subplots(figsize=(9, 4.8))
colors = df["valor"].map(lambda value: "#a34d45" if value < 0 else "#1d3b53")
ax.bar(df["data"].dt.strftime("%b"), df["valor"], color=colors)
ax.axhline(0, color="#56605f", linewidth=0.8)
ax.set(title="IPCA mensal em 2022", ylabel="variação mensal (%)")
ax.spines[["top", "right"]].set_visible(False)
fig.text(0.01, 0.01, "Fonte: IBGE. Cálculo e visualização: StudyHub.", fontsize=8)
fig.tight_layout(rect=(0, 0.04, 1, 1))
fig.savefig(OUTPUT_FILE, dpi=160)
