<?php
/**
 * Archivo de Configuración de Base de Datos
 * SSR La Aguada
 * 
 * Este archivo contiene la configuración centralizada para la conexión a MySQL.
 * Todos los archivos PHP del sitio deberían usar este archivo.
 */

// ============================================
// CONFIGURACIÓN DE BASE DE DATOS
// ============================================

// Host del servidor MySQL
define('DB_HOST', 'localhost');

// Nombre de usuario de la base de datos
define('DB_USER', 'ssrlaagu_portal01');

// Contraseña de la base de datos
define('DB_PASS', 'Redhat2025...');

// Nombre de la base de datos
define('DB_NAME', 'ssrlaagu_portal01');

// Charset para la conexión (recomendado: utf8mb4)
define('DB_CHARSET', 'utf8mb4');

// ============================================
// CONFIGURACIÓN DEL SITIO
// ============================================

// URL base del sitio (sin / al final)
define('SITE_URL', 'https://portal.ssrlaaguada.cl');

// Email para notificaciones del sistema
define('ADMIN_EMAIL', 'correo@ssrlaaguada.cl');

// Nombre del sitio
define('SITE_NAME', 'SSR La Aguada');

// ============================================
// CONFIGURACIÓN DE SEGURIDAD
// ============================================

// Mostrar errores (CAMBIAR A false EN PRODUCCIÓN)
define('SHOW_ERRORS', true);

// Nivel de reporte de errores
if (SHOW_ERRORS) {
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
} else {
    error_reporting(0);
    ini_set('display_errors', 0);
}

// ============================================
// CONFIGURACIÓN DE SESIÓN (ANTES de session_start)
// ============================================

// Solo configurar sesiones si no hay una sesión activa
if (session_status() === PHP_SESSION_NONE) {
    // Configuración segura de sesiones
    ini_set('session.cookie_httponly', 1);
    ini_set('session.use_only_cookies', 1);
    ini_set('session.cookie_secure', 1); // Cambiar a 1 cuando tengas HTTPS
    
    // Tiempo de vida de la sesión (24 horas)
    ini_set('session.gc_maxlifetime', 86400);
}

// ============================================
// ZONA HORARIA
// ============================================

// Establecer zona horaria de Chile
date_default_timezone_set('America/Santiago');

// ============================================
// FUNCIÓN PARA OBTENER CONEXIÓN
// ============================================

/**
 * Obtiene una conexión a la base de datos
 * 
 * @return mysqli Objeto de conexión MySQLi
 * @throws Exception Si la conexión falla
 */
function getDBConnection() {
    static $conexion = null;
    
    // Si ya existe una conexión, reutilizarla
    if ($conexion !== null && $conexion->ping()) {
        return $conexion;
    }
    
    // Crear nueva conexión
    $conexion = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    
    // Verificar errores de conexión
    if ($conexion->connect_error) {
        // En producción, no mostrar detalles del error
        if (SHOW_ERRORS) {
            die("Error de conexión a la base de datos: " . $conexion->connect_error);
        } else {
            die("Error de conexión al sistema. Por favor, contacte al administrador.");
        }
    }
    
    // Establecer charset
    $conexion->set_charset(DB_CHARSET);
    
    return $conexion;
}

/**
 * Cierra la conexión a la base de datos
 * 
 * @param mysqli $conexion Objeto de conexión a cerrar
 */
function closeDBConnection($conexion) {
    if ($conexion && $conexion->ping()) {
        $conexion->close();
    }
}

/**
 * Ejecuta una consulta preparada de forma segura
 * 
 * @param string $sql Consulta SQL con placeholders (?)
 * @param array $params Parámetros para la consulta
 * @param string $types Tipos de parámetros (s=string, i=int, d=double, b=blob)
 * @return mysqli_result|bool Resultado de la consulta
 */
function executeQuery($sql, $params = [], $types = '') {
    $conexion = getDBConnection();
    
    $stmt = $conexion->prepare($sql);
    
    if (!$stmt) {
        if (SHOW_ERRORS) {
            die("Error en la consulta: " . $conexion->error);
        } else {
            return false;
        }
    }
    
    // Si hay parámetros, vincularlos
    if (!empty($params) && !empty($types)) {
        $stmt->bind_param($types, ...$params);
    }
    
    $stmt->execute();
    
    // Obtener resultado si es SELECT
    if (stripos(trim($sql), 'SELECT') === 0) {
        $result = $stmt->get_result();
        $stmt->close();
        return $result;
    }
    
    $stmt->close();
    return true;
}

// ============================================
// FUNCIONES AUXILIARES
// ============================================

/**
 * Sanitiza una cadena para prevenir XSS
 * 
 * @param string $string Cadena a sanitizar
 * @return string Cadena sanitizada
 */
function sanitize($string) {
    return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}

/**
 * Verifica si el usuario está autenticado
 * 
 * @return bool True si está autenticado
 */
function isAuthenticated() {
    // Asegurarse de que la sesión está iniciada
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }
    return isset($_SESSION['autenticado']) && $_SESSION['autenticado'] === true;
}

/**
 * Verifica si el usuario tiene un rol específico
 * 
 * @param array $rolesPermitidos Array de roles permitidos
 * @return bool True si tiene el rol
 */
function hasRole($rolesPermitidos) {
    if (!isAuthenticated()) {
        return false;
    }
    
    return in_array($_SESSION['rol'] ?? '', $rolesPermitidos);
}

/**
 * Redirige a una página
 * 
 * @param string $url URL de destino
 */
function redirect($url) {
    header("Location: $url");
    exit;
}

/**
 * Genera un token CSRF
 * 
 * @return string Token CSRF
 */
function generateCSRFToken() {
    // Asegurarse de que la sesión está iniciada
    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
 * 
 * @param string $token Token a verificar
 * @return bool True si es válido
 */
function verifyCSRFToken($token) {
    // Asegurarse de que la sesión está iniciada
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }
    
    return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token);
}

// ============================================
// CONSTANTES ADICIONALES
// ============================================

// Roles del sistema
define('ROLE_ADMIN', 'admin');
define('ROLE_DIRECTOR', 'director');
define('ROLE_USUARIO', 'usuario');

// Estados de contactos
define('ESTADO_NO_GESTIONADO', 'No gestionado');
define('ESTADO_GESTIONADO', 'Gestionado');

// Tipos de contacto
define('TIPO_CONSULTA', 'Consulta');
define('TIPO_RECLAMO', 'Reclamo');
define('TIPO_FELICITACIONES', 'Felicitaciones');

// ============================================
// LOG DE ERRORES PERSONALIZADO
// ============================================

/**
 * Registra un error en el log
 * 
 * @param string $mensaje Mensaje de error
 * @param string $nivel Nivel del error (ERROR, WARNING, INFO)
 */
function logError($mensaje, $nivel = 'ERROR') {
    $log_file = __DIR__ . '/logs/error_log.txt';
    $log_dir = dirname($log_file);
    
    // Crear directorio de logs si no existe
    if (!file_exists($log_dir)) {
        @mkdir($log_dir, 0755, true);
    }
    
    // Asegurarse de que la sesión está iniciada para obtener el usuario
    if (session_status() === PHP_SESSION_NONE) {
        @session_start();
    }
    
    $timestamp = date('Y-m-d H:i:s');
    $ip = $_SERVER['REMOTE_ADDR'] ?? 'Unknown';
    $user = $_SESSION['usuario'] ?? 'Anonymous';
    
    $log_message = "[$timestamp] [$nivel] [IP: $ip] [User: $user] $mensaje" . PHP_EOL;
    
    @file_put_contents($log_file, $log_message, FILE_APPEND);
}
