from datetime import date from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from zoneinfo import ZoneInfo from app.auth.deps import get_current_user from app.daily.recap import RecapService from app.db.base import get_db from app.db.models import User from app.homelab.context import resolve_timezone router = APIRouter() @router.get("/daily/recaps") def list_daily_recaps( limit: int = 14, db: Session = Depends(get_db), user: User = Depends(get_current_user), ): service = RecapService(db, user.id) rows = service.list_recaps(limit=limit) return {"ok": True, "recaps": [service.recap_to_dict(row) for row in rows]} @router.get("/daily/recaps/{day}") def get_daily_recap( day: str, db: Session = Depends(get_db), user: User = Depends(get_current_user), ): try: parsed_day = date.fromisoformat(day) except ValueError as exc: raise HTTPException(status_code=400, detail="Invalid date") from exc service = RecapService(db, user.id) row = service.get(parsed_day) if not row or row.status not in ("posted", "text_only"): raise HTTPException(status_code=404, detail="Recap not found") return {"ok": True, "recap": service.recap_to_dict(row)} @router.post("/daily/recaps/generate") async def generate_daily_recap( day: str | None = Query(None), force: bool = Query(False), db: Session = Depends(get_db), user: User = Depends(get_current_user), ): from datetime import datetime, timezone from app.config import get_settings target_day = date.fromisoformat(day) if day else datetime.now(timezone.utc).date() tz_name = resolve_timezone(db, user.id) try: tz = ZoneInfo(tz_name) except Exception: tz = ZoneInfo("Europe/Moscow") settings = get_settings() image_enabled = settings.evening_summary_image_enabled and settings.comfyui_enabled service = RecapService(db, user.id) row = await service.generate_and_post(target_day, tz, image_enabled=image_enabled, force=force) if not row: raise HTTPException(status_code=400, detail="Cannot generate recap (character appearance missing)") return {"ok": row.status in ("posted", "text_only"), "recap": service.recap_to_dict(row)}