"""Cadastros estruturais que todo ambiente precisa (Plano de Contas e dicionário de processos modelo).

Usados pelos scripts `scripts/seed_*.py` (dev) e pelo bootstrap de produção (`producao.py`).
Cada função só adiciona e faz `flush` — quem chama decide o `commit`.
"""

from sqlalchemy.orm import Session

from custos_precificacao import plano_padrao
from custos_precificacao.models import Area, Atividade, Macroprocesso, Processo


def semear_plano_de_contas(session: Session) -> int:
    """Plano de Contas padrão (`plano_padrao.PLANO_PADRAO`, numerado no estilo APP32). Devolve o nº de contas criadas.
    Idempotente: contas que já existem (pela chave) não são tocadas."""
    return sum(plano_padrao.garantir_conta(session, c.chave)[1] for c in plano_padrao.PLANO_PADRAO)


def semear_dicionario_processos(session: Session) -> tuple[int, int, int, int]:
    """Dicionário MODELO (Área/Macroprocesso/Processo/Atividade) — placeholder até chegar o definitivo.

    Devolve (áreas, macroprocessos, processos, atividades).
    """
    areas = {
        "AR-01": Area(codigo="AR-01", nome="Finalísticos"),
        "AR-02": Area(codigo="AR-02", nome="Suporte"),
    }
    session.add_all(areas.values())
    session.flush()

    macroprocessos = {
        "MP-01": Macroprocesso(codigo="MP-01", nome="Produção", area_id=areas["AR-01"].id),
        "MP-02": Macroprocesso(codigo="MP-02", nome="Comercial", area_id=areas["AR-01"].id),
        "MP-03": Macroprocesso(codigo="MP-03", nome="Administrativo", area_id=areas["AR-02"].id),
        "MP-04": Macroprocesso(codigo="MP-04", nome="Financeiro", area_id=areas["AR-02"].id),
        "MP-05": Macroprocesso(codigo="MP-05", nome="Diretoria", area_id=areas["AR-02"].id),
    }
    session.add_all(macroprocessos.values())
    session.flush()

    processos = {
        "PR-01": Processo(codigo="PR-01", nome="Mistura", macroprocesso_id=macroprocessos["MP-01"].id),
        "PR-02": Processo(codigo="PR-02", nome="Embalagem", macroprocesso_id=macroprocessos["MP-01"].id),
        "PR-03": Processo(codigo="PR-03", nome="Geração de Demanda", macroprocesso_id=macroprocessos["MP-02"].id),
        "PR-04": Processo(codigo="PR-04", nome="Faturamento", macroprocesso_id=macroprocessos["MP-02"].id),
        "PR-05": Processo(codigo="PR-05", nome="Gestão de Pessoas", macroprocesso_id=macroprocessos["MP-03"].id),
        "PR-06": Processo(codigo="PR-06", nome="Contas a Pagar", macroprocesso_id=macroprocessos["MP-04"].id),
        "PR-07": Processo(codigo="PR-07", nome="Contas a Receber", macroprocesso_id=macroprocessos["MP-04"].id),
        "PR-08": Processo(codigo="PR-08", nome="Planejamento Estratégico", macroprocesso_id=macroprocessos["MP-05"].id),
    }
    session.add_all(processos.values())
    session.flush()

    atividades = [
        Atividade(codigo="AT-01", nome="Pesagem de Insumos", processo_id=processos["PR-01"].id),
        Atividade(codigo="AT-02", nome="Mistura de Ingredientes", processo_id=processos["PR-01"].id),
        Atividade(codigo="AT-03", nome="Envase do Produto", processo_id=processos["PR-02"].id),
        Atividade(codigo="AT-04", nome="Rotulagem e Codificação", processo_id=processos["PR-02"].id),
        Atividade(codigo="AT-05", nome="Prospecção de Clientes", processo_id=processos["PR-03"].id),
        Atividade(codigo="AT-06", nome="Visita Comercial", processo_id=processos["PR-03"].id),
        Atividade(codigo="AT-07", nome="Emissão de Nota Fiscal", processo_id=processos["PR-04"].id),
        Atividade(codigo="AT-08", nome="Processamento de Folha de Pagamento", processo_id=processos["PR-05"].id),
        Atividade(codigo="AT-09", nome="Pagamento a Fornecedores", processo_id=processos["PR-06"].id),
        Atividade(codigo="AT-10", nome="Cobrança de Clientes", processo_id=processos["PR-07"].id),
        Atividade(codigo="AT-11", nome="Reunião de Planejamento", processo_id=processos["PR-08"].id),
    ]
    session.add_all(atividades)

    return len(areas), len(macroprocessos), len(processos), len(atividades)
