from __future__ import annotations

from datetime import datetime
from typing import Any, Literal, Optional
from uuid import UUID

from pydantic import BaseModel, Field


L3Status = Literal[
    "discovered", "validated", "needs_refinement", "retained_l3",
    "approved_for_architecture_review", "rejected", "promoted", "superseded",
]


class L3CandidateCreate(BaseModel):
    candidate_id: Optional[str] = Field(default=None, max_length=160)
    semantic: str = Field(min_length=1, max_length=160)
    project_id: UUID
    generation_run_id: Optional[UUID] = None
    scope: Literal["project"] = "project"
    requirement_summary: str = Field(min_length=1)
    gap_reason: str = Field(min_length=1)
    architecture_manifest_sha: Optional[str] = Field(default=None, max_length=64)
    proposed_contract: dict[str, Any] = Field(default_factory=dict)
    dependencies: list[str] = Field(default_factory=list)
    evidence: dict[str, Any] = Field(default_factory=dict)
    source_locations: list[str] = Field(default_factory=list)
    commit_sha: Optional[str] = Field(default=None, max_length=64)
    version: str = Field(default="0.1.0", max_length=32)
    promotion_candidate: bool = True


class L3ReviewAction(BaseModel):
    action: Literal[
        "approve_for_architecture_review", "request_refinement", "keep_project_specific",
        "relate", "reject", "promote", "supersede",
    ]
    notes: Optional[str] = None
    related_candidate_ids: list[str] = Field(default_factory=list)


class L3CandidateResponse(BaseModel):
    id: UUID
    candidate_id: str
    semantic: str
    scope: str
    status: str
    project_id: UUID
    generation_run_id: Optional[UUID]
    requirement_summary: str
    gap_reason: str
    architecture_manifest_sha: Optional[str]
    proposed_contract: dict[str, Any]
    dependencies: list[str]
    evidence: dict[str, Any]
    source_locations: list[str]
    related_candidate_ids: list[str]
    commit_sha: Optional[str]
    version: str
    promotion_candidate: bool
    review_notes: Optional[str]
    reviewed_by: Optional[UUID]
    reviewed_at: Optional[datetime]
    created_at: datetime
    updated_at: datetime

    model_config = {"from_attributes": True}
