<?php
session_start();

require_once '../../Controlador/Utilidades/Conexion_BD.php';
require_once '../../Controlador/Utilidades/Auditoria.php';

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    /* --------- Inputs --------- */
    $id_galonera         = isset($_POST["id_galonera"]) ? (int)$_POST["id_galonera"] : 0;
    $codigo              = strtoupper(trim($_POST["codigo"] ?? ''));
    // Seguridad/patrón igual que en el alta
    $codigo              = preg_replace('/[^A-Z0-9\-]/', '', $codigo);

    $capacidad_litros_in = trim($_POST["capacidad_litros"] ?? '');
    $tipo_combustible_id = (isset($_POST["tipo_combustible_id"]) && $_POST["tipo_combustible_id"] !== '')
                           ? (int)$_POST["tipo_combustible_id"] : null;

    // Normaliza capacidad a float con punto
    $capacidad_litros = is_numeric(str_replace(',', '.', $capacidad_litros_in))
        ? (float)str_replace(',', '.', $capacidad_litros_in)
        : null;

    // ===== Validaciones base =====
    if ($id_galonera <= 0) {
        $_SESSION['error_galonera'] = "ID de galonera inválido.";
        header("Location: ../../Vista/Administrador/Adm_Gestion_Galoneras.php");
        exit();
    }

    if ($codigo === '') {
        $_SESSION['error_galonera'] = "El código es obligatorio.";
        header("Location: ../../Vista/Administrador/Adm_Editar_Galonera.php?IDG=" . urlencode($id_galonera));
        exit();
    }

    if (!preg_match('/^[A-Z0-9\-]+$/', $codigo)) {
        $_SESSION['error_galonera'] = "El código solo admite mayúsculas, números y guiones.";
        header("Location: ../../Vista/Administrador/Adm_Editar_Galonera.php?IDG=" . urlencode($id_galonera));
        exit();
    }

    // Coherente con el alta: > 0 y <= 9999.99
    if ($capacidad_litros === null || $capacidad_litros <= 0 || $capacidad_litros > 9999.99) {
        $_SESSION['error_galonera'] = "Capacidad inválida. Use un valor mayor a 0 y hasta 9999.99";
        header("Location: ../../Vista/Administrador/Adm_Editar_Galonera.php?IDG=" . urlencode($id_galonera));
        exit();
    }

    if ($tipo_combustible_id === null) {
        $_SESSION['error_galonera'] = "Debe seleccionar el tipo de combustible.";
        header("Location: ../../Vista/Administrador/Adm_Editar_Galonera.php?IDG=" . urlencode($id_galonera));
        exit();
    }

    $connMySQL = new Conexion_BD();
    $db = $connMySQL->getConnection();

    try {
        /* ---- Validar combustible permitido por NOMBRE ----
           Permitidos: DIESEL B5 (DB5), G-REGULAR, G-PREMIUM y GLP (puro).
           Se excluyen mixtos (GLP/G-REGULAR, GLP/G-PREMIUM, GNV, etc.). */
        $sqlVal = "
            SELECT combustibletipo
            FROM tipocombustible
            WHERE id = ?
              AND UPPER(combustibletipo) IN ('DIESEL B5 (DB5)', 'G-REGULAR', 'G-PREMIUM', 'GLP')
            LIMIT 1
        ";
        $stmtVal = $db->prepare($sqlVal);
        $stmtVal->bind_param("i", $tipo_combustible_id);
        $stmtVal->execute();
        $stmtVal->bind_result($nombre_comb_nuevo);
        $okTipo = $stmtVal->fetch();
        $stmtVal->close();

        if (!$okTipo) {
            $_SESSION['error_galonera'] = "El tipo de combustible seleccionado no es válido.";
            header("Location: ../../Vista/Administrador/Adm_Editar_Galonera.php?IDG=" . urlencode($id_galonera));
            exit();
        }

        /* ---- Verificar código único en otras galoneras ---- */
        $sqlVer = "SELECT COUNT(*) AS total FROM galoneras WHERE codigo = ? AND id <> ?";
        $stmtVer = $db->prepare($sqlVer);
        $stmtVer->bind_param("si", $codigo, $id_galonera);
        $stmtVer->execute();
        $rsVer = $stmtVer->get_result();
        $dup = ($rsVer && ($row = $rsVer->fetch_assoc())) ? (int)$row['total'] : 0;
        $stmtVer->close();

        if ($dup > 0) {
            $_SESSION['error_galonera'] = "El código \"$codigo\" ya está registrado por otra galonera.";
            header("Location: ../../Vista/Administrador/Adm_Editar_Galonera.php?IDG=" . urlencode($id_galonera));
            exit();
        }

        /* ---- Obtener valores originales para auditoría (con nombre de combustible) ---- */
        $sqlOld = "SELECT g.codigo, g.capacidad_litros, g.tipo_combustible_id, tc.combustibletipo AS tipo_nombre
                   FROM galoneras g
                   LEFT JOIN tipocombustible tc ON tc.id = g.tipo_combustible_id
                   WHERE g.id = ?";
        $stmtOld = $db->prepare($sqlOld);
        $stmtOld->bind_param("i", $id_galonera);
        $stmtOld->execute();
        $rsOld = $stmtOld->get_result();
        $old = $rsOld->fetch_assoc();
        $stmtOld->close();

        if (!$old) {
            $_SESSION['error_galonera'] = "No se encontró la galonera a editar.";
            header("Location: ../../Vista/Administrador/Adm_Gestion_Galoneras.php");
            exit();
        }

        /* ---- Actualizar galonera ---- */
        $sqlUpd = "UPDATE galoneras
                   SET codigo = ?, capacidad_litros = ?, tipo_combustible_id = ?
                   WHERE id = ?";
        $stmt = $db->prepare($sqlUpd);
        $stmt->bind_param("sdii", $codigo, $capacidad_litros, $tipo_combustible_id, $id_galonera);

        if ($stmt->execute()) {
            /* ======= AUDITORÍA DETALLADA ======= */
            $id_usuario      = $_SESSION['id_usuario'] ?? 0;
            $nombre_usuario  = $_SESSION['nombre'] ?? ($_SESSION['usuario'] ?? 'sistema');
            $tipo_usuario    = $_SESSION['rol'] ?? '';
            $tabla_afectada  = 'galoneras';

            // Preparar cambios legibles
            $cambios = [];
            if ((string)$old['codigo'] !== (string)$codigo) {
                $cambios[] = "Código: '{$old['codigo']}' → '{$codigo}'";
            }
            $oldCap = number_format((float)$old['capacidad_litros'], 2, '.', '');
            $newCap = number_format((float)$capacidad_litros, 2, '.', '');
            if ($oldCap !== $newCap) {
                $cambios[] = "Capacidad: '{$oldCap} L' → '{$newCap} L'";
            }
            // Mapear nombre de combustible (viejo y nuevo)
            $nombre_comb_viejo = $old['tipo_nombre'] ?? (is_null($old['tipo_combustible_id']) ? 'NULL' : (string)$old['tipo_combustible_id']);
            if ((string)$old['tipo_combustible_id'] !== (string)$tipo_combustible_id) {
                $cambios[] = "Combustible: '{$nombre_comb_viejo}' → '{$nombre_comb_nuevo}'";
            }

            $descripcion = "Se editó la galonera ID: $id_galonera";
            $observacion = !empty($cambios) ? ("Cambios: " . implode(", ", $cambios)) : "No hubo cambios en los datos principales.";

            registrarAuditoria(
                $tabla_afectada,        // módulo/tabla
                'editar',               // acción
                $descripcion,           // descripción
                $id_usuario,            // id_usuario (quién ejecuta)
                $nombre_usuario,        // nombre_usuario
                $tabla_afectada,        // tabla_afectada
                $id_galonera,           // id_registro_afectado
                $tipo_usuario,          // tipo_usuario
                $observacion            // observación detallando cambios
            );
            /* ================================ */

            // notificación de éxito (para JS Notifi_Editar_Galonera.js)
            $_SESSION['galoneraUpdate'] = $codigo;
            $stmt->close();

            header("Location: ../../Vista/Administrador/Adm_Gestion_Galoneras.php");
            exit();
        } else {
            $_SESSION['error_galonera'] = "Error al actualizar la galonera.";
            $stmt->close();
            header("Location: ../../Vista/Administrador/Adm_Editar_Galonera.php?IDG=" . urlencode($id_galonera));
            exit();
        }

    } catch (mysqli_sql_exception $e) {
        $_SESSION['error_galonera'] = "Error al actualizar: " . $e->getMessage();
        header("Location: ../../Vista/Administrador/Adm_Editar_Galonera.php?IDG=" . urlencode($id_galonera));
        exit();
    } finally {
        $connMySQL->closeConnection();
    }

} else {
    header("Location: ../../Vista/General/Adm_Menu_Navegacion.php");
    exit();
}
