from __future__ import annotations

from fastapi import APIRouter, Depends, HTTPException

from jarvis_finance.api.dependencies import get_db
from jarvis_finance.api.schemas.postfinance import (
    PostFinanceConfirmRequest,
    PostFinanceImportRequest,
)
from jarvis_finance.services.postfinance_service import (
    confirm_postfinance_import,
    get_postfinance_summary,
    preview_postfinance_import,
)

router = APIRouter(prefix="/postfinance", tags=["postfinance"])


def _run(callable_, *args):
    try:
        return callable_(*args)
    except ValueError as exc:
        raise HTTPException(status_code=422, detail=str(exc)) from exc


def _safe_preview(payload: dict) -> dict:
    hidden = {
        "bundle_sha256",
        "zip_sha256",
        "overview_sha256",
        "db_revision",
        "existing_batch_id",
        "conflicting_batch_id",
    }
    return {key: value for key, value in payload.items() if key not in hidden}


@router.get("/summary")
def summary(conn=Depends(get_db)):
    return _run(get_postfinance_summary, conn)


@router.post("/imports/preview")
def import_preview(request: PostFinanceImportRequest, conn=Depends(get_db)):
    return _safe_preview(_run(preview_postfinance_import, conn, request.model_dump()))


@router.post("/imports/confirm")
def import_confirm(request: PostFinanceConfirmRequest, conn=Depends(get_db)):
    return _run(confirm_postfinance_import, conn, request.model_dump())
