<?php
/**
 * Archivo de configuración compartido
 * Carga variables de entorno y proporciona funciones helper
 */

// Cargar variables de entorno si aún no están cargadas
if (!isset($_ENV['DB_HOST'])) {
    if (file_exists(__DIR__ . '/../../.env')) {
        $lines = file(__DIR__ . '/../../.env', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
        foreach ($lines as $line) {
            if (strpos(trim($line), '#') === 0) continue;
            if (strpos($line, '=') === false) continue;
            list($key, $value) = explode('=', $line, 2);
            $_ENV[trim($key)] = trim($value);
        }
    }
}

// Timezone
date_default_timezone_set($_ENV['TIME_ZONE_ENVIOS'] ?? 'America/Mexico_City');

/**
 * Obtener variable de entorno
 */
function env($key, $default = null) {
    return $_ENV[$key] ?? getenv($key) ?: $default;
}

/**
 * Registrar log en archivo
 */
function logToFile($filename, $message, $level = 'INFO') {
    $logDir = __DIR__ . '/../../logs/';
    $logFile = $logDir . $filename;
    
    $timestamp = date('Y-m-d H:i:s');
    $logMessage = "[{$timestamp}] [{$level}] {$message}\n";
    
    file_put_contents($logFile, $logMessage, FILE_APPEND);
}

/**
 * Sanitizar HTML para prevenir XSS
 */
function sanitizeHTML($html) {
    return htmlspecialchars($html, ENT_QUOTES, 'UTF-8');
}

/**
 * Validar email
 */
function isValidEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

/**
 * Generar token aleatorio
 */
function generateRandomToken($length = 32) {
    return bin2hex(random_bytes($length / 2));
}

/**
 * Formatear bytes a tamaño legible
 */
function formatBytes($bytes, $precision = 2) {
    $units = ['B', 'KB', 'MB', 'GB', 'TB'];
    
    for ($i = 0; $bytes > 1024 && $i < count($units) - 1; $i++) {
        $bytes /= 1024;
    }
    
    return round($bytes, $precision) . ' ' . $units[$i];
}

/**
 * Respuesta JSON
 */
function jsonResponse($data, $statusCode = 200) {
    http_response_code($statusCode);
    header('Content-Type: application/json');
    echo json_encode($data);
    exit;
}

/**
 * Verifica si el usuario autenticado tiene un permiso específico.
 * @param string $permissionName El nombre del permiso a verificar (ej. 'crear_plantillas', 'gestionar_usuarios').
 * @param string $platform El módulo al que aplica el permiso (ej. 'discord', 'telegram', 'global').
 * @return bool True si el usuario tiene el permiso, false en caso contrario.
 */
function hasPermission($permissionName, $platform = 'global') {
    $userData = JWTAuth::getUserData(); // Obtener datos del usuario logueado

    // Si no hay datos de usuario o no está autenticado, no tiene permisos
    if (!$userData || !isset($userData->userId)) {
        return false;
    }

    // Los administradores tienen todos los permisos
    if (isset($userData->rol) && $userData->rol === 'Admin') {
        return true;
    }

    // Si el usuario no es Admin, verificar permisos específicos
    // Los permisos se cargan en el JWT al iniciar sesión
    if (isset($userData->permissions) && is_array($userData->permissions)) {
        foreach ($userData->permissions as $perm) {
            // Un permiso 'manage_templates' global debería dar acceso a 'manage_templates' en cualquier plataforma
            // Un permiso 'manage_templates_discord' solo en Discord
            if ($perm === $permissionName || $perm === $permissionName . '_' . $platform) {
                return true;
            }
        }
    }

    return false;
}

/**
 * Dividir texto en múltiples mensajes según límite de caracteres
 */
function splitMessage($text, $maxLength = 2000) {
    if (strlen($text) <= $maxLength) {
        return [$text];
    }
    
    $messages = [];
    $lines = explode("\n", $text);
    $currentMessage = '';
    
    foreach ($lines as $line) {
        if (strlen($currentMessage) + strlen($line) + 1 > $maxLength) {
            if ($currentMessage) {
                $messages[] = trim($currentMessage);
                $currentMessage = '';
            }
            
            // Si una línea sola es muy larga, dividirla
            if (strlen($line) > $maxLength) {
                $chunks = str_split($line, $maxLength);
                foreach ($chunks as $chunk) {
                    $messages[] = $chunk;
                }
            } else {
                $currentMessage = $line . "\n";
            }
        } else {
            $currentMessage .= $line . "\n";
        }
    }
    
    if ($currentMessage) {
        $messages[] = trim($currentMessage);
    }
    
    return $messages;
}
