<?php
session_start();
require_once '../Utilidades/Conexion_BD.php';
require_once '../Utilidades/Auditoria.php';

// Solo si llegan todos los campos base
if (
  isset(
    $_POST['vehiculo_id'],
    $_POST['chofer_id'],
    $_POST['grifo_id'],
    $_POST['cantidad_gln'],
    $_POST['valor_unitario_gln'],
    $_POST['kilometraje'],
    $_POST['numero_vale'],
    $_POST['fecha_abastecimiento'],
    $_POST['hora_abastecimiento']
  )
) {
  // ========= Entradas base (sanitizadas) =========
  $vehiculo_id = (int)$_POST['vehiculo_id'];
  $chofer_id   = (int)$_POST['chofer_id'];
  $grifo_id    = (int)$_POST['grifo_id'];
  $kilometraje = (int)$_POST['kilometraje'];

  // ✅ Permitir guiones y slashes en N° de vale (máx. 20)
  $numero_vale = strtoupper(preg_replace('/[^A-Z0-9\-\/]/', '', trim($_POST['numero_vale'])));
  if ($numero_vale === '' || !preg_match('/^[A-Z0-9\-\/]{1,20}$/', $numero_vale)) {
    $_SESSION['error_abastecimiento'] = "El N° de vale es inválido. Use solo letras, números, guiones y “/” (máx. 20).";
    header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
    exit();
  }

  $fecha_abastecimiento = trim($_POST['fecha_abastecimiento']);
  $hora_abastecimiento  = trim($_POST['hora_abastecimiento']);

  // Decimales: admitir coma y punto;
  // cantidad_gln -> 5 decimales | valor_unitario_gln -> 2 decimales (half-up)
  $cantidad_gln_raw      = str_replace(',', '.', $_POST['cantidad_gln']);
  $valor_unitario_raw    = str_replace(',', '.', $_POST['valor_unitario_gln']);
  $cantidad_gln          = round((float)$cantidad_gln_raw, 5, PHP_ROUND_HALF_UP);
  $valor_unitario_gln    = round((float)$valor_unitario_raw, 2, PHP_ROUND_HALF_UP);

  // Combustible (mixto / no mixto)
  $tipo_combustible_id_post = isset($_POST['tipo_combustible_id']) ? (int)$_POST['tipo_combustible_id'] : 0;
  $combustible_abastecido   = isset($_POST['combustible_abastecido']) ? trim($_POST['combustible_abastecido']) : '';

  // Normalizador
  $normalize = function (?string $s): string {
    if ($s === null) return '';
    $s = str_replace("\xC2\xA0", ' ', $s);   // NBSP -> espacio
    $s = preg_replace('/\s+/', ' ', $s);     // colapsar espacios
    return strtoupper(trim($s));
  };

  // Mixtos: ahora siempre 3 opciones (principal + 2 gasolinas)
  $MIXTOS = [
    4 => ['GLP', 'G-REGULAR', 'G-PREMIUM'], // GLP + gasolinas
    5 => ['GLP', 'G-REGULAR', 'G-PREMIUM'],
    6 => ['GNV', 'G-REGULAR', 'G-PREMIUM'], // GNV + gasolinas
    7 => ['GNV', 'G-REGULAR', 'G-PREMIUM'],
  ];

  $conn = new Conexion_BD();
  mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

  try {
    $db = $conn->getConnection();

    // ===== 1) Resolver SIEMPRE el tipo_combustible_id real y capacidad del vehículo =====
    $sqlV = "SELECT tipo_combustible_id, capacidad_combustible, kilometraje_inicial FROM vehiculos WHERE id = ?";
    $stV = $db->prepare($sqlV);
    $stV->bind_param("i", $vehiculo_id);
    $stV->execute();
    $rsV = $stV->get_result();
    $rowV = $rsV->fetch_assoc();
    $stV->close();

    if (!$rowV) {
      $_SESSION['error_abastecimiento'] = "No se encontró el vehículo.";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
      exit();
    }

    $tipo_combustible_id  = (int)$rowV['tipo_combustible_id'];
    $capacidad_combustible = (float)($rowV['capacidad_combustible'] ?? 0);
    $km_inicial_vehiculo   = (int)($rowV['kilometraje_inicial'] ?? 0);

    if ($tipo_combustible_id <= 0) {
      $_SESSION['error_abastecimiento'] = "No se pudo resolver el tipo de combustible del vehículo.";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
      exit();
    }

    // ===== 2) Validaciones de negocio (server-side) =====
    if ($cantidad_gln <= 0) {
      $_SESSION['error_abastecimiento'] = "La cantidad GLN debe ser mayor a cero.";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
      exit();
    }
    if ($capacidad_combustible > 0 && $cantidad_gln > $capacidad_combustible) {
      $_SESSION['error_abastecimiento'] = "La cantidad GLN excede la capacidad del tanque ({$capacidad_combustible} GLN).";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
      exit();
    }
    if ($valor_unitario_gln <= 0) {
      $_SESSION['error_abastecimiento'] = "El valor unitario debe ser mayor a cero.";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
      exit();
    }

    // Fecha/hora no futuro
    if ($fecha_abastecimiento && $hora_abastecimiento) {
      $fh = strtotime($fecha_abastecimiento . ' ' . $hora_abastecimiento);
      if ($fh !== false && $fh > time()) {
        $_SESSION['error_abastecimiento'] = "La fecha/hora no puede ser futura.";
        $conn->closeConnection();
        header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
        exit();
      }
    }

    // ===== 3) Kilometraje consistente =====
    $sqlUlt = "SELECT MAX(kilometraje) AS ultimo_km FROM control_combustible WHERE vehiculo_id = ?";
    $stUlt = $db->prepare($sqlUlt);
    $stUlt->bind_param("i", $vehiculo_id);
    $stUlt->execute();
    $rsUlt = $stUlt->get_result()->fetch_assoc();
    $stUlt->close();

    $ultimo_km = (int)($rsUlt['ultimo_km'] ?? 0);

    if ($ultimo_km > 0) {
      if ($kilometraje <= $ultimo_km) {
        $_SESSION['error_abastecimiento'] =
          "El kilometraje ingresado ($kilometraje) es menor o igual al último registrado ($ultimo_km).";
        $conn->closeConnection();
        header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
        exit();
      }
    } else {
      if ($kilometraje <= $km_inicial_vehiculo) {
        $_SESSION['error_abastecimiento'] =
          "El kilometraje ingresado ($kilometraje) es menor o igual al kilometraje inicial del vehículo ($km_inicial_vehiculo).";
        $conn->closeConnection();
        header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
        exit();
      }
    }

    // ===== 4) Resolver combustible_abastecido =====
    if (!in_array($tipo_combustible_id, [4,5,6,7], true)) {
      $sqlNom = "SELECT tc.combustibletipo AS nombre
                 FROM vehiculos v
                 JOIN tipocombustible tc ON tc.id = v.tipo_combustible_id
                 WHERE v.id = ?";
      $stNom = $db->prepare($sqlNom);
      $stNom->bind_param("i", $vehiculo_id);
      $stNom->execute();
      $rowNom = $stNom->get_result()->fetch_assoc();
      $stNom->close();

      if (empty($rowNom['nombre'])) {
        $_SESSION['error_abastecimiento'] = "No se encontró el nombre del combustible (no mixto).";
        $conn->closeConnection();
        header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
        exit();
      }
      $combustible_abastecido = trim($rowNom['nombre']); // p.ej. "DIESEL B5 (DB5)"
    } else {
      if ($combustible_abastecido === '') {
        $_SESSION['error_abastecimiento'] = "Debes seleccionar el combustible abastecido (vehículo mixto).";
        $conn->closeConnection();
        header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
        exit();
      }
      $cNorm     = $normalize($combustible_abastecido);
      $permitMix = array_map($normalize, $MIXTOS[$tipo_combustible_id] ?? []);
      if (!in_array($cNorm, $permitMix, true)) {
        $_SESSION['error_abastecimiento'] = "Combustible seleccionado no válido para el tipo mixto.";
        $conn->closeConnection();
        header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
        exit();
      }
    }

    // Lista blanca final dinámica:
    $PERMITIDOS_NORM = array_map($normalize, ['GLP','GNV','G-REGULAR','G-PREMIUM']);
    $rsTipos = $db->query("SELECT combustibletipo FROM tipocombustible");
    while ($rowT = $rsTipos->fetch_assoc()) {
      $PERMITIDOS_NORM[] = $normalize($rowT['combustibletipo']);
    }
    if (!in_array($normalize($combustible_abastecido), $PERMITIDOS_NORM, true)) {
      $_SESSION['error_abastecimiento'] = "Tipo de combustible inválido: " . htmlspecialchars($combustible_abastecido);
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
      exit();
    }

    // ===== 4.9) Bloquear N° de vale duplicado =====
    $stDup = $db->prepare("SELECT id FROM control_combustible WHERE numero_vale = ? LIMIT 1");
    $stDup->bind_param("s", $numero_vale);
    $stDup->execute();
    $stDup->store_result();
    if ($stDup->num_rows > 0) {
      $stDup->close();
      $_SESSION['error_abastecimiento'] = "El N° de vale '{$numero_vale}' ya está registrado. Verifiqueeee.";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
      exit();
    }
    $stDup->close();

    // ===== 5) INSERT =====
    $sqlIns = "INSERT INTO control_combustible (
                  vehiculo_id, chofer_id, grifo_id, cantidad_gln,
                  valor_unitario_gln, kilometraje, numero_vale,
                  fecha_abastecimiento, hora_abastecimiento,
                  combustible_abastecido
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
    $stIns = $db->prepare($sqlIns);
    $stIns->bind_param(
      "iiiddissss",
      $vehiculo_id,
      $chofer_id,
      $grifo_id,
      $cantidad_gln,        // DECIMAL(7,5) en BD
      $valor_unitario_gln,  // DECIMAL(10,2) en BD
      $kilometraje,
      $numero_vale,
      $fecha_abastecimiento,
      $hora_abastecimiento,
      $combustible_abastecido
    );
    $stIns->execute();
    $nuevo_id = $db->insert_id;
    $stIns->close();

    // ===== 6) Auditoría =====
    $id_usuario     = $_SESSION['id_usuario'] ?? 0;
    $nombre_usuario = $_SESSION['nombre'] ?? ($_SESSION['usuario'] ?? 'sistema');
    $tipo_usuario   = $_SESSION['rol'] ?? '';

    $descripcion = "Registró abastecimiento: Vehículo ID $vehiculo_id, Chofer ID $chofer_id, Grifo ID $grifo_id, Vale: $numero_vale, Fecha: $fecha_abastecimiento $hora_abastecimiento, Comb: " . ($combustible_abastecido ?: 'N/D');
    registrarAuditoria(
      'control_combustible',
      'agregar',
      $descripcion,
      $id_usuario,
      $nombre_usuario,
      'control_combustible',
      $nuevo_id,
      $tipo_usuario
    );

    $_SESSION['registro_abastecimiento'] = true;
    $conn->closeConnection();
    header("Location: ../../Vista/Administrador/Adm_Gestion_Abastecimientos.php");
    exit();

  } catch (mysqli_sql_exception $e) {
    // 1062 = Duplicate entry (si luego agregas índice UNIQUE y ocurre una carrera)
    if ((int)$e->getCode() === 1062 || strpos($e->getMessage(), '1062') !== false) {
      $_SESSION['error_abastecimiento'] = "Número de vale duplicado: '{$numero_vale}'. Ya existe un registro con ese N° de vale.";
    } else {
      $_SESSION['error_abastecimiento'] = "Error en la base de datos: " . $e->getMessage();
    }
    $conn->closeConnection();
    header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
    exit();
  }
} else {
  $_SESSION['error_abastecimiento'] = "Faltan datos obligatorios para el registro.";
  header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento.php");
  exit();
}
