from __future__ import annotations

from typing import Any

from pydantic import BaseModel, Field

from app.models.schema_constants import (
    DOSSIER_REVIEW_ACTION_TYPES,
    DOSSIER_REVIEW_SESSION_STATUSES,
)

from .dossier_finding_models import DossierReviewFindingItem


class DossierReviewSnapshotItem(BaseModel):
    """Point-in-time snapshot of dossier completeness and readiness."""

    snapshot_id: str
    snapshot_type: str
    label: str | None = None
    summary: str | None = None
    captured_at: str
    captured_by_agent_code: str | None = None
    captured_by_employee_code: str | None = None
    captured_by_employee_name: str | None = None
    dossier_state: dict[str, Any] = Field(default_factory=dict)
    missing_matrix: dict[str, Any] = Field(default_factory=dict)
    readiness_summary: dict[str, Any] = Field(default_factory=dict)


class DossierReviewActionItem(BaseModel):
    """Audit log entry for dossier review workflow changes."""

    action_id: str
    action_type: str = Field(
        ...,
        description=f"One of: {', '.join(DOSSIER_REVIEW_ACTION_TYPES)}",
    )
    actor_type: str
    actor_employee_code: str | None = None
    actor_employee_name: str | None = None
    actor_agent_code: str | None = None
    action_summary: str
    before_state: dict[str, Any] = Field(default_factory=dict)
    after_state: dict[str, Any] = Field(default_factory=dict)
    action_payload: dict[str, Any] = Field(default_factory=dict)
    created_at: str


class DossierReviewSessionRecord(BaseModel):
    """Aggregated dossier review session with findings, snapshots, and audit log."""

    review_id: str
    review_code: str
    project_code: str
    project_name: str
    dossier_scope: str
    trigger_source: str
    initiated_by_employee_code: str | None = None
    initiated_by_employee_name: str | None = None
    lead_reviewer_employee_code: str | None = None
    lead_reviewer_employee_name: str | None = None
    lead_agent_code: str | None = None
    status: str = Field(
        ...,
        description=f"One of: {', '.join(DOSSIER_REVIEW_SESSION_STATUSES)}",
    )
    review_reason: str | None = None
    review_summary: str | None = None
    assigned_departments: list[str] = Field(default_factory=list)
    open_findings_count: int = 0
    resolved_findings_count: int = 0
    overdue_assignments_count: int = 0
    last_reviewed_at: str | None = None
    closed_at: str | None = None
    findings: list[DossierReviewFindingItem] = Field(default_factory=list)
    snapshots: list[DossierReviewSnapshotItem] = Field(default_factory=list)
    actions: list[DossierReviewActionItem] = Field(default_factory=list)
    metadata: dict[str, Any] = Field(default_factory=dict)


class DossierReviewSessionsResponse(BaseModel):
    """List payload for dossier review workflow records."""

    items: list[DossierReviewSessionRecord] = Field(default_factory=list)
    source: str = "fallback"
    used_fallback: bool = False
    message: str | None = None


class DossierReviewSessionCreateRequest(BaseModel):
    """Structured request payload to create one dossier review session."""

    project_code: str = Field(..., min_length=1)
    project_name: str = Field(..., min_length=1)
    dossier_scope: str = Field(default="project_dossier", min_length=1)
    trigger_source: str = Field(default="manual", min_length=1)
    initiated_by_employee_code: str | None = None
    lead_reviewer_employee_code: str | None = None
    lead_agent_code: str | None = None
    status: str = Field(
        default="draft",
        description=f"One of: {', '.join(DOSSIER_REVIEW_SESSION_STATUSES)}",
    )
    review_reason: str | None = None
    review_summary: str | None = None
    assigned_departments: list[str] = Field(default_factory=list)
    metadata: dict[str, Any] = Field(default_factory=dict)
