from fastapi import APIRouter, Depends, HTTPException, status from admin_app.api.dependencies import get_settings, require_admin_permission from admin_app.api.schemas import ( AdminBotFlowReportCatalogResponse, AdminBotFlowReportOverviewResponse, AdminBotFlowReportResponse, AdminConversationTelemetryReportCatalogResponse, AdminConversationTelemetryReportOverviewResponse, AdminConversationTelemetryReportResponse, AdminRentalReportCatalogResponse, AdminRentalReportOverviewResponse, AdminRentalReportResponse, AdminReportDatasetListResponse, AdminReportDatasetResponse, AdminReportOverviewResponse, AdminRevenueReportCatalogResponse, AdminRevenueReportOverviewResponse, AdminRevenueReportResponse, AdminSalesReportCatalogResponse, AdminSalesReportOverviewResponse, AdminSalesReportResponse, ) from admin_app.core import AdminSettings, AuthenticatedStaffPrincipal from admin_app.services import ReportService from shared.contracts import AdminPermission router = APIRouter(prefix="/reports", tags=["reports"]) def _build_service(settings: AdminSettings) -> ReportService: return ReportService(settings) @router.get( "/overview", response_model=AdminReportOverviewResponse, ) def reports_overview( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.build_overview_payload() return AdminReportOverviewResponse( service="orquestrador-admin", mode=payload["mode"], metrics=payload["metrics"], materialization=payload["materialization"], report_families=payload["report_families"], next_steps=payload["next_steps"], ) @router.get( "/datasets", response_model=AdminReportDatasetListResponse, ) def report_datasets( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.list_datasets_payload() return AdminReportDatasetListResponse( service="orquestrador-admin", source=payload["source"], materialization=payload["materialization"], datasets=payload["datasets"], ) @router.get( "/datasets/{dataset_key}", response_model=AdminReportDatasetResponse, ) def report_dataset_detail( dataset_key: str, settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.get_dataset_payload(dataset_key) if payload is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Dataset operacional nao encontrado para relatorio.", ) return AdminReportDatasetResponse( service="orquestrador-admin", source=payload["source"], materialization=payload["materialization"], dataset=payload["dataset"], ) @router.get( "/sales/overview", response_model=AdminSalesReportOverviewResponse, ) def sales_reports_overview( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.build_sales_overview_payload() return AdminSalesReportOverviewResponse( service="orquestrador-admin", domain=payload["domain"], mode=payload["mode"], source_dataset_keys=payload["source_dataset_keys"], metrics=payload["metrics"], materialization=payload["materialization"], reports=payload["reports"], next_steps=payload["next_steps"], ) @router.get( "/sales/reports", response_model=AdminSalesReportCatalogResponse, ) def sales_reports_catalog( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.list_sales_reports_payload() return AdminSalesReportCatalogResponse( service="orquestrador-admin", domain=payload["domain"], source=payload["source"], materialization=payload["materialization"], reports=payload["reports"], ) @router.get( "/sales/reports/{report_key}", response_model=AdminSalesReportResponse, ) def sales_report_detail( report_key: str, settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.get_sales_report_payload(report_key) if payload is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Relatorio de vendas nao encontrado.", ) return AdminSalesReportResponse( service="orquestrador-admin", domain=payload["domain"], source=payload["source"], materialization=payload["materialization"], report=payload["report"], ) @router.get( "/arrecadacao/overview", response_model=AdminRevenueReportOverviewResponse, ) def revenue_reports_overview( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.build_revenue_overview_payload() return AdminRevenueReportOverviewResponse( service="orquestrador-admin", area=payload["area"], source_domain=payload["source_domain"], mode=payload["mode"], source_dataset_keys=payload["source_dataset_keys"], metrics=payload["metrics"], materialization=payload["materialization"], reports=payload["reports"], next_steps=payload["next_steps"], ) @router.get( "/arrecadacao/reports", response_model=AdminRevenueReportCatalogResponse, ) def revenue_reports_catalog( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.list_revenue_reports_payload() return AdminRevenueReportCatalogResponse( service="orquestrador-admin", area=payload["area"], source_domain=payload["source_domain"], source=payload["source"], materialization=payload["materialization"], reports=payload["reports"], ) @router.get( "/arrecadacao/reports/{report_key}", response_model=AdminRevenueReportResponse, ) def revenue_report_detail( report_key: str, settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.get_revenue_report_payload(report_key) if payload is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Relatorio de arrecadacao nao encontrado.", ) return AdminRevenueReportResponse( service="orquestrador-admin", area=payload["area"], source_domain=payload["source_domain"], source=payload["source"], materialization=payload["materialization"], report=payload["report"], ) @router.get( "/locacao/overview", response_model=AdminRentalReportOverviewResponse, ) def rental_reports_overview( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.build_rental_overview_payload() return AdminRentalReportOverviewResponse( service="orquestrador-admin", area=payload["area"], source_domain=payload["source_domain"], mode=payload["mode"], source_dataset_keys=payload["source_dataset_keys"], metrics=payload["metrics"], materialization=payload["materialization"], reports=payload["reports"], next_steps=payload["next_steps"], ) @router.get( "/locacao/reports", response_model=AdminRentalReportCatalogResponse, ) def rental_reports_catalog( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.list_rental_reports_payload() return AdminRentalReportCatalogResponse( service="orquestrador-admin", area=payload["area"], source_domain=payload["source_domain"], source=payload["source"], materialization=payload["materialization"], reports=payload["reports"], ) @router.get( "/locacao/reports/{report_key}", response_model=AdminRentalReportResponse, ) def rental_report_detail( report_key: str, settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.get_rental_report_payload(report_key) if payload is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Relatorio de locacao nao encontrado.", ) return AdminRentalReportResponse( service="orquestrador-admin", area=payload["area"], source_domain=payload["source_domain"], source=payload["source"], materialization=payload["materialization"], report=payload["report"], ) @router.get( "/fluxo-bot/overview", response_model=AdminBotFlowReportOverviewResponse, ) def bot_flow_reports_overview( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.build_bot_flow_overview_payload() return AdminBotFlowReportOverviewResponse( service="orquestrador-admin", area=payload["area"], source_domain=payload["source_domain"], mode=payload["mode"], source_dataset_keys=payload["source_dataset_keys"], metrics=payload["metrics"], materialization=payload["materialization"], reports=payload["reports"], next_steps=payload["next_steps"], ) @router.get( "/fluxo-bot/reports", response_model=AdminBotFlowReportCatalogResponse, ) def bot_flow_reports_catalog( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.list_bot_flow_reports_payload() return AdminBotFlowReportCatalogResponse( service="orquestrador-admin", area=payload["area"], source_domain=payload["source_domain"], source=payload["source"], materialization=payload["materialization"], reports=payload["reports"], ) @router.get( "/fluxo-bot/reports/{report_key}", response_model=AdminBotFlowReportResponse, ) def bot_flow_report_detail( report_key: str, settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.get_bot_flow_report_payload(report_key) if payload is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Relatorio operacional do fluxo do bot nao encontrado.", ) return AdminBotFlowReportResponse( service="orquestrador-admin", area=payload["area"], source_domain=payload["source_domain"], source=payload["source"], materialization=payload["materialization"], report=payload["report"], ) @router.get( "/telemetria-conversacional/overview", response_model=AdminConversationTelemetryReportOverviewResponse, ) def conversation_telemetry_reports_overview( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.build_conversation_telemetry_overview_payload() return AdminConversationTelemetryReportOverviewResponse( service="orquestrador-admin", area=payload["area"], source_domain=payload["source_domain"], mode=payload["mode"], source_dataset_keys=payload["source_dataset_keys"], metrics=payload["metrics"], materialization=payload["materialization"], reports=payload["reports"], next_steps=payload["next_steps"], ) @router.get( "/telemetria-conversacional/reports", response_model=AdminConversationTelemetryReportCatalogResponse, ) def conversation_telemetry_reports_catalog( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.list_conversation_telemetry_reports_payload() return AdminConversationTelemetryReportCatalogResponse( service="orquestrador-admin", area=payload["area"], source_domain=payload["source_domain"], source=payload["source"], materialization=payload["materialization"], reports=payload["reports"], ) @router.get( "/telemetria-conversacional/reports/{report_key}", response_model=AdminConversationTelemetryReportResponse, ) def conversation_telemetry_report_detail( report_key: str, settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.VIEW_REPORTS) ), ): service = _build_service(settings) payload = service.get_conversation_telemetry_report_payload(report_key) if payload is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Relatorio de telemetria conversacional nao encontrado.", ) return AdminConversationTelemetryReportResponse( service="orquestrador-admin", area=payload["area"], source_domain=payload["source_domain"], source=payload["source"], materialization=payload["materialization"], report=payload["report"], )