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

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

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

/* ========= Entradas base ========= */
$id                   = isset($_POST['id']) ? (int)$_POST['id'] : 0;
$galonera_id          = isset($_POST['galonera_id']) ? (int)$_POST['galonera_id'] : 0;
$grifo_id             = isset($_POST['grifo_id']) ? (int)$_POST['grifo_id'] : 0;
$tipo_combustible_id  = (isset($_POST['tipo_combustible_id']) && $_POST['tipo_combustible_id'] !== '')
                        ? (int)$_POST['tipo_combustible_id'] : null;

$cantidad_in          = isset($_POST['cantidad_gln']) ? trim((string)$_POST['cantidad_gln']) : '0';
$valor_unitario_in    = isset($_POST['valor_unitario_gln']) ? trim((string)$_POST['valor_unitario_gln']) : '0';

$numero_vale          = array_key_exists('numero_vale', $_POST) ? trim((string)$_POST['numero_vale']) : null;
$fecha_abastecimiento = isset($_POST['fecha_abastecimiento']) ? (string)$_POST['fecha_abastecimiento'] : '';
$hora_abastecimiento  = isset($_POST['hora_abastecimiento']) ? (string)$_POST['hora_abastecimiento'] : '';
$observaciones        = array_key_exists('observaciones', $_POST) ? trim((string)$_POST['observaciones']) : null;

// Responsable (hidden del formulario)
$responsable_id       = isset($_POST['responsable_id']) ? (int)$_POST['responsable_id'] : 0;

/* ========= Mapeo ID -> ENUM (incluye GLP) ========= */
$MAP_TIPO_TO_ENUM = [
  1 => 'DIESEL B5 (DB5)',
  2 => 'G-REGULAR',
  3 => 'G-PREMIUM',
  8 => 'GLP',
];

/* ========= Normalización decimales y reglas de formato ========= */
// Soporta "12,34567" y "12.34567"
$cantidad_in       = str_replace(',', '.', $cantidad_in);
$valor_unitario_in = str_replace(',', '.', $valor_unitario_in);

// Validaciones de formato (antes de convertir)
if (!preg_match('/^\d+(\.\d{1,5})?$/', $cantidad_in)) {
  $_SESSION['error_abastecimiento_galonera'] = "Cantidad (GLN) inválida. Use hasta 5 decimales.";
  header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}"); exit();
}
if (!preg_match('/^\d+(\.\d{1,2})?$/', $valor_unitario_in)) {
  $_SESSION['error_abastecimiento_galonera'] = "Valor unitario inválido. Use hasta 2 decimales.";
  header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}"); exit();
}

// Conversión + redondeo exacto a la escala de la BD
$cantidad_gln       = round((float)$cantidad_in, 5);
$valor_unitario_gln = round((float)$valor_unitario_in, 2);

// N° Vale: mayúsculas + permitir A-Z 0-9 - /
if ($numero_vale !== null) {
  $numero_vale = strtoupper($numero_vale);
  $numero_vale = preg_replace('/[^A-Z0-9\-\/]/', '', $numero_vale);
  if ($numero_vale === '') { $numero_vale = null; }
}
if ($observaciones === '') $observaciones = null;

/* ========= Reglas / Validaciones básicas ========= */
if ($id <= 0) {
  $_SESSION['error_abastecimiento_galonera'] = "ID de registro inválido.";
  header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}"); exit();
}
if ($cantidad_gln <= 0) {
  $_SESSION['error_abastecimiento_galonera'] = "La cantidad (GLN) debe ser mayor a 0.";
  header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}"); exit();
}
if ($valor_unitario_gln <= 0) {
  $_SESSION['error_abastecimiento_galonera'] = "El valor unitario debe ser mayor a 0.";
  header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}"); exit();
}

/* ========= DB ========= */
$conn = new Conexion_BD();
$db   = $conn->getConnection();

// Helper: verificar si existe una columna en la tabla
function columnaExiste(mysqli $db, string $tabla, string $col): bool {
  $res = $db->query("SELECT DATABASE() AS db");
  $dbn = $res ? ($res->fetch_assoc()['db'] ?? '') : '';
  $sql = "SELECT COUNT(*) AS c FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=? AND TABLE_NAME=? AND COLUMN_NAME=?";
  $st  = $db->prepare($sql);
  $st->bind_param("sss", $dbn, $tabla, $col);
  $st->execute();
  $r = $st->get_result()->fetch_assoc();
  $st->close();
  return (int)($r['c'] ?? 0) > 0;
}

try {
  // 0) Verificar que el registro exista
  $sqlChk = "SELECT id FROM control_abastecimiento_galonera WHERE id = ? LIMIT 1";
  $stmt   = $conn->prepare($sqlChk);
  $stmt->bind_param("i", $id);
  $stmt->execute();
  $rs = $stmt->get_result();
  if ($rs->num_rows === 0) {
    $stmt->close();
    $_SESSION['error_abastecimiento_galonera'] = "El abastecimiento a editar no existe.";
    $conn->closeConnection();
    header("Location: ../../Vista/Administrador/Adm_Gestion_Abastecimientos.php"); exit();
  }
  $stmt->close();

  // 1) Validar galonera activa y capacidad (y obtener tipo si hace falta)
  $sqlGal = "SELECT capacidad_litros, estado, tipo_combustible_id AS tipo_gal FROM galoneras WHERE id = ? LIMIT 1";
  $stmt   = $conn->prepare($sqlGal);
  $stmt->bind_param("i", $galonera_id);
  $stmt->execute();
  $rsGal = $stmt->get_result();
  if ($rsGal->num_rows === 0) {
    $stmt->close();
    $_SESSION['error_abastecimiento_galonera'] = "Galonera no encontrada.";
    $conn->closeConnection();
    header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}"); exit();
  }
  $gal = $rsGal->fetch_assoc();
  $stmt->close();

  if (strtolower($gal['estado'] ?? '') !== 'activo') {
    $_SESSION['error_abastecimiento_galonera'] = "La galonera no está ACTIVA.";
    $conn->closeConnection();
    header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}"); exit();
  }
  $capMax = (float)($gal['capacidad_litros'] ?? 0);
  if ($capMax > 0 && ($cantidad_gln - $capMax) > 1e-9) {
    $_SESSION['error_abastecimiento_galonera'] = "La cantidad excede la capacidad de la galonera ({$capMax} GLN).";
    $conn->closeConnection();
    header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}"); exit();
  }

  // 2) (Opcional) Validar grifo exista
  if ($grifo_id > 0) {
    $sqlGr = "SELECT id FROM grifos WHERE id = ? LIMIT 1";
    $stmt  = $conn->prepare($sqlGr);
    $stmt->bind_param("i", $grifo_id);
    $stmt->execute();
    $rsGr = $stmt->get_result();
    $stmt->close();
    if ($rsGr->num_rows === 0) {
      $_SESSION['error_abastecimiento_galonera'] = "Grifo no encontrado.";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}"); exit();
    }
  }

  // 3) Deducir combustible_abastecido (ENUM) desde el ID (POST o de la galonera)
  if ($tipo_combustible_id === null) {
    $tipo_combustible_id = isset($gal['tipo_gal']) ? (int)$gal['tipo_gal'] : null;
  }

  $combustible = null;
  if ($tipo_combustible_id !== null && isset($MAP_TIPO_TO_ENUM[$tipo_combustible_id])) {
    $combustible = $MAP_TIPO_TO_ENUM[$tipo_combustible_id];
  } else {
    // Fallback: leer de tipocombustible si existe el id
    if ($tipo_combustible_id !== null) {
      $stTc = $conn->prepare("SELECT combustibletipo FROM tipocombustible WHERE id = ? LIMIT 1");
      $stTc->bind_param("i", $tipo_combustible_id);
      $stTc->execute();
      $resTc = $stTc->get_result();
      if ($rowTc = $resTc->fetch_assoc()) {
        $combustible = (string)$rowTc['combustibletipo'];
      }
      $stTc->close();
    }
  }

  // Permitidos (incluye GLP)
  $PERMITIDOS = ['DIESEL B5 (DB5)','G-REGULAR','G-PREMIUM','GLP'];
  if ($combustible === null || !in_array($combustible, $PERMITIDOS, true)) {
    $_SESSION['error_abastecimiento_galonera'] = "No se pudo determinar un tipo de combustible válido.";
    $conn->closeConnection();
    header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}"); exit();
  }

  // 3.5) Vale duplicado (si no es NULL), excluyendo este registro
  if ($numero_vale !== null) {
    $stDup = $conn->prepare("SELECT id FROM control_abastecimiento_galonera WHERE numero_vale = ? AND id <> ? LIMIT 1");
    $stDup->bind_param("si", $numero_vale, $id);
    $stDup->execute();
    $stDup->store_result();
    if ($stDup->num_rows > 0) {
      $stDup->close();
      $_SESSION['error_abastecimiento_galonera'] = "El N° de vale '{$numero_vale}' ya está registrado en galoneras.";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}"); exit();
    }
    $stDup->close();
  }

  // 4) Determinar columna de responsable en la tabla (responsable_id o chofer_id)
  $tabla       = 'control_abastecimiento_galonera';
  $colResp     = null;
  $tieneResp   = columnaExiste($db, $tabla, 'responsable_id');
  $tieneChofer = columnaExiste($db, $tabla, 'chofer_id');

  if     ($tieneResp)   $colResp = 'responsable_id';
  elseif ($tieneChofer) $colResp = 'chofer_id';

  // 4.1) Si existe columna de responsable, validar el responsable y exigirlo
  if ($colResp !== null) {
    if ($responsable_id <= 0) {
      $_SESSION['error_abastecimiento_galonera'] = "Debe seleccionar un responsable válido (DNI).";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}"); exit();
    }
    // Validar responsable/chofer ACTIVO
    $sqlCh = "SELECT estado FROM choferes WHERE id = ? LIMIT 1";
    $stmt  = $conn->prepare($sqlCh);
    $stmt->bind_param("i", $responsable_id);
    $stmt->execute();
    $rsCh = $stmt->get_result();
    if ($rsCh->num_rows === 0) {
      $stmt->close();
      $_SESSION['error_abastecimiento_galonera'] = "El responsable indicado no existe.";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}"); exit();
    }
    $rowCh = $rsCh->fetch_assoc();
    $stmt->close();

    if (strtolower(trim($rowCh['estado'] ?? '')) !== 'activo') {
      $_SESSION['error_abastecimiento_galonera'] = "El responsable indicado no está ACTIVO.";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}"); exit();
    }
  }

  // 5) UPDATE (incluye responsable si la columna existe)
  if ($colResp !== null) {
    $sql = "UPDATE control_abastecimiento_galonera
            SET {$colResp} = ?,
                galonera_id = ?,
                grifo_id = ?,
                combustible_abastecido = ?,
                cantidad_gln = ?,
                valor_unitario_gln = ?,
                numero_vale = ?,
                fecha_abastecimiento = ?,
                hora_abastecimiento = ?,
                observaciones = ?
            WHERE id = ?";
    // Tipos: i i i s d d s s s s i  => "iiisddssssi"
    $stmt = $conn->prepare($sql);
    $stmt->bind_param(
      "iiisddssssi",
      $responsable_id,
      $galonera_id,
      $grifo_id,
      $combustible,
      $cantidad_gln,
      $valor_unitario_gln,
      $numero_vale,
      $fecha_abastecimiento,
      $hora_abastecimiento,
      $observaciones,
      $id
    );
  } else {
    // Sin columna para responsable: se actualiza el resto
    $sql = "UPDATE control_abastecimiento_galonera
            SET galonera_id = ?,
                grifo_id = ?,
                combustible_abastecido = ?,
                cantidad_gln = ?,
                valor_unitario_gln = ?,
                numero_vale = ?,
                fecha_abastecimiento = ?,
                hora_abastecimiento = ?,
                observaciones = ?
            WHERE id = ?";
    // Tipos: i i s d d s s s s i  => "iisddssssi"
    $stmt = $conn->prepare($sql);
    $stmt->bind_param(
      "iisddssssi",
      $galonera_id,
      $grifo_id,
      $combustible,
      $cantidad_gln,
      $valor_unitario_gln,
      $numero_vale,
      $fecha_abastecimiento,
      $hora_abastecimiento,
      $observaciones,
      $id
    );
  }

  $stmt->execute();
  $stmt->close();

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

  $desc = "Editó abast. GALONERA ID {$id}: Galonera ID {$galonera_id}, Grifo ID {$grifo_id}, Vale: "
        . ($numero_vale ?? 'N/D')
        . ", Fecha: {$fecha_abastecimiento} {$hora_abastecimiento}, Comb: {$combustible}, Cant: {$cantidad_gln} GLN, VU: {$valor_unitario_gln}";
  if ($colResp !== null) {
    $desc .= ", {$colResp}: {$responsable_id}";
  }

  registrarAuditoria(
    'control_abastecimiento_galonera',
    'editar',
    $desc,
    $id_usuario,
    $nombre_usuario,
    'control_abastecimiento_galonera',
    $id,
    $tipo_usuario
  );

  // 7) Sesiones para notificación
  $nonce = function_exists('random_bytes') ? bin2hex(random_bytes(6)) : (string)microtime(true);
  $_SESSION['UpdateAbastecimientoGalonera'] = $id;
  $_SESSION['abast_gal_edit_id']            = $id;
  $_SESSION['abast_gal_edit_exito']         = true;
  $_SESSION['abast_gal_edit_nonce']         = $nonce;

  $conn->closeConnection();
  header("Location: ../../Vista/Administrador/Adm_Gestion_Abastecimientos.php");
  exit();

} catch (mysqli_sql_exception $e) {
  $_SESSION['error_abastecimiento_galonera'] = "DB error: " . $e->getMessage();
  $conn->closeConnection();
  header("Location: ../../Vista/Administrador/Adm_Editar_Abastecimiento_Galonera.php?IAG={$id}");
  exit();
}
