import re
from typing import Literal
from pydantic import BaseModel, EmailStr, validator


# Modelo para registrar un nuevo usuario
class UserCreate(BaseModel):
    email: EmailStr
    password: str
    role: Literal["admin", "capturista"]

    @validator("password")
    def strong_password(cls, v):
        if len(v) < 8:
            raise ValueError("Password must be at least 8 characters long")
        if not re.search(r"[a-z]", v):
            raise ValueError("Password must contain at least one lowercase letter")
        if not re.search(r"[A-Z]", v):
            raise ValueError("Password must contain at least one uppercase letter")
        if not re.search(r"[0-9]", v):
            raise ValueError("Password must contain at least one number")
        if not re.search(r"[!@#$%^&*(),.?\":{}|<>]", v):
            raise ValueError("Password must contain at least one special character")
        return v


# Modelo para devolver información de usuario sin la contraseña
class UserOut(BaseModel):
    email: EmailStr
    role: Literal["admin", "capturista"]


# Modelo para login
class UserLogin(BaseModel):
    email: EmailStr
    password: str


# Modelo para información del token
class TokenData(BaseModel):
    email: str
    role: str
