<?php

/**
 * Funciones auxiliares globales
 */

// Configuración de errores
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/../../logs/app.log');

use App\Config\Env;

/**
 * Escapa HTML para prevenir XSS
 */
function e($string)
{
    return htmlspecialchars($string ?? '', ENT_QUOTES, 'UTF-8');
}

/**
 * Redirige a una URL
 */
function redirect($url)
{
    header("Location: $url");
    exit;
}

/**
 * Obtiene la URL base del sitio
 */
function siteUrl($path = '')
{
    $base = Env::get('SITE_URL', 'http://localhost');
    return rtrim($base, '/') . '/' . ltrim($path, '/');
}

/**
 * Obtiene la URL del asset
 */
function asset($path)
{
    return siteUrl('assets/' . ltrim($path, '/'));
}

/**
 * Formatea una fecha
 */
function formatDate($date, $format = 'd/m/Y')
{
    if (empty($date)) return '';
    
    if (is_string($date)) {
        $date = new DateTime($date);
    }
    
    return $date->format($format);
}

/**
 * Formatea una hora
 */
function formatTime($time)
{
    if (empty($time)) return 'Cerrado';
    
    if (is_string($time)) {
        $time = new DateTime($time);
    }
    
    return $time->format('H:i');
}

/**
 * Obtiene el nombre del día de la semana
 */
function getDayName($dayNumber)
{
    $days = [
        0 => 'Domingo',
        1 => 'Lunes',
        2 => 'Martes',
        3 => 'Miércoles',
        4 => 'Jueves',
        5 => 'Viernes',
        6 => 'Sábado'
    ];
    
    return $days[$dayNumber] ?? '';
}

/**
 * Genera un token CSRF
 */
function csrfToken()
{
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }
    
    if (!isset($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    
    return $_SESSION['csrf_token'];
}

/**
 * Verifica un token CSRF
 */
function verifyCsrfToken($token)
{
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }
    
    return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token);
}

/**
 * Muestra un mensaje flash
 */
function flash($key, $message = null)
{
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }
    
    if ($message === null) {
        // Obtener mensaje
        $msg = $_SESSION['flash_' . $key] ?? null;
        unset($_SESSION['flash_' . $key]);
        return $msg;
    } else {
        // Guardar mensaje
        $_SESSION['flash_' . $key] = $message;
    }
}

/**
 * Verifica si hay un mensaje flash
 */
function hasFlash($key)
{
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }
    
    return isset($_SESSION['flash_' . $key]);
}

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

/**
 * Verifica si la petición es AJAX
 */
function isAjax()
{
    return !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && 
           strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}

/**
 * Obtiene el método HTTP de la petición
 */
function requestMethod()
{
    return $_SERVER['REQUEST_METHOD'];
}

/**
 * Verifica si es una petición POST
 */
function isPost()
{
    return requestMethod() === 'POST';
}

/**
 * Verifica si es una petición GET
 */
function isGet()
{
    return requestMethod() === 'GET';
}

/**
 * Obtiene un valor de $_POST de forma segura
 */
function post($key, $default = null)
{
    return $_POST[$key] ?? $default;
}

/**
 * Obtiene un valor de $_GET de forma segura
 */
function get($key, $default = null)
{
    return $_GET[$key] ?? $default;
}

/**
 * Debug: imprime y termina
 */
function dd(...$vars)
{
    echo '<pre>';
    foreach ($vars as $var) {
        var_dump($var);
    }
    echo '</pre>';
    die();
}
