import csv
import json
from pathlib import Path


ROOT = Path(__file__).resolve().parents[2]
RELATORIO_JSON = (
    ROOT
    / "pre_process"
    / "relatorio_ciclo_inspecoes_c105_2805_2026-06-15"
    / "relatorio_ciclo_inspecoes_c105_2805_2026-06-15_inspecoes.json"
)
OUTPUT_DIR = Path(__file__).resolve().parent
CSV_PATH = OUTPUT_DIR / "comparacao_ica_66_31_c105_2023_vs_relatorio_ciclo.csv"
MD_PATH = OUTPUT_DIR / "comparacao_ica_66_31_c105_2023_vs_relatorio_ciclo.md"


ICA_C105 = [
    {"chave": "PRE VOO", "tipo_ica": "PRÉ VOO", "nivel_ica": "Base", "intervalo_horas_ica": "", "intervalo_meses_ica": "", "duracao_ica": "1 H", "hxh_ica": 1},
    {"chave": "TRANSITO", "tipo_ica": "TRÂNSITO", "nivel_ica": "Base", "intervalo_horas_ica": "", "intervalo_meses_ica": "", "duracao_ica": "1 H", "hxh_ica": 1},
    {"chave": "DIARIA", "tipo_ica": "DIÁRIA", "nivel_ica": "Base", "intervalo_horas_ica": "", "intervalo_meses_ica": "", "duracao_ica": "1 H", "hxh_ica": 1},
    {"chave": "SERV 72H", "tipo_ica": "SERV 72H", "nivel_ica": "Base", "intervalo_horas_ica": 72, "intervalo_meses_ica": "", "duracao_ica": "4 H", "hxh_ica": 16},
    {"chave": "OPERACIONAL 300FH", "tipo_ica": "OPERACIONAL 300FH", "nivel_ica": "Base", "intervalo_horas_ica": 300, "intervalo_meses_ica": "", "duracao_ica": "1 D", "hxh_ica": 14},
    {"chave": "OPERACIONAL 400FH", "tipo_ica": "OPERACIONAL 400FH", "nivel_ica": "Base", "intervalo_horas_ica": 400, "intervalo_meses_ica": "", "duracao_ica": "1 D", "hxh_ica": 14},
    {"chave": "OPERACIONAL 600FH", "tipo_ica": "OPERACIONAL 600FH", "nivel_ica": "Base", "intervalo_horas_ica": 600, "intervalo_meses_ica": "", "duracao_ica": "1 D", "hxh_ica": 14},
    {"chave": "CHECK 1A", "tipo_ica": "CHECK 1A", "nivel_ica": "Base", "intervalo_horas_ica": 300, "intervalo_meses_ica": 8, "duracao_ica": "3 D", "hxh_ica": 16},
    {"chave": "CHECK 2A", "tipo_ica": "CHECK 2A", "nivel_ica": "Base", "intervalo_horas_ica": 600, "intervalo_meses_ica": 16, "duracao_ica": "4 D", "hxh_ica": 28},
    {"chave": "CHECK 3A", "tipo_ica": "CHECK 3A", "nivel_ica": "Base", "intervalo_horas_ica": 900, "intervalo_meses_ica": 24, "duracao_ica": "5 D", "hxh_ica": 76},
    {"chave": "CHECK 1C", "tipo_ica": "CHECK 1C", "nivel_ica": "Base", "intervalo_horas_ica": 2400, "intervalo_meses_ica": 48, "duracao_ica": "65 D", "hxh_ica": 526},
    {"chave": "CHECK 2C", "tipo_ica": "CHECK 2C", "nivel_ica": "Base", "intervalo_horas_ica": 4800, "intervalo_meses_ica": 96, "duracao_ica": "5 D", "hxh_ica": 17},
    {"chave": "CALENDARICA 2Y", "tipo_ica": "CALENDÁRICA 2Y", "nivel_ica": "Base", "intervalo_horas_ica": "", "intervalo_meses_ica": 24, "duracao_ica": "5 D", "hxh_ica": 30},
    {"chave": "CALENDARICA 4Y", "tipo_ica": "CALENDÁRICA 4Y", "nivel_ica": "Parque", "intervalo_horas_ica": "", "intervalo_meses_ica": 48, "duracao_ica": "10 D", "hxh_ica": 123},
    {"chave": "CALENDARICA 8Y", "tipo_ica": "CALENDÁRICA 8Y", "nivel_ica": "Parque", "intervalo_horas_ica": "", "intervalo_meses_ica": 96, "duracao_ica": "20 D", "hxh_ica": 336},
]


RELATORIO_KEYS = {
    "CHECK 1A": "CHECK 1A",
    "CHECK 2A": "CHECK 2A",
    "CHECK 3A": "CHECK 3A",
    "CHECK 1C": "CHECK 1C",
    "CHECK 2C": "CHECK 2C",
    "CALENDÁRICA DE 2 YEARS": "CALENDARICA 2Y",
    "CALENDÁRICA DE 4 YEARS": "CALENDARICA 4Y",
    "CALENDÁRICA DE 8 YEARS": "CALENDARICA 8Y",
    "OPERACIONAL DE 300FH": "OPERACIONAL 300FH",
    "OPERACIONAL DE 400FH": "OPERACIONAL 400FH",
}


def key_from_relatorio(row):
    descricao = row["descricao_mnt"].upper()
    for needle, key in RELATORIO_KEYS.items():
        if needle in descricao:
            return key
    return ""


def equal_or_blank(left, right):
    return left == "" or right == "" or left == right


def compare_row(ica, rel):
    if rel is None:
        return "somente_ica", ["Não encontrada no relatório de ciclo"]

    issues = []
    if not equal_or_blank(ica["nivel_ica"], rel["nivel_descricao"]):
        issues.append(f"nível ICA={ica['nivel_ica']} relatório={rel['nivel_descricao']}")
    if not equal_or_blank(ica["intervalo_horas_ica"], rel["intervalo_horas_voo_valor"]):
        issues.append(f"horas ICA={ica['intervalo_horas_ica']} relatório={rel['intervalo_horas_voo_valor']}")
    if not equal_or_blank(ica["intervalo_meses_ica"], rel["intervalo_meses_continuos_valor"]):
        issues.append(f"meses ICA={ica['intervalo_meses_ica']} relatório={rel['intervalo_meses_continuos_valor']}")
    if not equal_or_blank(ica["duracao_ica"], rel["duracao"]):
        issues.append(f"duração ICA={ica['duracao_ica']} relatório={rel['duracao']}")

    return ("divergente" if issues else "compatível"), issues


def main():
    payload = json.loads(RELATORIO_JSON.read_text(encoding="utf-8"))
    relatorio_by_key = {}
    relatorio_unmatched = []

    for row in payload["inspecoes"]:
        key = key_from_relatorio(row)
        if key:
            relatorio_by_key[key] = row
        else:
            relatorio_unmatched.append(row)

    rows = []
    for ica in ICA_C105:
        rel = relatorio_by_key.get(ica["chave"])
        status, issues = compare_row(ica, rel)
        rows.append(
            {
                "chave": ica["chave"],
                "status": status,
                "tipo_ica": ica["tipo_ica"],
                "tipo_relatorio": rel["descricao_mnt"] if rel else "",
                "nivel_ica": ica["nivel_ica"],
                "nivel_relatorio": rel["nivel_descricao"] if rel else "",
                "intervalo_horas_ica": ica["intervalo_horas_ica"],
                "intervalo_horas_relatorio": rel["intervalo_horas_voo_valor"] if rel else "",
                "intervalo_meses_ica": ica["intervalo_meses_ica"],
                "intervalo_meses_relatorio": rel["intervalo_meses_continuos_valor"] if rel else "",
                "duracao_ica": ica["duracao_ica"],
                "duracao_relatorio": rel["duracao"] if rel else "",
                "hxh_ica": ica["hxh_ica"],
                "seq_relatorio": rel["seq"] if rel else "",
                "observacoes": "; ".join(issues),
            }
        )

    for rel in relatorio_unmatched:
        rows.append(
            {
                "chave": "",
                "status": "somente_relatorio",
                "tipo_ica": "",
                "tipo_relatorio": rel["descricao_mnt"],
                "nivel_ica": "",
                "nivel_relatorio": rel["nivel_descricao"],
                "intervalo_horas_ica": "",
                "intervalo_horas_relatorio": rel["intervalo_horas_voo_valor"],
                "intervalo_meses_ica": "",
                "intervalo_meses_relatorio": rel["intervalo_meses_continuos_valor"],
                "duracao_ica": "",
                "duracao_relatorio": rel["duracao"],
                "hxh_ica": "",
                "seq_relatorio": rel["seq"],
                "observacoes": "Não encontrada na tabela C/SC-105 da ICA 66-31/2023 usada nesta comparação",
            }
        )

    fields = list(rows[0].keys())
    with CSV_PATH.open("w", newline="", encoding="utf-8-sig") as csv_file:
        writer = csv.DictWriter(csv_file, fieldnames=fields, delimiter=";")
        writer.writeheader()
        writer.writerows(rows)

    counts = {status: sum(1 for row in rows if row["status"] == status) for status in sorted({row["status"] for row in rows})}
    lines = [
        "# Comparação ICA 66-31/2023 x Relatório de Ciclo C-105 2805",
        "",
        "Fonte ICA: `raw/ICA 66-31 2023.pdf`, Anexo D - Projeto C/SC-105.",
        "",
        "Observação: a comparação foi feita com o Anexo D textual do PDF completo da ICA.",
        "",
        "## Resumo",
        "",
    ]
    for status, count in counts.items():
        lines.append(f"- `{status}`: {count}")
    lines.extend(
        [
            "",
            "## Principais Achados",
            "",
            "- `CHECK 1A`, `CHECK 2A`, `CHECK 3A`, `CALENDÁRICA 2Y`, `CALENDÁRICA 4Y` e `CALENDÁRICA 8Y` estão compatíveis nos intervalos e durações.",
            "- `CHECK 1C` bate em intervalo e duração, mas diverge no nível: ICA indica Base na tabela D.2, enquanto o relatório de ciclo indica Parque.",
            "- `CHECK 2C` diverge em nível e duração: ICA indica Base e 5 D; relatório de ciclo indica Parque e 10 D.",
            "- `OPERACIONAL 300FH` e `OPERACIONAL 400FH` batem no intervalo de horas, mas divergem em nível e duração: ICA indica Base e 1 D; relatório de ciclo indica Orgânico e 6 H.",
            "- `OPERACIONAL 600FH`, `PRÉ VOO`, `TRÂNSITO`, `DIÁRIA` e `SERV 72H` aparecem na ICA, mas não apareceram no relatório de ciclo processado.",
            "- Inspeções como AOL, 50FH, 100FH, 1000FH, 2400FH e 3000FH aparecem no relatório de ciclo, mas não na tabela C/SC-105 da ICA usada na comparação.",
            "",
            "## Arquivo Detalhado",
            "",
            f"- `{CSV_PATH.relative_to(ROOT)}`",
            "",
        ]
    )
    MD_PATH.write_text("\n".join(lines) + "\n", encoding="utf-8")

    print(f"Gerado: {CSV_PATH.relative_to(ROOT)}")
    print(f"Gerado: {MD_PATH.relative_to(ROOT)}")
    print(counts)


if __name__ == "__main__":
    main()
