from __future__ import annotations

from sqlite3 import Connection

from fastapi import APIRouter, Depends, HTTPException

from jarvis_finance.api.dependencies import get_db
from jarvis_finance.api.schemas.overview import PortfolioSummary
from jarvis_finance.api.schemas.portfolio_advisor import PortfolioAdvisorSnapshot
from jarvis_finance.api.schemas.reconciliation import ReconciliationSnapshotResponse
from jarvis_finance.api.schemas.portfolio_policy import ActivePortfolioPolicyResponse, PolicyConfirmRequest, PolicyConfirmResponse, PolicyEvaluationResponse, PolicyHistoryItem, PolicyPreviewRequest, PolicyPreviewResponse, PortfolioPolicyResponse
from jarvis_finance.services.portfolio_policy import active_policy, confirm_policy, evaluate_policy, policy_detail, policy_history, preview_policy
from jarvis_finance.services.portfolio_service import get_overview
from jarvis_finance.services.portfolio_advisor import get_portfolio_advisor_snapshot
from jarvis_finance.services.reconciliation_snapshot import build_reconciliation_snapshot
from jarvis_finance.services.finance_command_center import build_finance_command_center

router = APIRouter(tags=["overview"])


@router.get("/overview/finance-command-center")
def finance_command_center(month: str | None = None, conn: Connection = Depends(get_db)) -> dict:
    try:
        return build_finance_command_center(conn, month=month)
    except ValueError as exc:
        raise HTTPException(status_code=400, detail=str(exc)) from exc


@router.get("/overview", response_model=PortfolioSummary)
def overview(conn: Connection = Depends(get_db)) -> PortfolioSummary:
    return get_overview(conn)


@router.get("/portfolio/reconciliation-snapshot", response_model=ReconciliationSnapshotResponse)
def reconciliation_snapshot(conn: Connection = Depends(get_db)) -> ReconciliationSnapshotResponse:
    """Read-only local quality view; it never imports, corrects, or confirms data."""
    return ReconciliationSnapshotResponse.model_validate(build_reconciliation_snapshot(conn))




@router.get("/portfolio/policy", response_model=ActivePortfolioPolicyResponse)
def portfolio_policy(conn: Connection = Depends(get_db)) -> dict:
    return active_policy(conn)


@router.get("/portfolio/policy/history", response_model=list[PolicyHistoryItem])
def portfolio_policy_history(conn: Connection = Depends(get_db)) -> list[dict]:
    return policy_history(conn)


@router.post("/portfolio/policy/preview", response_model=PolicyPreviewResponse)
def portfolio_policy_preview(request: PolicyPreviewRequest, conn: Connection = Depends(get_db)) -> dict:
    return preview_policy(conn, request.model_dump())


@router.post("/portfolio/policy/confirm", response_model=PolicyConfirmResponse)
def portfolio_policy_confirm(request: PolicyConfirmRequest, conn: Connection = Depends(get_db)) -> dict:
    try:
        return confirm_policy(conn, request.model_dump())
    except ValueError as exc:
        raise HTTPException(status_code=400, detail=str(exc)) from exc


@router.get("/portfolio/policy/evaluation", response_model=PolicyEvaluationResponse)
def portfolio_policy_evaluation(conn: Connection = Depends(get_db)) -> dict:
    return evaluate_policy(conn)


@router.get(
    "/portfolio/policy/{policy_id}",
    response_model=PortfolioPolicyResponse,
    responses={404: {"description": "Policy-Version nicht gefunden"}},
)
def portfolio_policy_detail(policy_id: str, conn: Connection = Depends(get_db)) -> dict:
    policy = policy_detail(conn, policy_id)
    if policy is None:
        raise HTTPException(status_code=404, detail="Policy-Version nicht gefunden")
    return policy


@router.get("/portfolio/advisor", response_model=PortfolioAdvisorSnapshot)
def portfolio_advisor(conn: Connection = Depends(get_db)) -> PortfolioAdvisorSnapshot:
    return get_portfolio_advisor_snapshot(conn)
