"""Schémas Pydantic pour la validation des données d'histoire."""

from typing import Optional
from pydantic import BaseModel, Field


class StoryCreateSchema(BaseModel):
    """Schéma pour la création d'une nouvelle histoire.
    
    Peut être utilisé de deux manières :
    1. Mode pitch : fournir un pitch (et optionnellement un titre), l'IA extrait tout
    2. Mode manuel : fournir tous les champs individuellement
    
    Attributes:
        pitch: Description libre de l'histoire souhaitée (optionnel, mode pitch).
        title: Titre de l'histoire (optionnel en mode pitch).
        genre: Genre littéraire (optionnel).
        epoch: Époque de l'histoire (optionnel).
        reality_level: Niveau de réalité 0-100 (optionnel).
        narrative_perspective: Perspective narrative ('second' ou 'third').
        protagonist_name: Nom du protagoniste (si 3ème personne, optionnel).
        protagonist_gender: Genre du protagoniste ('he' ou 'she', si 3ème personne).
        game_mode: Mode de jeu ('choices' ou 'free').
    """
    
    # Mode pitch
    pitch: Optional[str] = Field(None, min_length=20, max_length=2000)
    
    # Champs classiques (optionnels si pitch fourni)
    title: Optional[str] = Field(None, min_length=1, max_length=255)
    genre: Optional[str] = Field(None, max_length=100)
    epoch: Optional[str] = Field(None, max_length=100)
    reality_level: Optional[int] = Field(None, ge=0, le=100)
    narrative_perspective: Optional[str] = Field(None, pattern='^(second|third)$')
    protagonist_name: Optional[str] = Field(None, max_length=100)
    protagonist_gender: Optional[str] = Field(None, pattern='^(he|she)$')
    game_mode: str = Field(default='choices', pattern='^(choices|free)$')


class StoryUpdateSchema(BaseModel):
    """Schéma pour la mise à jour d'une histoire.
    
    Attributes:
        title: Nouveau titre (optionnel).
        status: Nouveau statut (optionnel).
        game_mode: Nouveau mode de jeu (optionnel).
        publication_description: Description pour galerie (optionnel).
    """
    
    title: Optional[str] = Field(None, min_length=1, max_length=255)
    status: Optional[str] = Field(None, pattern='^(in_progress|completed|abandoned)$')
    game_mode: Optional[str] = Field(None, pattern='^(choices|free)$')
    publication_description: Optional[str] = None


class StoryPublishSchema(BaseModel):
    """Schéma pour publier une histoire.
    
    Attributes:
        publication_status: Statut de publication ('ongoing' ou 'finished').
        publication_description: Description pour la galerie publique.
    """
    
    publication_status: str = Field(default='ongoing', pattern='^(ongoing|finished)$')
    publication_description: Optional[str] = Field(None, max_length=1000)


class StoryResponseSchema(BaseModel):
    """Schéma pour la réponse contenant les données d'une histoire.
    
    Attributes:
        id: ID de l'histoire.
        user_id: ID de l'utilisateur créateur.
        title: Titre.
        genre: Genre.
        epoch: Époque.
        reality_level: Niveau de réalité.
        narrative_perspective: Perspective narrative.
        protagonist_name: Nom du protagoniste.
        protagonist_gender: Genre du protagoniste.
        cover_image_url: URL de la couverture.
        game_mode: Mode de jeu.
        status: Statut.
        is_published: Publiée ou non.
        publication_status: Statut de publication.
        turn_count: Nombre de tours.
        views_count: Nombre de vues.
        likes_count: Nombre de likes.
        created_at: Date de création.
        updated_at: Date de dernière mise à jour.
        last_played_at: Date de dernière partie.
    """
    
    id: str
    user_id: str
    title: str
    genre: Optional[str]
    epoch: Optional[str]
    reality_level: int
    narrative_perspective: str
    protagonist_name: Optional[str]
    protagonist_gender: Optional[str]
    cover_image_url: Optional[str]
    game_mode: str
    status: str
    is_published: bool
    publication_status: str
    turn_count: int
    views_count: int
    likes_count: int
    created_at: str
    updated_at: str
    last_played_at: str
    
    model_config = {
        "from_attributes": True
    }

