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,
    PostFinanceConfirmResponse,
    PostFinanceImportRequest,
    PostFinancePreviewResponse,
)
from jarvis_finance.services.postfinance_service import (
    confirm_postfinance_import,
    get_postfinance_summary,
    preview_postfinance_import,
)

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


def _safe_error_message(message: str) -> str:
    text = message.lower()
    if "encrypted" in text or "passwort" in text:
        return "PDF ist passwortgeschützt und kann nicht geprüft werden."
    if "selectable text" in text or "textschicht" in text:
        return "PDF enthält keine auswertbare Textschicht."
    if "page limit" in text:
        return "PDF überschreitet das sichere Seitenlimit."
    if "valid zip" in text or "bad zip" in text or "gültiges zip" in text:
        return "ZIP ist beschädigt oder kein gültiges ZIP-Archiv."
    if "unsafe entry" in text or "unsafe" in text:
        return "ZIP enthält einen unsicheren Dateipfad oder Link."
    if "unsupported entry" in text or "unsupported document" in text:
        return "ZIP enthält einen nicht unterstützten Dokumenttyp."
    if "complete snapshot" in text or "required totals" in text:
        return "Portfolioübersicht ist unvollständig oder enthält nicht alle benötigten Komponenten."
    if "ambiguous" in text:
        return "Dokumentzuordnung ist mehrdeutig; Confirm bleibt gesperrt."
    if "duplicate economic events" in text or "duplicate document" in text or "doppelt" in text:
        return "Dokument wurde bereits im gleichen Upload erkannt."
    if "empty" in text or "leer" in text:
        return "Eine ausgewählte Datei ist leer."
    return "PostFinance-Unterlagen konnten nicht sicher geprüft werden."


def _run(callable_, *args):
    try:
        return callable_(*args)
    except ValueError as exc:
        raise HTTPException(status_code=422, detail=_safe_error_message(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", response_model=PostFinancePreviewResponse)
def import_preview(request: PostFinanceImportRequest, conn=Depends(get_db)):
    return _safe_preview(_run(preview_postfinance_import, conn, request.model_dump()))


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