from __future__ import annotations

from fastapi import APIRouter, Depends, HTTPException

from jarvis_finance.api.dependencies import get_db
from jarvis_finance.api.schemas.truewealth import (
    TrueWealthImportConfirmRequest,
    TrueWealthImportPreviewRequest,
    TrueWealthManualConfirmRequest,
    TrueWealthManualPreviewRequest,
    TrueWealthManualStatusRequest,
)
from jarvis_finance.services.truewealth_service import (
    confirm_manual_truewealth_value,
    confirm_truewealth_import,
    get_truewealth_summary,
    preview_manual_truewealth_value,
    preview_truewealth_import,
    set_manual_truewealth_value_active,
)

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


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


def _safe_import_preview(payload: dict) -> dict:
    return {
        key: value
        for key, value in payload.items()
        if key not in {"file_sha256", "existing_batch_id", "conflicting_batch_id"}
    }


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


@router.post("/imports/preview")
def import_preview(request: TrueWealthImportPreviewRequest, conn=Depends(get_db)):
    return _safe_import_preview(_run(preview_truewealth_import, conn, request.model_dump()))


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


@router.post("/manual-values/preview")
def manual_preview(request: TrueWealthManualPreviewRequest, conn=Depends(get_db)):
    return _run(preview_manual_truewealth_value, conn, request.model_dump())


@router.post("/manual-values/confirm")
def manual_confirm(request: TrueWealthManualConfirmRequest, conn=Depends(get_db)):
    return _run(confirm_manual_truewealth_value, conn, request.model_dump())


@router.post("/manual-values/{snapshot_id}/status")
def manual_status(
    snapshot_id: str,
    request: TrueWealthManualStatusRequest,
    conn=Depends(get_db),
):
    return _run(set_manual_truewealth_value_active, conn, snapshot_id, request.model_dump())
