<?php
/**
 * Configuración General del Sistema
 */

session_start();

// Configuración del sitio
define('SITE_NAME', 'LabClinic Pro');
define('SITE_URL', 'http://localhost/labclinic');
define('CURRENCY', '$');
define('CURRENCY_CODE', 'USD');

// Zona horaria
date_default_timezone_set('America/Mexico_City');

// Incluir archivos necesarios
require_once __DIR__ . '/database.php';

// Función para verificar autenticación
function isLoggedIn() {
    return isset($_SESSION['user_id']);
}

// Función para requerir login
function requireLogin() {
    if (!isLoggedIn()) {
        header('Location: ' . SITE_URL . '/login.php');
        exit;
    }
}

// Función para sanitizar entrada
function sanitize($data) {
    return htmlspecialchars(strip_tags(trim($data)));
}

// Función para formatear moneda
function formatMoney($amount) {
    return CURRENCY . number_format($amount, 2);
}

// Función para formatear fecha
function formatDate($date) {
    return date('d/m/Y', strtotime($date));
}

// Función para formatear fecha y hora
function formatDateTime($datetime) {
    return date('d/m/Y H:i', strtotime($datetime));
}

// Función para generar código único
function generateCode($prefix = 'ORD') {
    return $prefix . date('Ymd') . str_pad(mt_rand(1, 9999), 4, '0', STR_PAD_LEFT);
}

// Función para mostrar alertas
function showAlert($message, $type = 'success') {
    $_SESSION['alert'] = ['message' => $message, 'type' => $type];
}

// Alias para compatibilidad con módulos que usan setAlert
function setAlert($type, $message) {
    $_SESSION['alert'] = ['message' => $message, 'type' => $type];
}

function getAlert() {
    if (isset($_SESSION['alert'])) {
        $alert = $_SESSION['alert'];
        unset($_SESSION['alert']);
        return $alert;
    }
    return null;
}

// Definición de módulos del sistema
function getModulosDisponibles() {
    return [
        'dashboard' => ['nombre' => 'Dashboard', 'icono' => 'bi-speedometer2', 'url' => '/dashboard.php'],
        'pacientes' => ['nombre' => 'Pacientes', 'icono' => 'bi-people', 'url' => '/modules/pacientes/list.php'],
        'ordenes' => ['nombre' => 'Órdenes', 'icono' => 'bi-clipboard2-pulse', 'url' => '/modules/ordenes/list.php'],
        'resultados' => ['nombre' => 'Resultados', 'icono' => 'bi-file-earmark-medical', 'url' => '/modules/resultados/list.php'],
        'caja' => ['nombre' => 'Caja/Pagos', 'icono' => 'bi-cash-stack', 'url' => '/modules/caja/list.php'],
        'examenes' => ['nombre' => 'Exámenes', 'icono' => 'bi-droplet', 'url' => '/modules/examenes/list.php'],
        'inventario' => ['nombre' => 'Inventario', 'icono' => 'bi-box-seam', 'url' => '/modules/inventario/list.php'],
        'compras' => ['nombre' => 'Compras', 'icono' => 'bi-cart-plus', 'url' => '/modules/compras/list.php'],
        'control_calidad' => ['nombre' => 'Control Calidad', 'icono' => 'bi-clipboard-check', 'url' => '/modules/control_calidad/list.php'],
        'usuarios' => ['nombre' => 'Usuarios', 'icono' => 'bi-person-gear', 'url' => '/modules/usuarios/list.php', 'admin_only' => true],
        'configuracion' => ['nombre' => 'Configuración', 'icono' => 'bi-gear', 'url' => '/modules/configuracion/index.php', 'admin_only' => true],
        'reportes' => ['nombre' => 'Reportes', 'icono' => 'bi-graph-up', 'url' => '/modules/reportes/index.php', 'admin_only' => true],
    ];
}

// Obtener permisos de un usuario
function getPermisosUsuario($usuario_id) {
    $db = getDB();
    $stmt = $db->prepare("SELECT modulo, puede_ver, puede_crear, puede_editar, puede_eliminar FROM usuarios_permisos WHERE usuario_id = ?");
    $stmt->execute([$usuario_id]);
    $permisos = [];
    while ($row = $stmt->fetch()) {
        $permisos[$row['modulo']] = [
            'ver' => $row['puede_ver'],
            'crear' => $row['puede_crear'],
            'editar' => $row['puede_editar'],
            'eliminar' => $row['puede_eliminar']
        ];
    }
    return $permisos;
}

// Verificar si usuario tiene permiso para un módulo y acción
function tienePermiso($modulo, $accion = 'ver') {
    // Admin tiene todos los permisos
    if (isset($_SESSION['rol']) && $_SESSION['rol'] == 'admin') {
        return true;
    }
    
    // Si no hay usuario logueado
    if (!isset($_SESSION['user_id'])) {
        return false;
    }
    
    // Cargar permisos si no están en sesión
    if (!isset($_SESSION['permisos'])) {
        $_SESSION['permisos'] = getPermisosUsuario($_SESSION['user_id']);
    }
    
    // Verificar permiso específico
    $permisos = $_SESSION['permisos'];
    if (!isset($permisos[$modulo])) {
        return false;
    }
    
    return $permisos[$modulo][$accion] ?? false;
}

// Requerir permiso para acceder (redirige si no tiene)
function requirePermiso($modulo, $accion = 'ver') {
    if (!tienePermiso($modulo, $accion)) {
        showAlert('No tiene permisos para acceder a este módulo', 'danger');
        header('Location: ' . SITE_URL . '/dashboard.php');
        exit;
    }
}

// Guardar permisos de un usuario
function guardarPermisosUsuario($usuario_id, $permisos) {
    $db = getDB();
    
    // Eliminar permisos existentes
    $stmt = $db->prepare("DELETE FROM usuarios_permisos WHERE usuario_id = ?");
    $stmt->execute([$usuario_id]);
    
    // Insertar nuevos permisos
    $stmt = $db->prepare("
        INSERT INTO usuarios_permisos (usuario_id, modulo, puede_ver, puede_crear, puede_editar, puede_eliminar)
        VALUES (?, ?, ?, ?, ?, ?)
    ");
    
    foreach ($permisos as $modulo => $acciones) {
        $stmt->execute([
            $usuario_id,
            $modulo,
            $acciones['ver'] ?? 0,
            $acciones['crear'] ?? 0,
            $acciones['editar'] ?? 0,
            $acciones['eliminar'] ?? 0
        ]);
    }
}

// Asignar permisos por defecto según rol
function asignarPermisosDefecto($usuario_id, $rol) {
    $modulos = getModulosDisponibles();
    $permisos = [];
    
    foreach ($modulos as $modulo => $info) {
        // Saltar módulos admin_only para roles no admin
        if (isset($info['admin_only']) && $info['admin_only'] && $rol != 'admin') {
            continue;
        }
        
        switch ($rol) {
            case 'admin':
                // Admin tiene todos los permisos
                $permisos[$modulo] = ['ver' => 1, 'crear' => 1, 'editar' => 1, 'eliminar' => 1];
                break;
                
            case 'laboratorista':
                // Laboratorista: resultados completo, órdenes ver, pacientes ver
                if (in_array($modulo, ['dashboard', 'resultados'])) {
                    $permisos[$modulo] = ['ver' => 1, 'crear' => 1, 'editar' => 1, 'eliminar' => 0];
                } elseif (in_array($modulo, ['ordenes', 'pacientes', 'examenes'])) {
                    $permisos[$modulo] = ['ver' => 1, 'crear' => 0, 'editar' => 0, 'eliminar' => 0];
                }
                break;
                
            case 'recepcion':
                // Recepción: pacientes y órdenes completo, resultados ver
                if (in_array($modulo, ['dashboard', 'pacientes', 'ordenes'])) {
                    $permisos[$modulo] = ['ver' => 1, 'crear' => 1, 'editar' => 1, 'eliminar' => 0];
                } elseif (in_array($modulo, ['resultados', 'examenes'])) {
                    $permisos[$modulo] = ['ver' => 1, 'crear' => 0, 'editar' => 0, 'eliminar' => 0];
                }
                break;
                
            case 'caja':
                // Caja: caja completo, órdenes ver
                if (in_array($modulo, ['dashboard', 'caja'])) {
                    $permisos[$modulo] = ['ver' => 1, 'crear' => 1, 'editar' => 1, 'eliminar' => 0];
                } elseif (in_array($modulo, ['ordenes', 'pacientes'])) {
                    $permisos[$modulo] = ['ver' => 1, 'crear' => 0, 'editar' => 0, 'eliminar' => 0];
                }
                break;
        }
    }
    
    guardarPermisosUsuario($usuario_id, $permisos);
}
