import pandas as pd

from app.domain.contas.parsers.bill_processor import PDFBillingProcessor


def test_danfe_payload_preserva_ordem_do_parser_nos_itens_do_plano() -> None:
    processor = PDFBillingProcessor(include_danfe=True)
    danfe_df = pd.DataFrame(
        [
            {"desc": "TIM CTRL Redes Sociais 8 0", "value": 35.96},
            {"desc": "Serviços de Valor Adicionado Conteúdo", "value": 99.99},
            {"desc": "Aya Books Premium", "value": 19.44},
        ]
    )
    raw = {
        "DANFE-COM": danfe_df,
        "Plano": pd.DataFrame(
            [
                {
                    "desc": "TIM CTRL Redes Sociais 8 0 (096/POS/SMP)",
                    "value": 35.96,
                }
            ]
        ),
    }

    payload = processor._build_danfe_payload(danfe_df, raw)

    item_names = [
        item["desc"]
        for item in payload["Planos"]["TIM CTRL Redes Sociais 8 0"]
    ]
    assert item_names == [
        "TIM CTRL Redes Sociais 8 0",
        "Serviços de Valor Adicionado Conteúdo",
        "Aya Books Premium",
    ]


def test_max_mensal_em_itens_eventuais_e_estrategico() -> None:
    """Max Mensal (streaming) em "Itens Eventuais" recebe estrategico=True e
    classe=estrategico; o avulso comum mantém classe=avulso."""
    processor = PDFBillingProcessor()
    df = pd.DataFrame(
        [
            {"desc": "Serviço Avulso X", "value": 9.90},
            {"desc": "Max Mensal", "value": 34.90},
        ]
    )

    regular, strategic = processor._split_strategic_records(df, "Itens Eventuais")

    assert [r["desc"] for r in strategic] == ["Max Mensal"]
    assert strategic[0]["estrategico"] is True
    assert [r["desc"] for r in regular] == ["Serviço Avulso X"]

    processor._annotate_class(strategic, "Itens Eventuais")
    processor._annotate_class(regular, "Itens Eventuais")
    assert strategic[0]["classe"] == "estrategico"
    assert strategic[0]["verb"] == "falar sobre"
    assert regular[0]["classe"] == "avulso"
