import uuid
from datetime import datetime
from enum import Enum

from pydantic import BaseModel

from app.schemas.common import ImageModel


class FaceStatus(str, Enum):
    known = "known"
    unknown = "unknown"
    not_detected = "not_detected"
    not_used = "not_used"


# --- Analysis response (single garment detected) ---

class GarmentAnalysisItem(BaseModel):
    """One garment detected from the image."""

    id: uuid.UUID | None = None  # None when auto_save=false (not yet persisted)
    category_main: str
    category_sub: str | None = None
    description: str | None = None
    tags: dict | None = None
    source_image_url: str | None = None
    ghost_image_url: str | None = None


class GarmentAnalyzeResponse(BaseModel):
    """Unified response for POST /garments/analyze."""

    user_id: uuid.UUID
    user_name: str | None = None
    face_status: FaceStatus
    saved: bool = True  # False when auto_save=false
    source_image_path: str | None = None  # Relative path (for /save, /ghost-preview)
    garments: list[GarmentAnalysisItem]


# --- Ghost mannequin response ---

class StyleCategoryScoreResponse(BaseModel):
    """Score and comment for a single style category."""

    score: int
    comment: str


class StyleAnalyzeResponse(BaseModel):
    """Response for POST /garments/style-analyze."""

    color_palette: StyleCategoryScoreResponse
    silhouette: StyleCategoryScoreResponse
    detail: StyleCategoryScoreResponse
    overall_score: float
    overall_comment: str
    style_tags: list[str]


class StyleAnalyzeTempResponse(BaseModel):
    """Response for POST /garments/style-analyze-temp."""

    time_context: str
    occasion_context: str
    weather_context: str
    color_harmony: str
    improvement_tips: str


class GhostGenerateResponse(BaseModel):
    id: uuid.UUID
    ghost_image_url: str


# --- Save (persist analyzed garments to DB) ---

class GarmentSaveItem(BaseModel):
    """One garment to save (from analyze_only results)."""

    category_main: str
    category_sub: str | None = None
    description: str | None = None
    tags: dict | None = None
    ghost_image_path: str | None = None  # From ghost-preview, if generated


class GarmentSaveRequest(BaseModel):
    """Request to save analyzed garments to DB."""

    user_id: uuid.UUID | None = None  # None → global user
    source_image_path: str  # From analyze response
    garments: list[GarmentSaveItem]


class GarmentSaveResponse(BaseModel):
    """Response after saving garments to DB."""

    user_id: uuid.UUID
    garments: list[GarmentAnalysisItem]


# --- Ghost preview (stateless, before save) ---

class GhostPreviewRequest(BaseModel):
    """Request ghost mannequin preview without a DB record."""

    source_image_path: str
    user_id: uuid.UUID | None = None
    category_main: str
    category_sub: str | None = None
    description: str | None = None
    tags: dict | None = None
    image_model: ImageModel | None = None  # None → server default


class GhostPreviewResponse(BaseModel):
    ghost_image_url: str
    ghost_image_path: str  # Relative path (for /save)


# --- Single garment detail ---

class GarmentDetail(BaseModel):
    id: uuid.UUID
    user_id: uuid.UUID
    user_name: str | None = None
    category_main: str
    category_sub: str | None = None
    description: str | None = None
    tags: dict | None = None
    source_image_path: str | None = None
    source_image_url: str | None = None
    ghost_image_path: str | None = None
    ghost_image_url: str | None = None
    created_at: datetime
    updated_at: datetime


# --- Update (reassign) ---

class GarmentUpdateRequest(BaseModel):
    user_id: uuid.UUID


class GarmentUpdateResponse(BaseModel):
    id: uuid.UUID
    user_id: uuid.UUID
    user_name: str | None = None


# --- Bulk reassign ---

class GarmentBulkUpdateRequest(BaseModel):
    garment_ids: list[uuid.UUID]
    user_id: uuid.UUID


class GarmentBulkUpdateResponse(BaseModel):
    updated_count: int
    user_id: uuid.UUID
    user_name: str | None = None


# --- Delete response ---

class GarmentDeleteResponse(BaseModel):
    deleted: bool = True
    id: uuid.UUID


# --- List response (pagination) ---

from app.schemas.common import GarmentBrief, PageMeta  # noqa: E402


class GarmentListResponse(BaseModel):
    items: list[GarmentBrief]
    meta: PageMeta
