"""Finance router — daily revenue vs cost reconciliation.""" from __future__ import annotations import datetime as _dt from typing import Any, Optional from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from app.database import get_db from app.models.upstream import Upstream from app.models.website import Website from app.services.finance_service import get_daily_summary, yesterday_shanghai from app.utils.auth import get_current_user router = APIRouter(prefix="/api/finance", tags=["finance"]) @router.get("/daily-summary") def daily_summary( date: Optional[str] = Query(None, description="YYYY-MM-DD, defaults to yesterday Asia/Shanghai"), db: Session = Depends(get_db), _: Any = Depends(get_current_user), ) -> dict: """Return daily revenue vs cost summary. Never raises for individual item failures — each failed website/upstream is included in the response with status='failed' and an error message. Only raises HTTP errors for bad request parameters. """ if date: try: target = _dt.date.fromisoformat(date) except ValueError: raise HTTPException(400, f"Invalid date format: {date!r}. Expected YYYY-MM-DD.") else: target = yesterday_shanghai() websites = db.query(Website).filter(Website.enabled == True).all() upstreams = db.query(Upstream).filter(Upstream.enabled == True).all() return get_daily_summary(websites, upstreams, target)