<?php

declare(strict_types=1);

namespace App\Services\Billing;

use App\Models\Tenant;

/**
 * Единый расчёт «на сколько дней хватит affordable_leads» (F3 17.06.2026; B1-fix 24.06.2026).
 *
 * Единственный источник истины для прогноза runway — используется и биллингом
 * (BillingController::wallet), и дашбордом (DashboardController::summary).
 *
 * B1-fix (24.06.2026): считаем от ДНЕВНОГО ЗАКАЗА активных проектов
 * (Tenant::requiredLeadsForTomorrow = sum daily_limit_target), а не от прошлого
 * расхода за 30 дней. Старый расход-расчёт врал на новых аккаунтах: при пустой
 * истории отдавал null → дашборд рисовал «0 дней» при полном балансе, а при
 * крошечной истории раздувал число («10 дней из 7»). Теперь прогноз совпадает с
 * витриной ёмкости биллинга (BalanceCapacityIndicator: capacity / заказ-в-день).
 *
 * - affordable_leads ≤ 0 → 0 (тенант не может купить ни одного лида).
 * - дневной заказ активных проектов = 0 (нет активных проектов) → null (нечего
 *   заказывать — не от чего считать; дашборд показывает «—»/0, биллинг — null).
 * - иначе → floor(affordable_leads / дневной_заказ).
 */
class RunwayCalculator
{
    public function daysLeft(int $tenantId, int $affordableLeads): ?int
    {
        if ($affordableLeads <= 0) {
            return 0;
        }

        $tenant = Tenant::find($tenantId);
        $orderedPerDay = $tenant !== null ? $tenant->requiredLeadsForTomorrow() : 0;

        if ($orderedPerDay <= 0) {
            return null;
        }

        return max(0, (int) floor($affordableLeads / $orderedPerDay));
    }
}
