from __future__ import annotations from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from ..db import get_session from ..schemas import ( ReconciliationAcceptResponse, ReconciliationDecisionRead, ReconciliationIgnoreRequest, ReconciliationIgnoreResponse, ReconciliationSuggestionRead, ) from ..services.reconciliation import ( accept_reconciliation_suggestion, ignore_reconciliation_suggestion, list_reconciliation_decisions, list_reconciliation_suggestions, ) router = APIRouter(tags=["reconciliation"]) @router.get("/reconciliation/suggestions", response_model=list[ReconciliationSuggestionRead]) def get_reconciliation_suggestions( household_id: str, limit: int = 50, session: Session = Depends(get_session), ) -> list[object]: return list_reconciliation_suggestions(session, household_id=household_id, limit=limit) @router.post( "/reconciliation/suggestions/{suggestion_id}/accept", response_model=ReconciliationAcceptResponse, ) def accept_suggestion( suggestion_id: str, household_id: str, session: Session = Depends(get_session), ) -> ReconciliationAcceptResponse: try: suggestion = accept_reconciliation_suggestion( session, household_id=household_id, suggestion_id=suggestion_id, ) except LookupError as exc: raise HTTPException(status_code=404, detail=str(exc)) from exc session.commit() return ReconciliationAcceptResponse(accepted=suggestion) @router.post( "/reconciliation/suggestions/{suggestion_id}/ignore", response_model=ReconciliationIgnoreResponse, ) def ignore_suggestion( suggestion_id: str, household_id: str, payload: ReconciliationIgnoreRequest | None = None, session: Session = Depends(get_session), ) -> ReconciliationIgnoreResponse: try: suggestion, decision = ignore_reconciliation_suggestion( session, household_id=household_id, suggestion_id=suggestion_id, actor_user_id=payload.actor_user_id if payload else None, reason=payload.reason if payload else None, ) except LookupError as exc: raise HTTPException(status_code=404, detail=str(exc)) from exc session.commit() session.refresh(decision) return ReconciliationIgnoreResponse(ignored=suggestion, decision=decision) @router.get("/reconciliation/decisions", response_model=list[ReconciliationDecisionRead]) def get_reconciliation_decisions( household_id: str, session: Session = Depends(get_session), ) -> list[object]: return list_reconciliation_decisions(session, household_id=household_id)