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

// Para depurar errores de mysqli
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

if (
  isset(
    $_POST['galonera_id'],
    $_POST['grifo_id'],
    $_POST['cantidad_gln'],
    $_POST['valor_unitario_gln'],
    $_POST['fecha_abastecimiento'],
    $_POST['hora_abastecimiento']
  )
) {
  $galonera_id          = (int) $_POST['galonera_id'];
  $grifo_id             = (int) $_POST['grifo_id'];

  // Responsable (hidden seteado por el JS al validar DNI)
  $responsable_id       = isset($_POST['responsable_id']) ? (int) $_POST['responsable_id'] : 0;

  // Llega desde el JS (hidden) cuando cambias la galonera
  $tipo_combustible_id  = (isset($_POST['tipo_combustible_id']) && $_POST['tipo_combustible_id'] !== '')
                          ? (int) $_POST['tipo_combustible_id'] : null;

  // ==== NORMALIZACIONES DECIMALES (coma -> punto) Y REDONDEO EXACTO ====
  $cantidad_gln_in      = str_replace(',', '.', (string)($_POST['cantidad_gln'] ?? '0'));
  $valor_unitario_in    = str_replace(',', '.', (string)($_POST['valor_unitario_gln'] ?? '0'));

  if (!preg_match('/^\d+(\.\d{1,5})?$/', $cantidad_gln_in)) {
    $_SESSION['error_abastecimiento_galonera'] = "Cantidad (GLN) inválida. Máximo 5 decimales.";
    header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento_Galonera.php"); exit();
  }
  if (!preg_match('/^\d+(\.\d{1,2})?$/', $valor_unitario_in)) {
    $_SESSION['error_abastecimiento_galonera'] = "Valor unitario inválido. Máximo 2 decimales.";
    header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento_Galonera.php"); exit();
  }

  $cantidad_gln       = round((float)$cantidad_gln_in, 5);
  $valor_unitario_gln = round((float)$valor_unitario_in, 2);

  // ======= N° de Vale: permitir letras, números, "-", "/" (máx. 20) =======
  $numero_vale_raw = isset($_POST['numero_vale']) ? trim($_POST['numero_vale']) : '';
  $numero_vale     = strtoupper(preg_replace('/[^A-Z0-9\-\/]/', '', $numero_vale_raw));
  if ($numero_vale === '') {
    $numero_vale = null; // se permite NULL para galonera
  } else {
    if (!preg_match('/^[A-Z0-9\-\/]{1,20}$/', $numero_vale)) {
      $_SESSION['error_abastecimiento_galonera'] = "N° de vale inválido. Use A-Z, 0-9, '-' y '/' (máx. 20).";
      header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento_Galonera.php"); exit();
    }
  }

  $fecha_abastecimiento = $_POST['fecha_abastecimiento'];
  $hora_abastecimiento  = $_POST['hora_abastecimiento'];

  $observaciones_raw    = isset($_POST['observaciones']) ? trim($_POST['observaciones']) : '';
  $observaciones        = ($observaciones_raw === '') ? null : $observaciones_raw;

  // ===== Validaciones mínimas =====
  if ($cantidad_gln <= 0) {
    $_SESSION['error_abastecimiento_galonera'] = "La cantidad (GLN) debe ser mayor a 0.";
    header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento_Galonera.php"); exit();
  }
  if ($valor_unitario_gln <= 0) {
    $_SESSION['error_abastecimiento_galonera'] = "El valor unitario debe ser mayor a 0.";
    header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento_Galonera.php"); exit();
  }
  if ($responsable_id <= 0) {
    $_SESSION['error_abastecimiento_galonera'] = "Debe indicar un responsable válido (DNI).";
    header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento_Galonera.php"); exit();
  }

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

  // Helper: saber si la tabla tiene una columna
  function tablaTieneColumna(mysqli $db, string $tabla, string $col): bool {
    $dbname = $db->query("SELECT DATABASE()")->fetch_row()[0];
    $sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? AND COLUMN_NAME = ?";
    $stmt = $db->prepare($sql);
    $stmt->bind_param("sss", $dbname, $tabla, $col);
    $stmt->execute();
    $stmt->bind_result($cnt);
    $stmt->fetch();
    $stmt->close();
    return ((int)$cnt) > 0;
  }

  // Mapa rápido por si conoces los IDs
  $MAP_TIPO_TO_ENUM = [
    1 => 'DIESEL B5 (DB5)',
    2 => 'G-REGULAR',
    3 => 'G-PREMIUM',
    8 => 'GLP',            // ← GLP agregado
  ];

  try {
    // (0) Validar responsable exista y esté ACTIVO
    $sqlCh = "SELECT dni, CONCAT(COALESCE(nombres,''),' ',COALESCE(apellidos,'')) AS nombre, estado
              FROM choferes WHERE id = ? LIMIT 1";
    $stCh  = $db->prepare($sqlCh);
    $stCh->bind_param("i", $responsable_id);
    $stCh->execute();
    $resCh = $stCh->get_result();
    if ($resCh->num_rows === 0) {
      $stCh->close();
      $_SESSION['error_abastecimiento_galonera'] = "El responsable seleccionado no existe.";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento_Galonera.php"); exit();
    }
    $rowCh = $resCh->fetch_assoc();
    $stCh->close();

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

    // (1) Validar galonera activa y traer su tipo/capacidad
    $stmt = $db->prepare("SELECT capacidad_litros, estado, tipo_combustible_id
                          FROM galoneras WHERE id = ? LIMIT 1");
    $stmt->bind_param("i", $galonera_id);
    $stmt->execute();
    $rs = $stmt->get_result();
    if ($rs->num_rows === 0) {
      $stmt->close();
      $_SESSION['error_abastecimiento_galonera'] = "Galonera no encontrada.";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento_Galonera.php"); exit();
    }
    $gal = $rs->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_Formulario_Abastecimiento_Galonera.php"); exit();
    }

    // Si no vino tipo_combustible_id desde el form, usar el de la galonera
    if ($tipo_combustible_id === null && isset($gal['tipo_combustible_id'])) {
      $tipo_combustible_id = (int)$gal['tipo_combustible_id'];
    }

    // Deducir combustible_abastecido (ENUM) desde el ID o BD
    $combustible = null;
    if ($tipo_combustible_id !== null && isset($MAP_TIPO_TO_ENUM[$tipo_combustible_id])) {
      $combustible = $MAP_TIPO_TO_ENUM[$tipo_combustible_id];
    } else {
      if ($tipo_combustible_id !== null) {
        $stTc = $db->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 = $rowTc['combustibletipo'];
        }
        $stTc->close();
      }
    }

    // Ahora PERMITIDOS incluye GLP
    $PERMITIDOS = ['DIESEL B5 (DB5)','G-REGULAR','G-PREMIUM','GLP'];
    if (!in_array($combustible, $PERMITIDOS, true)) {
      $_SESSION['error_abastecimiento_galonera'] = "Tipo de combustible inválido.";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento_Galonera.php"); exit();
    }

    // Capacidad
    $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_Formulario_Abastecimiento_Galonera.php"); exit();
    }

    // (2) Decidir columna destino: responsable_id o chofer_id
    $tabla   = 'control_abastecimiento_galonera';
    $colResp = null;
    if (tablaTieneColumna($db, $tabla, 'responsable_id')) {
      $colResp = 'responsable_id';
    } elseif (tablaTieneColumna($db, $tabla, 'chofer_id')) {
      $colResp = 'chofer_id';
    } else {
      $_SESSION['error_abastecimiento_galonera'] =
        "La tabla '$tabla' no tiene columna 'responsable_id' ni 'chofer_id'.";
      $conn->closeConnection();
      header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento_Galonera.php"); exit();
    }

    // (2.9) Bloquear N° de vale duplicado (solo si NO es NULL)
    if ($numero_vale !== null) {
      $stDup = $db->prepare("SELECT id FROM $tabla 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_galonera'] =
          "El N° de vale '{$numero_vale}' ya está registrado en galoneras.";
        $conn->closeConnection();
        header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento_Galonera.php"); exit();
      }
      $stDup->close();
    }

    // (3) INSERT incluyendo el responsable
    $sql = "INSERT INTO $tabla
            (galonera_id, $colResp, grifo_id, combustible_abastecido, cantidad_gln, valor_unitario_gln,
             numero_vale, fecha_abastecimiento, hora_abastecimiento, observaciones)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
    $stmt = $db->prepare($sql);
    // Tipos: i i i s d d s s s s  => "iiisddssss"
    $stmt->bind_param(
      "iiisddssss",
      $galonera_id,
      $responsable_id,
      $grifo_id,
      $combustible,
      $cantidad_gln,
      $valor_unitario_gln,
      $numero_vale,          // puede ser NULL
      $fecha_abastecimiento,
      $hora_abastecimiento,
      $observaciones         // puede ser NULL
    );
    $stmt->execute();
    $id_nuevo = $db->insert_id;
    $stmt->close();

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

    $desc = "Registró abast. GALONERA: Galonera ID $galonera_id, $colResp: $responsable_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";

    registrarAuditoria(
      $tabla,
      'agregar',
      $desc,
      $id_usuario,
      $nombre_usuario,
      $tabla,
      $id_nuevo,
      $tipo_usuario
    );

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

  } catch (mysqli_sql_exception $e) {
    // Si luego agregas índice UNIQUE en numero_vale
    if ((int)$e->getCode() === 1062 || strpos($e->getMessage(), '1062') !== false) {
      $_SESSION['error_abastecimiento_galonera'] =
        "Número de vale duplicado" . ($numero_vale ? ": '{$numero_vale}'" : "") . ".";
    } else {
      $_SESSION['error_abastecimiento_galonera'] = "DB error: " . $e->getMessage();
    }
    $conn->closeConnection();
    header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento_Galonera.php"); exit();
  }

} else {
  $_SESSION['error_abastecimiento_galonera'] = "Faltan datos obligatorios.";
  header("Location: ../../Vista/Administrador/Adm_Formulario_Abastecimiento_Galonera.php"); exit();
}
