<?php
// ../../Controlador/Ctrl_Administrador/MySQL_Mostrar_Abastecimientos_Galonera.php
require_once __DIR__ . '/../Utilidades/Conexion_BD.php';

class MostrarAbastecimientosGalonera {
  private mysqli $conn;

  public function __construct(Conexion_BD $conexion) {
    $this->conn = $conexion->getConnection();
    // Asegura charset correcto para tildes
    if (method_exists($this->conn, 'set_charset')) {
      @$this->conn->set_charset('utf8mb4');
    }
  }

  /**
   * Verifica si una columna existe en la tabla indicada (en la BD actual).
   */
  private function columnExists(string $table, string $column): bool {
    $res = $this->conn->query("SELECT DATABASE() AS db");
    $dbRow = $res ? $res->fetch_assoc() : null;
    $dbname = $dbRow ? $dbRow['db'] : '';

    $sql = "SELECT COUNT(*) AS cnt
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_SCHEMA = ?
              AND TABLE_NAME   = ?
              AND COLUMN_NAME  = ?";
    $stmt = $this->conn->prepare($sql);
    $stmt->bind_param("sss", $dbname, $table, $column);
    $stmt->execute();
    $r = $stmt->get_result()->fetch_assoc();
    $stmt->close();
    return isset($r['cnt']) && ((int)$r['cnt']) > 0;
  }

  /**
   * Devuelve todos los abastecimientos de galoneras, listos para DataTable.
   * - `combustible_abastecido`: sale directo del registro si existe; si está NULL/vacío, usa tipocombustible de la galonera.
   * - `cantidad_gln_raw`, `valor_unitario_gln_raw`, `total_soles_raw`: ayudan al render numérico exacto.
   * - Responsable: soporta esquema con `responsable_id` o `chofer_id`.
   */
  public function ObtenerTodos(): array {
    $tabla = 'control_abastecimiento_galonera';
    $tieneResp = $this->columnExists($tabla, 'responsable_id');
    $tieneChof = $this->columnExists($tabla, 'chofer_id');

    // Joins dinámicos según columnas disponibles
    $joins = [];
    if ($tieneResp) $joins[] = "LEFT JOIN choferes r ON r.id = gag.responsable_id";
    if ($tieneChof) $joins[] = "LEFT JOIN choferes c ON c.id = gag.chofer_id";

    // Expresiones para ID y nombre del responsable
    if ($tieneResp && $tieneChof) {
      $responsableIdExpr  = "COALESCE(gag.responsable_id, gag.chofer_id) AS responsable_id";
      $nombreRespExpr     = "COALESCE(NULLIF(TRIM(CONCAT(COALESCE(r.nombres,''),' ',COALESCE(r.apellidos,''))),''), NULLIF(TRIM(CONCAT(COALESCE(c.nombres,''),' ',COALESCE(c.apellidos,''))),''))";
      $dniRespExpr        = "COALESCE(r.dni, c.dni)";
    } elseif ($tieneResp) {
      $responsableIdExpr  = "gag.responsable_id AS responsable_id";
      $nombreRespExpr     = "TRIM(CONCAT(COALESCE(r.nombres,''),' ',COALESCE(r.apellidos,'')))";
      $dniRespExpr        = "r.dni";
    } elseif ($tieneChof) {
      $responsableIdExpr  = "gag.chofer_id AS responsable_id";
      $nombreRespExpr     = "TRIM(CONCAT(COALESCE(c.nombres,''),' ',COALESCE(c.apellidos,'')))";
      $dniRespExpr        = "c.dni";
    } else {
      // No hay columna responsable/chofer en la tabla (evita error y devuelve nulls)
      $responsableIdExpr  = "NULL AS responsable_id";
      $nombreRespExpr     = "NULL";
      $dniRespExpr        = "NULL";
    }

    // Nota: tomamos el combustible directo de la fila; si viene NULL/'' se usa el de la galonera
    // (tipocombustible.combustibletipo), lo que permite GLP u otros nuevos sin tocar el código.
    $sql = "
      SELECT 
        gag.id,

        -- Galonera y grifo
        g.codigo                                  AS galonera,
        gr.nombre                                 AS grifo,

        -- Responsable (dos alias por compatibilidad: 'responsable' y 'chofer')
        $responsableIdExpr,
        $dniRespExpr                               AS responsable_dni,
        $nombreRespExpr                            AS responsable,
        $nombreRespExpr                            AS chofer,

        -- Combustible final (prioriza el registrado en el abastecimiento; si falta, usa el de la galonera)
        COALESCE(NULLIF(gag.combustible_abastecido,''), tc.combustibletipo, '') AS combustible_abastecido,

        -- Números (crudos y también los originales por compatibilidad)
        gag.cantidad_gln,
        gag.valor_unitario_gln,
        CAST(gag.cantidad_gln        AS DECIMAL(18,5)) AS cantidad_gln_raw,
        CAST(gag.valor_unitario_gln  AS DECIMAL(18,2)) AS valor_unitario_gln_raw,
        CAST(gag.cantidad_gln * gag.valor_unitario_gln AS DECIMAL(18,2)) AS total_soles_raw,

        -- Otros campos
        gag.numero_vale,
        gag.fecha_abastecimiento,
        gag.hora_abastecimiento,
        gag.observaciones

      FROM $tabla gag
      LEFT JOIN galoneras g           ON g.id = gag.galonera_id
      LEFT JOIN grifos    gr          ON gr.id = gag.grifo_id
      LEFT JOIN tipocombustible tc    ON tc.id = g.tipo_combustible_id
      " . implode("\n      ", $joins) . "
      ORDER BY gag.fecha_abastecimiento DESC, gag.hora_abastecimiento DESC, gag.id DESC
    ";

    $res = $this->conn->query($sql);
    if (!$res) return [];

    $rows = [];
    while ($row = $res->fetch_assoc()) {
      // Saneos mínimos para evitar nulls en JSON
      $row['combustible_abastecido'] = isset($row['combustible_abastecido']) ? (string)$row['combustible_abastecido'] : '';
      $rows[] = $row;
    }
    return $rows;
  }
}
