<?php

declare(strict_types=1);

namespace App\Services\Billing;

use App\Models\PricingTier;
use Illuminate\Database\Eloquent\Collection;

/**
 * Pure: проходит ли клиент преfflight — хватает ли баланса на ПОЛНЫЙ дневной
 * лимит всех его eligible-проектов по текущему тарифу.
 *
 * Сравнение в ЛИДАХ (capacity vs required), не в рублях — переиспользует
 * BalanceToLeadsConverter::convert, который учитывает 7 ступеней и накопленный
 * месячный объём (deliveredInMonth).
 *
 * Spec: docs/superpowers/specs/2026-05-24-billing-v2-spec-c-preflight-vtb-design.md §3.3
 */
final class BalancePreflightService
{
    public function __construct(
        private readonly BalanceToLeadsConverter $converter = new BalanceToLeadsConverter,
    ) {}

    /**
     * @param  Collection<int, PricingTier>  $tiers
     */
    public function evaluate(
        string $balanceRub,
        int $deliveredInMonth,
        int $requiredLeads,
        Collection $tiers,
    ): PreflightResult {
        if ($requiredLeads <= 0) {
            return new PreflightResult(true, 0, 0, 0);
        }

        $capacity = (int) $this->converter->convert($balanceRub, $deliveredInMonth, $tiers)['leads'];
        $passes = $capacity >= $requiredLeads;

        return new PreflightResult(
            passes: $passes,
            requiredLeads: $requiredLeads,
            capacityLeads: $capacity,
            deficitLeads: $passes ? 0 : ($requiredLeads - $capacity),
        );
    }
}
