"""/api/settlement — the Monthly Split report + suggested BW invoice
(services/money/settlement.py; owner-only via can_see_income), plus the
"apply to month" WRITE (services/money/settlement_apply.py — tags rows;
the frozen report engine itself is untouched)."""

from __future__ import annotations

from fastapi import APIRouter
from pydantic import BaseModel

from app.routers.deps import ActorDep, ApiError, SessionDep
from app.services.errors import ServiceError
from app.services.money import settlement as settlement_svc
from app.services.money import settlement_apply as apply_svc

router = APIRouter()


def _run(fn, *args):
    try:
        return fn(*args)
    except ServiceError as exc:
        raise ApiError(exc.status, exc.code, exc.summary, exc.detail) from exc


class ApplyBody(BaseModel):
    month: str = ""
    invoice_ids: list[str] | None = None
    expense_ids: list[str] | None = None


@router.get("/api/settlement")
def get_settlement_summary(session: SessionDep, actor: ActorDep) -> dict:
    return _run(settlement_svc.settlement_summary, session, actor)


@router.post("/api/settlement/apply")
def apply_to_month(session: SessionDep, actor: ActorDep, body: ApplyBody) -> dict:
    return _run(apply_svc.apply_to_month, session, actor, body.model_dump())


@router.get("/api/settlement/{month}")
def get_settlement_detail(month: str, session: SessionDep, actor: ActorDep) -> dict:
    return _run(settlement_svc.settlement_detail, session, actor, month)
