"""
Validadores de entrada
"""
import re
from typing import Tuple, Optional


class InputValidator:
    """
    Valida entradas do usuário
    """

    @staticmethod
    def validate_message(message: str) -> Tuple[bool, Optional[str]]:
        """
        Valida mensagem do usuário
        Retorna: (válido, erro ou None)
        """
        if not message:
            return False, "Mensagem vazia"

        if len(message) > 4000:
            return False, "Mensagem muito longa (máx 4000 caracteres)"

        # Verificar conteúdo malicioso básico
        dangerous_patterns = [
            r'<script.*?>.*?</script>',
            r'javascript:',
            r'on\w+\s*=',
        ]

        for pattern in dangerous_patterns:
            if re.search(pattern, message, re.IGNORECASE):
                return False, "Conteúdo não permitido detectado"

        return True, None

    @staticmethod
    def sanitize_message(message: str) -> str:
        """
        Sanitiza mensagem do usuário
        """
        # Remover tags HTML
        message = re.sub(r'<[^>]+>', '', message)

        # Normalizar espaços
        message = ' '.join(message.split())

        # Escapar caracteres especiais perigosos
        message = message.replace('\x00', '')

        return message.strip()

    @staticmethod
    def validate_user_id(user_id: str) -> Tuple[bool, Optional[str]]:
        """
        Valida ID do usuário
        """
        if not user_id:
            return False, "ID do usuário é obrigatório"

        if len(user_id) > 100:
            return False, "ID do usuário muito longo"

        if not re.match(r'^[a-zA-Z0-9_-]+$', user_id):
            return False, "ID do usuário contém caracteres inválidos"

        return True, None

    @staticmethod
    def validate_session_id(session_id: Optional[str]) -> Tuple[bool, Optional[str]]:
        """
        Valida ID da sessão
        """
        if session_id is None:
            return True, None

        if len(session_id) > 100:
            return False, "ID da sessão muito longo"

        return True, None

    @staticmethod
    def validate_api_key(key: str) -> bool:
        """
        Valida formato de API key
        """
        if not key:
            return False

        # OpenAI keys começam com sk-
        if key.startswith("sk-") and len(key) > 20:
            return True

        # Outros formatos
        if len(key) > 10:
            return True

        return False