<?php

declare(strict_types=1);

namespace App\Support;

use App\Models\CompanyFinancialSettings;

/**
 * Montos de la cola offline escritos en modo simplificado ('50' = $50.000).
 * Lo usan los lotes de cobros, visitas y gastos.
 *
 * Se convierte si el ítem dice que se capturó así, aunque la empresa haya
 * apagado el modo después: el flag describe cómo se escribió el número, no cómo
 * está la empresa hoy.
 */
final class SimplifiedAmount
{
    /**
     * Si el ítem dice que se escribió en modo simplificado. "1", "true" y "on"
     * cuentan; cualquier otra cosa, no. Los endpoints directos lo leen igual
     * que los lotes: la misma fila puede llegar por cualquiera de los dos.
     *
     * @param  array<string, mixed>  $item
     */
    public static function flagged(array $item): bool
    {
        return filter_var($item['is_simplified_amount'] ?? false, FILTER_VALIDATE_BOOLEAN);
    }

    /**
     * Si `$field` del ítem se escribió en modo simplificado y hay que convertirlo.
     *
     * @param  array<string, mixed>  $item
     */
    public static function applies(array $item, string $field): bool
    {
        return self::flagged($item)
            && isset($item[$field])
            && is_numeric($item[$field]);
    }

    /**
     * El ítem con `$field` pasado a monto real. Un valor que no es numérico se
     * deja tal cual: la validación de quien llama lo rechaza.
     *
     * @param  array<string, mixed>  $item
     * @return array<string, mixed>
     */
    public static function toReal(array $item, string $field, CompanyFinancialSettings $settings): array
    {
        if (self::applies($item, $field)) {
            // round(): 1.005 × 1000 da 1004.9999… en float.
            $item[$field] = round($settings->convertSimplifiedToReal((float) $item[$field]), 2);
        }

        return $item;
    }
}
