<?php

declare(strict_types=1);

namespace App\Services\External;

use Illuminate\Support\Carbon;

/**
 * Снимок баланса одного внешнего сервиса. Иммутабельный DTO — результат провайдера.
 * Провайдер НЕ бросает исключения наружу: ошибку заворачивает в self::fail().
 */
final class BalanceReading
{
    public function __construct(
        public readonly string $serviceKey,
        public readonly ?float $balance,
        public readonly string $currency,
        public readonly ?float $dailySpend,
        public readonly bool $ok,
        public readonly ?string $error,
        public readonly Carbon $checkedAt,
    ) {}

    public static function ok(string $key, float $balance, string $currency, ?float $dailySpend): self
    {
        return new self($key, $balance, $currency, $dailySpend, true, null, now());
    }

    public static function fail(string $key, string $error): self
    {
        return new self($key, null, 'RUB', null, false, mb_substr($error, 0, 500), now());
    }
}
