from pydantic import BaseModel, EmailStr, ConfigDict, Field
from typing import Optional, Literal


# --- User Schemas ---

class UserBase(BaseModel):
    """Core user fields shared across creation and responses"""
    username:str = Field(min_length=3, max_length=50)
    email:EmailStr

class UserCreate(UserBase):
    """Schema for handling user registration inputs"""
    password:str = Field(min_length=8, max_length=72)

class UserRead(UserBase):  # Naming convention: In real-world backend teams, UserRead is slightly more standard and scalable than UserResponse
    """Schema for public-facing user profiles (Filters out secrets)"""
    id:int
    is_active:bool
    is_admin:bool

    model_config = ConfigDict(from_attributes=True)  # Pydantic v2 setup to perfectly read database records (SQLAlchemy models)


# --- Authentication Schemas ---

class Token(BaseModel):
    """Schema returned upon successful login"""
    access_token:str
    token_type:str = "bearer"

class TokenData(BaseModel):
    """Schema used internally to track data stored inside the JWT token"""
    username:str | None = None


# --- Article Schemas ---

SectionId = Literal[
    "nacionales",
    "internacionales",
    "opiniones",
    "ciencias",
    "criptos",
    "trading",
    "futurologia",
    "filosofia",
    "entretenimiento",
    "curiosidades",
    "salud",
]

class ArticleBase(BaseModel):
    slug:str
    section:SectionId
    title:str
    subtitle:Optional[str] = None
    author:Optional[str] = None
    date:str = Field(..., description="ISO date YYYY-MM-DD or ISO datetime")
    tags:list[str] = []
    excerpt:Optional[str] = None
    cover_image:Optional[str] = None
    inline_image:str | None = None

class ArticleCreate(ArticleBase):
    body_html:str
    markdown_path:str

class ArticleRead(ArticleBase):
    id:int
    model_config = ConfigDict(from_attributes=True)

class ArticleFull(ArticleRead):
    body_html:str
    markdown_path:str


# --- Section Schemas ---

class Section(BaseModel):
    id:SectionId
    label:str