from __future__ import annotations

from typing import Any

from pydantic import BaseModel, Field

from app.models.company_operational_state_schemas import CompanyOperationalBlockedItem


class OperationsEvidenceItem(BaseModel):
    """Evidence item derived from dossier review findings and snapshots."""

    evidence_id: str
    case_id: str
    project_code: str
    review_session_id: str | None = None
    finding_code: str | None = None
    evidence_type: str
    source_system: str
    source_ref: str | None = None
    title: str
    excerpt: str | None = None
    availability: str = "available"
    strength: str | None = None
    supports_claim: bool = True
    metadata: dict[str, Any] = Field(default_factory=dict)


class OperationsEscalationItem(BaseModel):
    """Escalation item derived from workflow policy and review actions."""

    escalation_id: str
    case_id: str
    action_id: str | None = None
    project_code: str
    review_session_id: str | None = None
    target_department_code: str | None = None
    target_employee_code: str | None = None
    target_agent_code: str | None = None
    reason: str
    trigger_type: str
    priority: str = "medium"
    status: str = "queued"
    suggested_deadline_hours: int | None = None
    handoff_context: dict[str, Any] = Field(default_factory=dict)
    created_at: str | None = None
    resolved_at: str | None = None
    metadata: dict[str, Any] = Field(default_factory=dict)


class OperationsActionItem(BaseModel):
    """Action item representing concrete follow-up work for one operations case."""

    action_id: str
    action_code: str
    case_id: str
    project_code: str
    review_session_id: str | None = None
    finding_code: str | None = None
    action_type: str
    title: str
    description: str | None = None
    owner_department_code: str | None = None
    owner_employee_code: str | None = None
    priority: str = "medium"
    due_date: str | None = None
    status: str
    dependency_refs: list[str] = Field(default_factory=list)
    expected_outcome: str | None = None
    success_criteria: list[str] = Field(default_factory=list)
    requires_human_confirmation: bool = False
    completion_note: str | None = None
    created_at: str | None = None
    completed_at: str | None = None
    metadata: dict[str, Any] = Field(default_factory=dict)


class DossierCase(BaseModel):
    """Operational case derived from dossier review findings."""

    case_id: str
    case_code: str
    project_code: str
    review_session_id: str | None = None
    finding_id: str | None = None
    finding_code: str | None = None
    case_type: str
    title: str
    description: str | None = None
    dossier_stage: str | None = None
    department_code: str | None = None
    employee_code: str | None = None
    priority: str = "medium"
    severity: str = "medium"
    is_blocking: bool = False
    current_status: str
    opened_at: str | None = None
    closed_at: str | None = None
    source_system: str = "dossier_review"
    source_record_type: str = "finding"
    source_record_id: str | None = None
    readiness_impact: str | None = None
    operational_impact: str | None = None
    confidence_score: float | None = None
    metadata: dict[str, Any] = Field(default_factory=dict)
    evidences: list[OperationsEvidenceItem] = Field(default_factory=list)
    escalations: list[OperationsEscalationItem] = Field(default_factory=list)


class OperationsCasesResponse(BaseModel):
    """List payload for operations cases."""

    items: list[DossierCase] = Field(default_factory=list)
    source: str = "fallback"
    used_fallback: bool = False
    message: str | None = None


class OperationsActionsResponse(BaseModel):
    """List payload for operations action queue."""

    items: list[OperationsActionItem] = Field(default_factory=list)
    source: str = "fallback"
    used_fallback: bool = False
    message: str | None = None


class OperationsBlockersResponse(BaseModel):
    """List payload for operations blockers queue."""

    items: list[CompanyOperationalBlockedItem] = Field(default_factory=list)
    source: str = "fallback"
    used_fallback: bool = False
    message: str | None = None
