"""
Funções auxiliares
"""
import hashlib
import json
import time
from typing import Any, Dict, List
from datetime import datetime


def generate_hash(text: str, length: int = 12) -> str:
    """Gera hash curto"""
    return hashlib.sha256(text.encode()).hexdigest()[:length]


def timing_decorator(func):
    """Decorator para medir tempo de execução"""
    async def wrapper(*args, **kwargs):
        start = time.time()
        result = await func(*args, **kwargs)
        elapsed = time.time() - start
        return result, elapsed
    return wrapper


def safe_json_loads(text: str, default: Any = None) -> Any:
    """Carrega JSON com fallback"""
    try:
        return json.loads(text)
    except (json.JSONDecodeError, TypeError):
        return default


def chunk_list(items: List[Any], chunk_size: int) -> List[List[Any]]:
    """Divide lista em chunks"""
    return [items[i:i + chunk_size] for i in range(0, len(items), chunk_size)]


def format_datetime(dt: datetime, fmt: str = "%d/%m/%Y %H:%M") -> str:
    """Formata datetime"""
    return dt.strftime(fmt)


def truncate_middle(text: str, max_length: int = 50) -> str:
    """Trunca texto do meio"""
    if len(text) <= max_length:
        return text
    half = (max_length - 3) // 2
    return text[:half] + "..." + text[-half:]


def merge_dicts(base: Dict, override: Dict) -> Dict:
    """Mescla dicionários recursivamente"""
    result = base.copy()
    for key, value in override.items():
        if key in result and isinstance(result[key], dict) and isinstance(value, dict):
            result[key] = merge_dicts(result[key], value)
        else:
            result[key] = value
    return result


def estimate_tokens(text: str) -> int:
    """
    Estima número de tokens (aproximação)
    ~4 caracteres por token para português
    """
    return len(text) // 4 + 1


def rate_limit_check(key: str, max_requests: int, window_seconds: int, storage: Dict) -> bool:
    """
    Verifica rate limit simples
    """
    now = time.time()
    window_start = now - window_seconds

    if key not in storage:
        storage[key] = []

    # Limpar entradas antigas
    storage[key] = [t for t in storage[key] if t > window_start]

    if len(storage[key]) >= max_requests:
        return False

    storage[key].append(now)
    return True


def mask_sensitive_data(data: Dict, sensitive_keys: List[str] = None) -> Dict:
    """
    Mascara dados sensíveis em dicionário
    """
    if sensitive_keys is None:
        sensitive_keys = ['password', 'token', 'secret', 'key', 'api_key', 'credit_card']

    masked = {}
    for key, value in data.items():
        if any(s in key.lower() for s in sensitive_keys):
            masked[key] = "****"
        elif isinstance(value, dict):
            masked[key] = mask_sensitive_data(value, sensitive_keys)
        else:
            masked[key] = value

    return masked