<?php
session_start();
require_once "../Utilidades/Conexion_BD.php";
require_once "../Utilidades/Auditoria.php"; // Auditoría

// === Entrada y saneo ===
$codigo              = strtoupper(trim($_POST['codigo'] ?? ''));
$codigo              = preg_replace('/[^A-Z0-9\-]/', '', $codigo); // seguridad básica (igual que en el front)
$capacidad_litros    = isset($_POST['capacidad_litros']) ? floatval($_POST['capacidad_litros']) : 0.0;
$tipo_combustible_id = isset($_POST['tipo_combustible_id']) ? intval($_POST['tipo_combustible_id']) : null;

// === Validación mínima ===
if ($codigo === '' || empty($tipo_combustible_id)) {
    $_SESSION['error_galonera'] = "Complete correctamente Código y Tipo de Combustible.";
    header("Location: ../../Vista/Administrador/Adm_Formulario_Galonera.php");
    exit();
}

// Código solo mayúsculas, números y guion
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_Formulario_Galonera.php");
    exit();
}

// Capacidad > 0 y <= 9999.99 (coherente con el front)
if ($capacidad_litros <= 0 || $capacidad_litros > 9999.99) {
    $_SESSION['error_galonera'] = "Capacidad inválida. Debe ser mayor a 0 y hasta 9999.99.";
    header("Location: ../../Vista/Administrador/Adm_Formulario_Galonera.php");
    exit();
}

$conn = new Conexion_BD();

try {
    // === Validar que el tipo de combustible sea uno permitido (por NOMBRE) ===
    // Permitidos: DB5, G-REGULAR, G-PREMIUM y GLP (puro). Se excluyen mixtos (GLP/G-REGULAR, etc.)
    $sqlValida = "
        SELECT combustibletipo
        FROM tipocombustible
        WHERE id = ?
          AND UPPER(combustibletipo) IN ('DIESEL B5 (DB5)', 'G-REGULAR', 'G-PREMIUM', 'GLP')
        LIMIT 1
    ";
    $stmtVal = $conn->prepare($sqlValida);
    $stmtVal->bind_param("i", $tipo_combustible_id);
    $stmtVal->execute();
    $stmtVal->bind_result($nombre_combustible);
    $tiene = $stmtVal->fetch();
    $stmtVal->close();

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

    // (Opcional) Validar unicidad de código antes del insert para dar mensaje más claro
    $sqlExiste = "SELECT 1 FROM galoneras WHERE codigo = ? LIMIT 1";
    $stmtEx = $conn->prepare($sqlExiste);
    $stmtEx->bind_param("s", $codigo);
    $stmtEx->execute();
    $stmtEx->store_result();
    if ($stmtEx->num_rows > 0) {
        $stmtEx->close();
        $_SESSION['error_galonera'] = "El código ingresado ya se encuentra registrado.";
        header("Location: ../../Vista/Administrador/Adm_Formulario_Galonera.php");
        exit();
    }
    $stmtEx->close();

    // === Inserción (estado por defecto 'activo' y fecha actual) ===
    $sqlIns = "INSERT INTO galoneras
               (codigo, capacidad_litros, tipo_combustible_id, estado, fecha_estado_desde, motivo_estado)
               VALUES (?, ?, ?, 'activo', CURDATE(), NULL)";
    $stmt = $conn->prepare($sqlIns);
    // sdi: string, double, integer
    $stmt->bind_param("sdi", $codigo, $capacidad_litros, $tipo_combustible_id);
    $stmt->execute();

    // ======== AUDITORÍA ========
    $id_usuario     = $_SESSION['id_usuario'] ?? 0;
    $nombre_usuario = $_SESSION['nombre'] ?? ($_SESSION['usuario'] ?? 'sistema');
    $tipo_usuario   = $_SESSION['rol'] ?? '';
    $id_nuevo       = $conn->getConnection()->insert_id;

    // Descripción con nombre legible del combustible
    $descripcion = sprintf(
        "Se registró una nueva galonera: %s (capacidad: %.2f L, combustible: %s)",
        $codigo,
        $capacidad_litros,
        $nombre_combustible
    );

    registrarAuditoria(
        'galoneras',        // modulo
        'agregar',          // accion
        $descripcion,       // descripcion
        $id_usuario,        // quien ejecuta
        $nombre_usuario,    // usuario ejecutor
        'galoneras',        // tabla afectada
        $id_nuevo,          // id insertado
        $tipo_usuario       // tipo usuario
    );
    // ===========================

    $_SESSION['galoneraCodigo'] = $codigo;

    $stmt->close();
    $conn->closeConnection();

    header("Location: ../../Vista/Administrador/Adm_Gestion_Galoneras.php");
    exit();

} catch (mysqli_sql_exception $e) {
    // Mensaje por defecto
    $mensajeError = "Ocurrió un error al registrar la galonera.";

    // Duplicado de código (UNIQUE en galoneras.codigo)
    if (str_contains($e->getMessage(), 'Duplicate entry')) {
        $mensajeError = "El código ingresado ya se encuentra registrado.";
    }

    // FK inválida a tipocombustible
    if (str_contains($e->getMessage(), 'foreign key constraint') || (int)$e->getCode() === 1452) {
        $mensajeError = "El tipo de combustible seleccionado no es válido.";
    }

    $_SESSION['error_galonera'] = $mensajeError;

    // Cerrar y volver al formulario
    if (isset($stmt) && $stmt instanceof mysqli_stmt) { $stmt->close(); }
    $conn->closeConnection();
    header("Location: ../../Vista/Administrador/Adm_Formulario_Galonera.php");
    exit();
}
