<?php
// ../../Controlador/Ctrl_Administrador/MySQL_Listar_Abastecimientos_Galonera_DT.php
declare(strict_types=1);

header('Content-Type: application/json; charset=UTF-8');
@ini_set('default_charset', 'UTF-8');
if (function_exists('mb_internal_encoding')) { @mb_internal_encoding('UTF-8'); }

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

/**
 * Devuelve string con N decimales fijos (sin notación científica).
 * - $scale = 5 para cantidad_gln
 * - $scale = 2 para valor_unitario_gln
 */
function toFixed(?string $num, int $scale): ?string {
    if ($num === null || $num === '') return null;
    // Normaliza coma->punto, quita espacios
    $num = str_replace(',', '.', trim($num));
    if (!preg_match('/^-?\d+(\.\d+)?$/', $num)) return null;

    $f = (float)$num;
    $rounded = number_format((float)round($f, $scale), $scale, '.', '');

    // Asegura decimales fijos
    if (strpos($rounded, '.') === false) {
        $rounded .= '.' . str_repeat('0', $scale);
    }
    return $rounded;
}

/** Multiplicación precisa con escala fija (BCMath si está disponible). */
function mulFixed(string $a, string $b, int $scale): string {
    if (function_exists('bcmul')) {
        return bcmul($a, $b, $scale);
    }
    $prod = (float)$a * (float)$b;
    return number_format((float)round($prod, $scale), $scale, '.', '');
}

/** Formatea moneda peruana: S/ 1,234.56 (se usa en los *_fmt). */
function soles(string $n): string {
    $f = (float)$n;
    return 'S/ ' . number_format($f, 2, '.', ',');
}

try {
    $conn    = new Conexion_BD();
    $mostrar = new MostrarAbastecimientosGalonera($conn);
    $rows    = $mostrar->ObtenerTodos();   // array asociativo
    $conn->closeConnection();

    $rows = is_array($rows) ? $rows : [];

    $out = array_map(function(array $r) {
        // Tomar columnas como string para no perder ceros
        $cantidad_raw_db = isset($r['cantidad_gln']) ? (string)$r['cantidad_gln'] : null;
        $valor_raw_db    = isset($r['valor_unitario_gln']) ? (string)$r['valor_unitario_gln'] : null;

        // Normalizar a escala fija
        $cantidad_fixed = toFixed($cantidad_raw_db, 5); // 5 decimales
        $valor_fixed    = toFixed($valor_raw_db, 2);    // 2 decimales

        // Total a 2 decimales
        $total_fixed = ($cantidad_fixed !== null && $valor_fixed !== null)
            ? mulFixed($cantidad_fixed, $valor_fixed, 2)
            : null;

        // Combustible siempre string (permite GLP u otros nuevos)
        $comb = trim((string)($r['combustible_abastecido'] ?? ''));

        return [
            // Básicos
            'id'                     => isset($r['id']) ? (int)$r['id'] : 0,
            'fecha_abastecimiento'   => (string)($r['fecha_abastecimiento'] ?? ''),
            'hora_abastecimiento'    => (string)($r['hora_abastecimiento'] ?? ''),
            'galonera'               => (string)($r['galonera'] ?? ''),
            'responsable'            => (string)($r['responsable'] ?? ''), // nombre completo
            'chofer'                 => (string)($r['chofer'] ?? ''),      // compat. antigua
            'combustible_abastecido' => $comb,
            'grifo'                  => (string)($r['grifo'] ?? ''),
            'numero_vale'            => (string)($r['numero_vale'] ?? ''), // admite slash
            'observaciones'          => (string)($r['observaciones'] ?? ''),

            // Números crudos para render en front
            'cantidad_gln_raw'       => $cantidad_fixed, // string con 5 decimales
            'valor_unitario_gln_raw' => $valor_fixed,    // string con 2 decimales
            'total_soles_raw'        => $total_fixed,    // string con 2 decimales

            // Formateados (si los necesitas en alguna vista/exportación)
            'cantidad_gln_fmt'       => $cantidad_fixed !== null ? $cantidad_fixed : '',
            'valor_unitario_gln_fmt' => $valor_fixed    !== null ? soles($valor_fixed) : '',
            'total_soles_fmt'        => $total_fixed    !== null ? soles($total_fixed) : '',
        ];
    }, $rows);

    echo json_encode($out, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
} catch (Throwable $e) {
    http_response_code(500);
    echo json_encode([
        'error'   => true,
        'message' => 'Error al listar abastecimientos de galoneras.',
        'detail'  => $e->getMessage()
    ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
