<?php
$pageTitle = 'Lista de Precios';
require_once __DIR__ . '/../../config/config.php';
requireLogin();

$db = getDB();

if ($_SESSION['rol'] != 'admin') {
    showAlert('No tienes permisos para gestionar precios', 'danger');
    header('Location: ' . SITE_URL . '/dashboard.php');
    exit;
}

$db->exec("CREATE TABLE IF NOT EXISTS tipos_precio (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");

$db->exec("CREATE TABLE IF NOT EXISTS examenes_precios_tipo (
    id INT AUTO_INCREMENT PRIMARY KEY,
    tipo_precio_id INT NOT NULL,
    examen_id INT NOT NULL,
    precio DECIMAL(10,2) NOT NULL DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uq_tipo_examen (tipo_precio_id, examen_id),
    CONSTRAINT fk_examenes_precios_tipo_tipo FOREIGN KEY (tipo_precio_id) REFERENCES tipos_precio(id) ON DELETE CASCADE,
    CONSTRAINT fk_examenes_precios_tipo_examen FOREIGN KEY (examen_id) REFERENCES examenes(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");

$stmtTipoDefault = $db->query("SELECT id FROM tipos_precio ORDER BY id LIMIT 1");
$tipoDefaultId = $stmtTipoDefault->fetchColumn();

if (!$tipoDefaultId) {
    $stmtInsertTipo = $db->prepare("INSERT INTO tipos_precio (nombre, activo) VALUES (?, 1)");
    $stmtInsertTipo->execute(['General']);
    $tipoDefaultId = $db->lastInsertId();
}

$tipoActualId = intval(isset($_GET['tipo_id']) ? $_GET['tipo_id'] : $tipoDefaultId);

$stmtTipoVal = $db->prepare("SELECT id, nombre FROM tipos_precio WHERE id = ? AND activo = 1");
$stmtTipoVal->execute([$tipoActualId]);
$tipoActual = $stmtTipoVal->fetch();
if (!$tipoActual) {
    $tipoActualId = intval($tipoDefaultId);
    $stmtTipoVal->execute([$tipoActualId]);
    $tipoActual = $stmtTipoVal->fetch();
}

$stmtSync = $db->prepare("INSERT INTO examenes_precios_tipo (tipo_precio_id, examen_id, precio)
    SELECT ?, e.id, e.precio
    FROM examenes e
    LEFT JOIN examenes_precios_tipo pt ON pt.tipo_precio_id = ? AND pt.examen_id = e.id
    WHERE pt.id IS NULL");
$stmtSync->execute([$tipoActualId, $tipoActualId]);

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $action = isset($_POST['action']) ? $_POST['action'] : '';

    try {
        if ($action === 'crear_tipo') {
            $nombreTipo = sanitize(isset($_POST['nombre_tipo']) ? $_POST['nombre_tipo'] : '');
            if ($nombreTipo === '') {
                throw new Exception('Debe ingresar el nombre del tipo de precio');
            }

            $stmt = $db->prepare("INSERT INTO tipos_precio (nombre, activo) VALUES (?, 1)");
            $stmt->execute([$nombreTipo]);
            $nuevoTipoId = intval($db->lastInsertId());

            $stmtInit = $db->prepare("INSERT INTO examenes_precios_tipo (tipo_precio_id, examen_id, precio)
                SELECT ?, e.id, e.precio FROM examenes e");
            $stmtInit->execute([$nuevoTipoId]);

            showAlert('Tipo de precio creado correctamente');
            header('Location: precios.php?tipo_id=' . $nuevoTipoId);
            exit;
        }

        if ($action === 'renombrar_tipo') {
            $tipoId = intval(isset($_POST['tipo_id']) ? $_POST['tipo_id'] : 0);
            $nombreTipo = sanitize(isset($_POST['nombre_tipo']) ? $_POST['nombre_tipo'] : '');

            if ($tipoId <= 0 || $nombreTipo === '') {
                throw new Exception('Datos inválidos para renombrar el tipo de precio');
            }

            $stmt = $db->prepare("UPDATE tipos_precio SET nombre = ? WHERE id = ?");
            $stmt->execute([$nombreTipo, $tipoId]);

            showAlert('Nombre del tipo de precio actualizado');
            header('Location: precios.php?tipo_id=' . $tipoId);
            exit;
        }

        if ($action === 'guardar_individuales') {
            $tipoId = intval(isset($_POST['tipo_id']) ? $_POST['tipo_id'] : 0);
            $precios = isset($_POST['precio']) && is_array($_POST['precio']) ? $_POST['precio'] : [];

            if ($tipoId <= 0) {
                throw new Exception('Tipo de precio inválido');
            }

            $db->beginTransaction();
            $stmtUpdate = $db->prepare("UPDATE examenes_precios_tipo SET precio = ? WHERE tipo_precio_id = ? AND examen_id = ?");
            foreach ($precios as $examenId => $valorPrecio) {
                $examenId = intval($examenId);
                $precio = floatval($valorPrecio);
                if ($examenId > 0 && $precio >= 0) {
                    $stmtUpdate->execute([$precio, $tipoId, $examenId]);
                }
            }
            $db->commit();

            showAlert('Lista de precios actualizada correctamente');
            header('Location: precios.php?tipo_id=' . $tipoId);
            exit;
        }

        if ($action === 'aplicar_todos') {
            $tipoId = intval(isset($_POST['tipo_id']) ? $_POST['tipo_id'] : 0);
            $precioGlobal = floatval(isset($_POST['precio_global']) ? $_POST['precio_global'] : -1);

            if ($tipoId <= 0 || $precioGlobal < 0) {
                throw new Exception('Debe ingresar un precio válido para aplicar a todos');
            }

            $stmt = $db->prepare("UPDATE examenes_precios_tipo SET precio = ? WHERE tipo_precio_id = ?");
            $stmt->execute([$precioGlobal, $tipoId]);

            showAlert('Se aplicó el mismo precio a todos los exámenes');
            header('Location: precios.php?tipo_id=' . $tipoId);
            exit;
        }
    } catch (Exception $e) {
        if ($db->inTransaction()) {
            $db->rollBack();
        }
        showAlert('Error: ' . $e->getMessage(), 'danger');
        header('Location: precios.php?tipo_id=' . $tipoActualId);
        exit;
    }
}

$stmtTipos = $db->query("SELECT id, nombre FROM tipos_precio WHERE activo = 1 ORDER BY nombre");
$tiposPrecio = $stmtTipos->fetchAll();

$stmtLista = $db->prepare("SELECT e.id, e.codigo, e.nombre, c.nombre AS categoria,
                                  COALESCE(pt.precio, e.precio) AS precio_actual,
                                  e.precio AS precio_base
                           FROM examenes e
                           LEFT JOIN categorias_examenes c ON c.id = e.categoria_id
                           LEFT JOIN examenes_precios_tipo pt ON pt.examen_id = e.id AND pt.tipo_precio_id = ?
                           ORDER BY c.nombre, e.nombre");
$stmtLista->execute([$tipoActualId]);
$precios = $stmtLista->fetchAll();

$categoriasLista = [];
foreach ($precios as $itemCategoria) {
    $catNombre = $itemCategoria['categoria'] ? $itemCategoria['categoria'] : 'Sin categoría';
    $categoriasLista[$catNombre] = true;
}
$categoriasLista = array_keys($categoriasLista);
sort($categoriasLista);

require_once __DIR__ . '/../../includes/header.php';
?>

<div class="d-flex justify-content-between align-items-center mt-4 mb-4">
    <h2><i class="bi bi-tags"></i> Lista de Precios</h2>
    <a href="list.php" class="btn btn-outline-secondary">
        <i class="bi bi-arrow-left"></i> Volver a Exámenes
    </a>
</div>

<div class="row g-3 mb-3">
    <div class="col-lg-6">
        <div class="card h-100">
            <div class="card-header"><strong>Tipo de Precio</strong></div>
            <div class="card-body">
                <form method="GET" class="row g-2 align-items-end">
                    <div class="col-md-8">
                        <label class="form-label">Seleccionar tipo</label>
                        <select name="tipo_id" class="form-select" onchange="this.form.submit()">
                            <?php foreach ($tiposPrecio as $tipo): ?>
                            <option value="<?= $tipo['id'] ?>" <?= $tipo['id'] == $tipoActualId ? 'selected' : '' ?>>
                                <?= htmlspecialchars($tipo['nombre']) ?>
                            </option>
                            <?php endforeach; ?>
                        </select>
                    </div>
                    <div class="col-md-4">
                        <button type="submit" class="btn btn-outline-primary w-100">Ver lista</button>
                    </div>
                </form>

                <hr>

                <form method="POST" class="row g-2 align-items-end">
                    <input type="hidden" name="action" value="renombrar_tipo">
                    <input type="hidden" name="tipo_id" value="<?= $tipoActualId ?>">
                    <div class="col-md-8">
                        <label class="form-label">Nombre del tipo de precio</label>
                        <input type="text" name="nombre_tipo" class="form-control" required
                               value="<?= htmlspecialchars($tipoActual ? $tipoActual['nombre'] : '') ?>">
                    </div>
                    <div class="col-md-4">
                        <button type="submit" class="btn btn-outline-secondary w-100">Renombrar</button>
                    </div>
                </form>
            </div>
        </div>
    </div>

    <div class="col-lg-6">
        <div class="card h-100">
            <div class="card-header"><strong>Acciones rápidas</strong></div>
            <div class="card-body">
                <form method="POST" class="row g-2 align-items-end mb-3">
                    <input type="hidden" name="action" value="crear_tipo">
                    <div class="col-md-8">
                        <label class="form-label">Nuevo tipo de precio</label>
                        <input type="text" name="nombre_tipo" class="form-control" required placeholder="Ej: Convenio, Empresa, Especial">
                    </div>
                    <div class="col-md-4">
                        <button type="submit" class="btn btn-success w-100">Crear tipo</button>
                    </div>
                </form>

                <form method="POST" class="row g-2 align-items-end">
                    <input type="hidden" name="action" value="aplicar_todos">
                    <input type="hidden" name="tipo_id" value="<?= $tipoActualId ?>">
                    <div class="col-md-8">
                        <label class="form-label">Mismo precio para todos</label>
                        <input type="number" name="precio_global" class="form-control" min="0" step="0.01" required>
                    </div>
                    <div class="col-md-4">
                        <button type="submit" class="btn btn-warning w-100" onclick="return confirm('¿Aplicar este mismo precio a todos los exámenes del tipo seleccionado?')">Aplicar</button>
                    </div>
                </form>
            </div>
        </div>
    </div>
</div>

<div class="card">
    <div class="card-header d-flex justify-content-between align-items-center">
        <h5 class="mb-0">
            <i class="bi bi-list-ul"></i>
            <?= $tipoActual ? 'Lista: ' . htmlspecialchars($tipoActual['nombre']) : 'Lista de precios' ?>
        </h5>
        <small class="text-muted">Edición manual por examen</small>
    </div>
    <div class="card-body">
        <div class="row mb-3">
            <div class="col-md-5">
                <label class="form-label">Buscar en lista de precios</label>
                <input type="text" id="buscarPrecio" class="form-control" placeholder="Buscar por código, examen o categoría...">
            </div>
            <div class="col-md-4">
                <label class="form-label">Filtrar por categoría</label>
                <select id="filtroCategoriaPrecio" class="form-select">
                    <option value="">Todas las categorías</option>
                    <?php foreach ($categoriasLista as $catFiltro): ?>
                    <option value="<?= htmlspecialchars($catFiltro) ?>"><?= htmlspecialchars($catFiltro) ?></option>
                    <?php endforeach; ?>
                </select>
            </div>
            <div class="col-md-3 d-flex align-items-end">
                <small class="text-muted" id="contadorFiltrado">Mostrando <?= count($precios) ?> registro(s)</small>
            </div>
        </div>

        <form method="POST">
            <input type="hidden" name="action" value="guardar_individuales">
            <input type="hidden" name="tipo_id" value="<?= $tipoActualId ?>">

            <div class="table-responsive">
                <table class="table table-hover align-middle" id="tablaPrecios">
                    <thead>
                        <tr>
                            <th>Código</th>
                            <th>Examen</th>
                            <th>Categoría</th>
                            <th width="160">Precio Base</th>
                            <th width="180">Precio Manual</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($precios as $item): ?>
                        <tr class="fila-precio"
                            data-codigo="<?= htmlspecialchars(mb_strtolower($item['codigo'])) ?>"
                            data-examen="<?= htmlspecialchars(mb_strtolower($item['nombre'])) ?>"
                            data-categoria="<?= htmlspecialchars(mb_strtolower($item['categoria'] ? $item['categoria'] : '-')) ?>">
                            <td><strong><?= htmlspecialchars($item['codigo']) ?></strong></td>
                            <td><?= htmlspecialchars($item['nombre']) ?></td>
                            <td><?= htmlspecialchars($item['categoria'] ? $item['categoria'] : '-') ?></td>
                            <td><?= formatMoney($item['precio_base']) ?></td>
                            <td>
                                <input type="number" min="0" step="0.01" class="form-control"
                                       name="precio[<?= $item['id'] ?>]"
                                       value="<?= number_format(floatval($item['precio_actual']), 2, '.', '') ?>">
                            </td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            </div>

            <div class="d-flex justify-content-end mt-3">
                <button type="submit" class="btn btn-primary">
                    <i class="bi bi-check-lg"></i> Guardar precios manuales
                </button>
            </div>
        </form>
    </div>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    var inputBuscar = document.getElementById('buscarPrecio');
    var filtroCategoria = document.getElementById('filtroCategoriaPrecio');
    var filas = document.querySelectorAll('.fila-precio');
    var contador = document.getElementById('contadorFiltrado');

    if (!inputBuscar || !filtroCategoria || filas.length === 0) {
        return;
    }

    function aplicarFiltros() {
        var termino = inputBuscar.value.toLowerCase().trim();
        var categoriaSel = filtroCategoria.value.toLowerCase().trim();
        var visibles = 0;

        filas.forEach(function(fila) {
            var texto = (fila.dataset.codigo + ' ' + fila.dataset.examen + ' ' + fila.dataset.categoria);
            var coincideTexto = termino === '' || texto.indexOf(termino) !== -1;
            var coincideCategoria = categoriaSel === '' || fila.dataset.categoria === categoriaSel;
            var coincide = coincideTexto && coincideCategoria;
            fila.style.display = coincide ? '' : 'none';
            if (coincide) {
                visibles++;
            }
        });

        contador.textContent = 'Mostrando ' + visibles + ' registro(s)';
    }

    inputBuscar.addEventListener('input', aplicarFiltros);
    filtroCategoria.addEventListener('change', aplicarFiltros);
});
</script>

<?php require_once __DIR__ . '/../../includes/footer.php'; ?>
