from pydantic import BaseModel from typing import Optional, List from datetime import datetime from enum import Enum class RiskLevel(str, Enum): LOW = "low" MEDIUM = "medium" HIGH = "high" CRITICAL = "critical" class ScheduleStatus(str, Enum): ON_TRACK = "on_track" AT_RISK = "at_risk" DELAYED = "delayed" class ResourceStatus(str, Enum): ADEQUATE = "adequate" CONSTRAINED = "constrained" OVERLOADED = "overloaded" class ProjectHealthBase(BaseModel): health_score: int risk_level: RiskLevel schedule_status: ScheduleStatus resource_status: ResourceStatus class ProjectHealthResponse(ProjectHealthBase): id: str project_id: str last_updated: datetime class Config: from_attributes = True class ProjectHealthWithDetails(ProjectHealthResponse): """Extended health response with project and computed metrics.""" project_title: str project_status: str owner_name: Optional[str] = None space_name: Optional[str] = None task_count: int = 0 completed_task_count: int = 0 blocker_count: int = 0 overdue_task_count: int = 0 class ProjectHealthSummary(BaseModel): """Aggregated health metrics across all projects.""" total_projects: int healthy_count: int # health_score >= 80 at_risk_count: int # health_score 50-79 critical_count: int # health_score < 50 average_health_score: float projects_with_blockers: int projects_delayed: int class ProjectHealthDashboardResponse(BaseModel): """Full dashboard response with project list and summary.""" projects: List[ProjectHealthWithDetails] summary: ProjectHealthSummary