"""Módulo de validação de entrada."""

from marshmallow import Schema, fields, validate, ValidationError
from src.security import security_logger

class UserRegisterSchema(Schema):
    username = fields.Str(required=True, validate=[
        validate.Length(min=3, max=50),
        validate.Regexp(r'^[a-zA-Z0-9_]+$', error='Username deve conter apenas letras, números e underscore')
    ])
    password = fields.Str(required=True, validate=[
        validate.Length(min=8),
        validate.Regexp(r'^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$',
                       error='Senha deve conter pelo menos uma letra, um número e um caractere especial')
    ])
    email = fields.Email(required=True, error_messages={"required": "E-mail é obrigatório.", "invalid": "E-mail inválido."})

class UserLoginSchema(Schema):
    email = fields.Email(required=True, error_messages={"required": "E-mail é obrigatório.", "invalid": "E-mail inválido."})
    password = fields.Str(required=True, validate=[
        validate.Length(min=8),
        validate.Regexp(r'^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$',
                       error='Senha deve conter pelo menos uma letra, um número e um caractere especial')
    ])

class ChatMessageSchema(Schema):
    """Schema para validação de mensagens de chat."""
    message = fields.Str(required=True, validate=[
        validate.Length(min=1, max=1000),
        validate.Regexp(r'^[^<>]*$', error='Mensagem não pode conter caracteres HTML')
    ])
    agent_id = fields.Int(required=True)

def validate_user_register_data(data):
    try:
        schema = UserRegisterSchema()
        return schema.load(data)
    except ValidationError as e:
        security_logger.warning(f"Validação de registro falhou: {str(e)}")
        raise

def validate_user_login_data(data):
    try:
        schema = UserLoginSchema()
        return schema.load(data)
    except ValidationError as e:
        security_logger.warning(f"Validação de login falhou: {str(e)}")
        raise

def validate_chat_message(data):
    """Valida mensagem de chat."""
    try:
        schema = ChatMessageSchema()
        return schema.load(data)
    except ValidationError as e:
        security_logger.warning(f"Validação de mensagem falhou: {str(e)}")
        raise

def sanitize_input(text):
    """Sanitiza entrada de texto."""
    if not isinstance(text, str):
        return text
    
    text = text.replace('<', '&lt;').replace('>', '&gt;')
    
    text = ''.join(char for char in text if ord(char) >= 32)
    
    return text 