from __future__ import annotations

from datetime import datetime
from uuid import UUID

from pydantic import BaseModel, Field


class PromptSuggestionBase(BaseModel):
    name: str = Field(min_length=1, max_length=120)
    prompt: str = Field(min_length=1, max_length=2000)
    matching_keywords: list[str] = Field(default_factory=list)
    excluded_keywords: list[str] = Field(default_factory=list)
    required_keywords: list[str] = Field(default_factory=list)
    project_types: list[str] = Field(default_factory=list)
    priority: int = Field(default=100, ge=0, le=10000)
    is_fallback: bool = False
    is_active: bool = True
    composition_recipe_id: UUID | None = None


class PromptSuggestionCreate(PromptSuggestionBase):
    pass


class PromptSuggestionUpdate(BaseModel):
    name: str | None = Field(default=None, min_length=1, max_length=120)
    prompt: str | None = Field(default=None, min_length=1, max_length=2000)
    matching_keywords: list[str] | None = None
    excluded_keywords: list[str] | None = None
    required_keywords: list[str] | None = None
    project_types: list[str] | None = None
    priority: int | None = Field(default=None, ge=0, le=10000)
    is_fallback: bool | None = None
    is_active: bool | None = None
    composition_recipe_id: UUID | None = None


class PromptSuggestionResponse(PromptSuggestionBase):
    id: UUID
    created_at: datetime
    updated_at: datetime

    model_config = {"from_attributes": True}


class PromptSuggestionListResponse(BaseModel):
    items: list[PromptSuggestionResponse]
    total: int


class PromptSuggestionPublic(BaseModel):
    id: UUID
    prompt: str


class PromptSuggestionPublicResponse(BaseModel):
    items: list[PromptSuggestionPublic]
