"""이미지 API 스키마."""

from typing import Optional

from pydantic import BaseModel


class ImageResponse(BaseModel):
    id: str
    asset_type: str
    entity_id: Optional[str] = None
    still_id: Optional[str] = None
    episode_id: Optional[str] = None
    file_path: str
    prompt_used: Optional[str] = None
    generation_model: Optional[str] = None
    width: Optional[int] = None
    height: Optional[int] = None
    status: str
    review_notes: str
    validation_score: Optional[int] = None
    validation_result: Optional[str] = None
    sanitization_strategy: Optional[str] = None
    original_prompt: Optional[str] = None
    sanitization_note: Optional[str] = None
    variant_type: Optional[str] = None        # original | variant_a | variant_b
    angle_applied: Optional[str] = None       # JSON of angle params applied
    color_applied: Optional[str] = None       # color prompt applied
    source_image_id: Optional[str] = None     # parent image ID for i2i chain
    is_primary: bool = False
    prompt_type: Optional[str] = None         # cinematic | closeup | original
    code_version: Optional[str] = None
    prompt_file_version: Optional[str] = None
    reference_image_ids: str = "[]"
    created_at: str

    # Enriched fields (parsed from angle_applied / still context)
    angle_horizontal: Optional[int] = None
    angle_vertical: Optional[int] = None
    angle_zoom: Optional[float] = None
    color_prompt: Optional[str] = None
    is_recommended: Optional[bool] = None
    selected_for_pdf: Optional[bool] = None
    recommendation_reason: Optional[str] = None

    model_config = {"from_attributes": True}


class ValidationResponse(BaseModel):
    image_id: str
    score: Optional[int] = None
    passed: Optional[bool] = None
    issues: list[str] = []
    description: str = ""


class ReviewUpdate(BaseModel):
    status: str  # 'approved' | 'needs_fix'
    notes: str = ""
