<?php
declare(strict_types=1);

// No saques warnings al cliente (rompen el JSON)
ini_set('display_errors', '0');
error_reporting(E_ALL);

// Captura cualquier salida accidental (BOM, espacios, echo/var_dump)
ob_start();

header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Expires: 0');

require_once __DIR__ . '/../Utilidades/Conexion_BD.php';
require_once __DIR__ . '/MySQL_Mostrar_Galoneras.php';

try {
    $conn  = new Conexion_BD();
    $model = new MostrarGaloneras($conn);

    // Puede lanzar excepción; lo capturamos abajo
    $rows  = $model->ObtenerTodasLasGaloneras();

    // Normaliza estructura de salida (tipos consistentes)
    $out = [];
    if (is_array($rows)) {
        foreach ($rows as $g) {
            $out[] = [
                'id'                      => isset($g['id']) ? (int)$g['id'] : 0,
                'codigo'                  => (string)($g['codigo'] ?? ''),
                'capacidad_litros'        => isset($g['capacidad_litros']) ? (float)$g['capacidad_litros'] : 0.0,
                'tipo_combustible_id'     => array_key_exists('tipo_combustible_id', $g) && $g['tipo_combustible_id'] !== null
                                                ? (int)$g['tipo_combustible_id'] : null,
                'tipo_combustible_nombre' => (string)($g['tipo_combustible_nombre'] ?? ''),
                'estado'                  => (string)($g['estado'] ?? ''),
                // deja tal cual lo que venga de MySQL (DATE/DATETIME en string)
                'fecha_estado_desde'      => $g['fecha_estado_desde'] ?? null,
                'motivo_estado'           => (string)($g['motivo_estado'] ?? ''),
            ];
        }
    }

    // Borra cualquier salida previa (BOM/espacios/warnings capturados)
    ob_clean();

    // Emite JSON (con sustitución de UTF-8 inválido para evitar fallos)
    $json = json_encode(
        $out,
        JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE
    );

    if ($json === false) {
        http_response_code(500);
        echo json_encode(
            ['error' => true, 'message' => 'JSON encode failed'],
            JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE
        );
    } else {
        http_response_code(200);
        echo $json;
    }

} catch (Throwable $e) {
    // Limpia cualquier salida previa
    ob_clean();
    http_response_code(500);
    echo json_encode([
        'error'   => true,
        'message' => 'Error al listar galoneras',
        'detail'  => $e->getMessage(),
    ], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);

} finally {
    if (isset($conn)) { $conn->closeConnection(); }
    // Envía SOLO lo que imprimimos arriba
    ob_end_flush();
    exit;
}
