"""Company operational state schema cluster extracted from app.models.schemas.

This module is intentionally narrow in phase 1 of the refactor:
it hosts the company operational state response family while keeping
compatibility imports available from app.models.schemas.
"""

from __future__ import annotations

from typing import TYPE_CHECKING, Any

from pydantic import BaseModel, Field

if TYPE_CHECKING:
    from app.models.schemas import (
        DossierCase,
        DossierReviewSessionRecord,
        OperationsActionItem,
        RemediationPlanSummaryItem,
    )


class CompanyOperationalSummary(BaseModel):
    """High-level company operational summary."""

    total_projects: int = 0
    active_projects: int = 0
    blocked_projects: int = 0
    high_risk_projects: int = 0
    open_risks: int = 0
    open_cases_count: int = 0
    open_actions_count: int = 0
    blocked_items_count: int = 0
    backlog_items_count: int = 0
    active_review_sessions: int = 0
    employees_active: int = 0
    employees_blocked: int = 0
    employees_in_progress: int = 0
    employees_completed: int = 0


class CompanyOperationalProjectState(BaseModel):
    """Operational state snapshot for a single project."""

    project_code: str
    project_name: str
    client_name: str | None = None
    location: str | None = None
    project_manager: str | None = None
    status: str
    current_phase: str | None = None
    overall_progress_percent: int | None = None
    budget_status: str | None = None
    open_risks_count: int = 0
    blocked_items_count: int = 0
    upcoming_tasks_count: int = 0
    milestone_count: int = 0
    summary: str | None = None
    source: str | None = None
    metadata: dict[str, Any] = Field(default_factory=dict)


class CompanyOperationalRiskItem(BaseModel):
    """Risk item aggregated from project and dossier sources."""

    project_code: str | None = None
    project_name: str | None = None
    title: str
    severity: str | None = None
    status: str | None = None
    owner: str | None = None
    source_type: str
    reference_id: str | None = None
    mitigation: str | None = None
    metadata: dict[str, Any] = Field(default_factory=dict)


class CompanyOperationalBlockedItem(BaseModel):
    """Blocked item requiring attention across company operations."""

    project_code: str | None = None
    project_name: str | None = None
    review_session_id: str | None = None
    finding_code: str | None = None
    employee_code: str | None = None
    department_code: str | None = None
    title: str
    status: str | None = None
    owner: str | None = None
    reason: str | None = None
    source_type: str
    reference_id: str | None = None
    due_date: str | None = None
    metadata: dict[str, Any] = Field(default_factory=dict)


class CompanyOperationalBacklogItem(BaseModel):
    """Backlog or queued follow-up item."""

    project_code: str | None = None
    project_name: str | None = None
    review_session_id: str | None = None
    finding_code: str | None = None
    employee_code: str | None = None
    department_code: str | None = None
    title: str
    assignee: str | None = None
    status: str | None = None
    priority: str | None = None
    due_date: str | None = None
    source_type: str
    reference_id: str | None = None
    note: str | None = None
    metadata: dict[str, Any] = Field(default_factory=dict)


class CompanyOperationalWorkforceStatus(BaseModel):
    """Aggregated workforce execution status."""

    total_employees_active: int = 0
    employees_blocked: int = 0
    employees_in_progress: int = 0
    employees_completed: int = 0
    notes: list[str] = Field(default_factory=list)


class CompanyOperationalSourceStatus(BaseModel):
    """Availability and fallback details for an operational source."""

    source_name: str
    source: str | None = None
    available: bool = True
    used_fallback: bool = False
    record_count: int = 0
    last_updated_at: str | None = None
    message: str | None = None


class CompanyOperationalStateSummaryItem(BaseModel):
    """Compact summary card for operational state extensions."""

    code: str
    label: str
    value: str
    unit: str | None = None
    trend: str | None = None
    severity: str = "info"
    metadata: dict[str, Any] = Field(default_factory=dict)


def rebuild_company_operational_state_schemas() -> None:
    """Resolve forward references after legacy schema types are imported."""
    try:
        from app.models.operations_remediation import (
            DossierCase,
            OperationsActionItem,
            RemediationPlanSummaryItem,
        )
        from app.models.workflow_review_schemas import DossierReviewSessionRecord

        CompanyOperationalStateResponse.model_rebuild(
            _types_namespace={
                "DossierCase": DossierCase,
                "DossierReviewSessionRecord": DossierReviewSessionRecord,
                "OperationsActionItem": OperationsActionItem,
                "RemediationPlanSummaryItem": RemediationPlanSummaryItem,
            }
        )
    except Exception:
        pass


class CompanyOperationalStateResponse(BaseModel):
    """Response payload for the company operational state digital twin."""

    generated_at: str
    source: str
    used_fallback: bool
    summary: CompanyOperationalSummary
    projects: list[CompanyOperationalProjectState] = Field(default_factory=list)
    risks: list[CompanyOperationalRiskItem] = Field(default_factory=list)
    blocked_items: list[CompanyOperationalBlockedItem] = Field(default_factory=list)
    backlog: list[CompanyOperationalBacklogItem] = Field(default_factory=list)
    workforce: CompanyOperationalWorkforceStatus
    source_status: list[CompanyOperationalSourceStatus] = Field(default_factory=list)
    operations_cases: list[DossierCase] = Field(default_factory=list)
    operations_actions: list[OperationsActionItem] = Field(default_factory=list)
    operations_blockers: list[CompanyOperationalBlockedItem] = Field(
        default_factory=list
    )
    remediation_plans: list[RemediationPlanSummaryItem] = Field(default_factory=list)
    remediation_summary: list[CompanyOperationalStateSummaryItem] = Field(
        default_factory=list
    )
    dossier_reviews: list[DossierReviewSessionRecord] = Field(default_factory=list)
    policy_overview: dict[str, Any] = Field(default_factory=dict)
    message: str | None = None


rebuild_company_operational_state_schemas()
