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

if ($_SERVER["REQUEST_METHOD"] !== "POST") {
  header("Location: ../../Vista/General/Adm_Menu_Navegacion.php");
  exit();
}

/* ========= Entradas ========= */
$id          = (int)($_POST["id"] ?? 0);
$vehiculo_id = (int)($_POST["vehiculo_id"] ?? 0);
$chofer_id   = (int)($_POST["chofer_id"] ?? 0);
$grifo_id    = (int)($_POST["grifo_id"] ?? 0);

/* ✅ Permitir guiones y slashes en N° de vale y validar */
$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_Editar_Abastecimiento.php?IA=$id");
  exit();
}

$kilometraje           = (int)($_POST["kilometraje"] ?? 0);
$fecha_abastecimiento  = trim($_POST["fecha_abastecimiento"] ?? '');
$hora_abastecimiento   = trim($_POST["hora_abastecimiento"] ?? '');
$capacidad_combustible = (float)($_POST["capacidad_combustible"] ?? 0.0);

/* Decimales: admitir coma o punto y redondear:
   - cantidad_gln -> 5 decimales (half-up)
   - valor_unitario_gln -> 2 decimales (half-up) */
$cantidad_gln_raw     = str_replace(',', '.', ($_POST["cantidad_gln"] ?? 0));
$valor_unitario_raw   = str_replace(',', '.', ($_POST["valor_unitario_gln"] ?? 0));
$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);

/* Del form (solo si mixto) */
$combustible_post = trim($_POST["combustible_abastecido"] ?? '');

/* ========= Helpers ========= */
$normalize = function (?string $s): string {
  if ($s === null) return '';
  $s = str_replace("\xC2\xA0", ' ', $s);
  $s = preg_replace('/\s+/', ' ', $s);
  return strtoupper(trim($s));
};

/* Mixtos: SIEMPRE 3 opciones (principal + Regular + Premium) */
$MIXTOS = [
  4 => ['GLP', 'G-REGULAR', 'G-PREMIUM'],
  5 => ['GLP', 'G-REGULAR', 'G-PREMIUM'],
  6 => ['GNV', 'G-REGULAR', 'G-PREMIUM'],
  7 => ['GNV', 'G-REGULAR', 'G-PREMIUM'],
];

/* ========= Validaciones básicas servidor ========= */
if ($vehiculo_id <= 0 || $chofer_id <= 0 || $grifo_id <= 0 || $id <= 0) {
  $_SESSION['error_abastecimiento'] = "Datos incompletos.";
  header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento.php?IA=$id");
  exit();
}
if ($cantidad_gln <= 0) {
  $_SESSION['error_abastecimiento'] = "La cantidad GLN debe ser mayor a cero.";
  header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento.php?IA=$id");
  exit();
}
if ($valor_unitario_gln <= 0) {
  $_SESSION['error_abastecimiento'] = "El valor unitario debe ser mayor a cero.";
  header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento.php?IA=$id");
  exit();
}
if ($capacidad_combustible > 0 && $cantidad_gln > $capacidad_combustible) {
  $_SESSION['error_abastecimiento'] = "La cantidad de GLN no puede superar la capacidad del vehículo ($capacidad_combustible GLN).";
  header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento.php?IA=$id");
  exit();
}
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.";
    header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento.php?IA=$id");
    exit();
  }
}

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

try {
  mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

  /* 1) Resolver SIEMPRE tipo_combustible_id y nombre (para no-mixtos) */
  $sqlTipo = "SELECT v.tipo_combustible_id, v.kilometraje_inicial, v.capacidad_combustible,
                     tc.combustibletipo
              FROM vehiculos v
              JOIN tipocombustible tc ON tc.id = v.tipo_combustible_id
              WHERE v.id = ?";
  $stTipo = $db->prepare($sqlTipo);
  $stTipo->bind_param("i", $vehiculo_id);
  $stTipo->execute();
  $rowTipo = $stTipo->get_result()->fetch_assoc();
  $stTipo->close();

  if (!$rowTipo) {
    $_SESSION['error_abastecimiento'] = "No se encontró el vehículo.";
    header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento.php?IA=$id");
    exit();
  }

  $tipo_combustible_id = (int)$rowTipo['tipo_combustible_id'];
  $km_inicial_vehiculo = (int)($rowTipo['kilometraje_inicial'] ?? 0);
  $nombre_no_mixto     = $rowTipo['combustibletipo'] ?? null;

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

  /* 2) No permitir fecha/hora < registros posteriores */
  $sqlPosterior = "SELECT id FROM control_combustible
                   WHERE vehiculo_id = ?
                     AND (fecha_abastecimiento > ?
                     OR  (fecha_abastecimiento = ? AND hora_abastecimiento > ?))
                   LIMIT 1";
  $stPost = $db->prepare($sqlPosterior);
  $stPost->bind_param("isss", $vehiculo_id, $fecha_abastecimiento, $fecha_abastecimiento, $hora_abastecimiento);
  $stPost->execute();
  $hayPosteriores = ($stPost->get_result()->num_rows > 0);
  $stPost->close();

  if ($hayPosteriores) {
    // Recuperar valores originales para no romper la línea temporal
    $stOld = $db->prepare("SELECT kilometraje, fecha_abastecimiento, hora_abastecimiento
                           FROM control_combustible WHERE id = ? LIMIT 1");
    $stOld->bind_param("i", $id);
    $stOld->execute();
    if ($rowOld = $stOld->get_result()->fetch_assoc()) {
      $kilometraje          = (int)$rowOld['kilometraje'];
      $fecha_abastecimiento = $rowOld['fecha_abastecimiento'];
      $hora_abastecimiento  = $rowOld['hora_abastecimiento'];
    }
    $stOld->close();
  } else {
    // Si NO hay posteriores, validar que el km no sea menor que el anterior
    $stPrev = $db->prepare("SELECT kilometraje
                            FROM control_combustible
                            WHERE vehiculo_id = ?
                              AND (fecha_abastecimiento < ?
                               OR (fecha_abastecimiento = ? AND hora_abastecimiento < ?))
                            ORDER BY fecha_abastecimiento DESC, hora_abastecimiento DESC
                            LIMIT 1");
    $stPrev->bind_param("isss", $vehiculo_id, $fecha_abastecimiento, $fecha_abastecimiento, $hora_abastecimiento);
    $stPrev->execute();
    $rowPrev = $stPrev->get_result()->fetch_assoc();
    $stPrev->close();

    $limite_inferior_km = $rowPrev ? (int)$rowPrev['kilometraje'] : $km_inicial_vehiculo;
    if ($kilometraje <= $limite_inferior_km) {
      $_SESSION['error_abastecimiento'] =
        "El kilometraje ingresado ($kilometraje) debe ser mayor que el anterior ($limite_inferior_km).";
      header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento.php?IA=$id");
      exit();
    }
  }

  /* 3) Resolver combustible_abastecido */
  if (!in_array($tipo_combustible_id, [4,5,6,7], true)) {
    // No mixto: usar SIEMPRE nombre real desde BD
    if (!$nombre_no_mixto) {
      $_SESSION['error_abastecimiento'] = "No se encontró el combustible del vehículo.";
      header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento.php?IA=$id");
      exit();
    }
    $combustible_abastecido = $nombre_no_mixto;
  } else {
    // Mixto: debe venir 1 de las 3 opciones válidas
    if ($combustible_post === '') {
      $_SESSION['error_abastecimiento'] = "Debes seleccionar un combustible para vehículos mixtos.";
      header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento.php?IA=$id");
      exit();
    }
    $cNorm  = $normalize($combustible_post);
    $permit = array_map($normalize, $MIXTOS[$tipo_combustible_id] ?? []);
    if (!in_array($cNorm, $permit, true)) {
      $_SESSION['error_abastecimiento'] = "Combustible seleccionado no válido para el tipo mixto.";
      header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento.php?IA=$id");
      exit();
    }
    $combustible_abastecido = $combustible_post; // guardar tal cual se muestra
  }

  /* 4) UPDATE */
  $sql = "UPDATE control_combustible
          SET vehiculo_id = ?,
              chofer_id = ?,
              grifo_id = ?,
              cantidad_gln = ?,
              valor_unitario_gln = ?,
              kilometraje = ?,
              numero_vale = ?,
              fecha_abastecimiento = ?,
              hora_abastecimiento = ?,
              combustible_abastecido = ?
          WHERE id = ?";

  $st = $db->prepare($sql);
  $st->bind_param(
    "iiiddissssi",
    $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,
    $id
  );

  if (!$st->execute()) {
    $st->close();
    $_SESSION['error_abastecimiento'] = "Error al actualizar el abastecimiento.";
    header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento.php?IA=$id");
    exit();
  }
  $st->close();

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

  $descripcion = "Editó abastecimiento ID: $id, Vehículo: $vehiculo_id, Chofer: $chofer_id, Grifo: $grifo_id, Vale: $numero_vale, Comb: $combustible_abastecido";
  registrarAuditoria(
    'control_combustible',
    'editar',
    $descripcion,
    $id_usuario,
    $nombre_usuario,
    'control_combustible',
    $id,
    $tipo_usuario
  );

  $_SESSION['UpdateAbastecimiento'] = $id;
  header("Location: ../../Vista/Administrador/Adm_Gestion_Abastecimientos.php");
  exit();

} catch (Throwable $e) {
  $_SESSION['error_abastecimiento'] = "Error: " . $e->getMessage();
  header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento.php?IA=$id");
  exit();
} finally {
  $connMySQL->closeConnection();
}
