from datetime import date from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from app.core.background.task_queue import enqueue_daily_brief_push, enqueue_project_weekly_push from app.core.database import get_db from app.core.security import ApiPrincipal, require_api_key, require_operations_enabled from app.modules.reports.constants import ReportPushKey from app.modules.reports.schemas import ( PushReportRequest, ReportResponse, WorkReportGenerateRequest, ) from app.modules.reports.service import ReportService router = APIRouter(dependencies=[Depends(require_api_key)]) @router.get("/daily-brief", response_model=ReportResponse) def daily_brief( db: Session = Depends(get_db), ) -> dict: return ReportService(db).daily_brief() @router.get("/project-weekly", response_model=ReportResponse) def project_weekly( db: Session = Depends(get_db), ) -> dict: return ReportService(db).project_weekly() @router.get("/project-lifecycle") def project_lifecycle_report( project_code: str | None = None, owner: str | None = None, period_start: date | None = None, period_end: date | None = None, include_ai: bool = False, db: Session = Depends(get_db), principal: ApiPrincipal = Depends(require_api_key), ) -> dict: return ReportService(db).project_lifecycle_report( project_code=project_code, owner=owner, period_start=period_start, period_end=period_end, include_ai=include_ai, actor=principal.actor, ) @router.get("/enterprise-analytics") def enterprise_analytics( project_code: str | None = None, owner: str | None = None, period_start: date | None = None, period_end: date | None = None, db: Session = Depends(get_db), principal: ApiPrincipal = Depends(require_api_key), ) -> dict: return ReportService(db).enterprise_analytics( project_code=project_code, owner=owner, period_start=period_start, period_end=period_end, actor=principal.actor, ) @router.get("/attendance-summary") def attendance_summary( work_date: date | None = None, db: Session = Depends(get_db), ) -> dict: return ReportService(db).attendance_summary(work_date) @router.get("/push-runs") def list_push_runs( status: str | None = None, limit: int = 100, db: Session = Depends(get_db), ) -> dict: return {ReportPushKey.ITEMS: ReportService(db).list_push_runs(status_filter=status, limit=limit)} @router.get("/push-runs/{code}") def get_push_run( code: str, db: Session = Depends(get_db), ) -> dict: return ReportService(db).get_push_run(code) @router.post("/work-reports/generate") def generate_work_report( payload: WorkReportGenerateRequest, db: Session = Depends(get_db), principal: ApiPrincipal = Depends(require_api_key), ) -> dict: if payload.persist: require_operations_enabled() return ReportService(db).generate_work_report( report_type=payload.report_type, reporter=payload.reporter, department=payload.department, project_code=payload.project_code, period_start=payload.period_start, period_end=payload.period_end, persist=payload.persist, actor=principal.actor, ) @router.post("/daily-brief/push") def push_daily_brief( payload: PushReportRequest, db: Session = Depends(get_db), principal: ApiPrincipal = Depends(require_api_key), ) -> dict: report = ReportService(db).daily_brief() return ReportService(db).push_report( report, payload.receive_id, payload.receive_id_type, principal.actor, ) @router.post("/project-weekly/push") def push_project_weekly( payload: PushReportRequest, db: Session = Depends(get_db), principal: ApiPrincipal = Depends(require_api_key), ) -> dict: report = ReportService(db).project_weekly() return ReportService(db).push_report( report, payload.receive_id, payload.receive_id_type, principal.actor, ) @router.post("/daily-brief/enqueue") def enqueue_daily_brief( payload: PushReportRequest, principal: ApiPrincipal = Depends(require_api_key), ) -> dict: return enqueue_daily_brief_push( receive_id=payload.receive_id, receive_id_type=payload.receive_id_type, actor=principal.actor, ) @router.post("/project-weekly/enqueue") def enqueue_project_weekly( payload: PushReportRequest, principal: ApiPrincipal = Depends(require_api_key), ) -> dict: return enqueue_project_weekly_push( receive_id=payload.receive_id, receive_id_type=payload.receive_id_type, actor=principal.actor, )