<?php

declare(strict_types=1);

namespace App\Services\Project;

use Carbon\CarbonInterface;

/**
 * Единый источник текстов правил сбора для клиента (Эпик 6).
 *
 * Клиент должен ПОНИМАТЬ текущие правила: почему изменения вступают не сразу,
 * почему после паузы ещё приходят лиды («хвост»), когда пойдут первые. Эти тексты —
 * единственный источник: их тянут и in-app уведомления (Task 6.2), и баннеры на
 * экране (Task 6.3, через ProjectResource), чтобы строки не дублировались и не
 * расходились. Дата форматируется в род. падеже «D MMMM» (напр. «27 июня»).
 *
 * Spec: docs/superpowers/specs/2026-06-25-snapshot-source-routing-design.md (Эпик 6).
 */
class ProjectRuleMessages
{
    /** Месяцы в родительном падеже для «D MMMM» (локаль приложения = en, форматируем сами). */
    private const MONTHS_GENITIVE = [
        1 => 'января', 2 => 'февраля', 3 => 'марта', 4 => 'апреля',
        5 => 'мая', 6 => 'июня', 7 => 'июля', 8 => 'августа',
        9 => 'сентября', 10 => 'октября', 11 => 'ноября', 12 => 'декабря',
    ];

    public function formatDate(CarbonInterface $date): string
    {
        $msk = $date->copy()->setTimezone('Europe/Moscow');

        return $msk->day.' '.self::MONTHS_GENITIVE[$msk->month];
    }

    /** Проект создан → слепок: эффект со следующего дня. */
    public function projectCreated(CarbonInterface $firstLeadDate): string
    {
        return 'Проект в сборе. Первые лиды пойдут с '.$this->formatDate($firstLeadDate).'.';
    }

    /** Изменён лимит/регион/дни после порога → правка вступит в силу позже. */
    public function changesApplyFrom(CarbonInterface $appliesFrom): string
    {
        return 'Изменения вступят в силу с '.$this->formatDate($appliesFrom).'.';
    }

    /** Смена источника подтверждена → хвост старого источника. */
    public function sourceChanged(CarbonInterface $tailUntil): string
    {
        return 'Лиды по старому источнику придут до '.$this->formatDate($tailUntil)
            .', дальше — по новому.';
    }

    /** Проект на паузе → grace-хвост после паузы. */
    public function projectPaused(CarbonInterface $graceUntil): string
    {
        return 'Сбор остановится сегодня в 18:00. До '.$this->formatDate($graceUntil)
            .' ещё могут прийти уже заказанные лиды — это нормально.';
    }

    /** Проект возобновлён → слепок на следующий день. */
    public function projectResumed(CarbonInterface $firstLeadDate): string
    {
        return 'Проект снова в сборе. Лиды пойдут с '.$this->formatDate($firstLeadDate).'.';
    }

    /** Баланс заканчивается → preflight/заморозка. */
    public function balanceRunningOut(int $leads): string
    {
        return 'Баланса хватит примерно на '.$leads.' '.$this->leadsWord($leads)
            .'. Пополните, чтобы сбор не остановился.';
    }

    /** Склонение слова «лид» по числу. */
    private function leadsWord(int $n): string
    {
        $mod100 = $n % 100;
        $mod10 = $n % 10;
        if ($mod100 >= 11 && $mod100 <= 14) {
            return 'лидов';
        }
        if ($mod10 === 1) {
            return 'лид';
        }
        if ($mod10 >= 2 && $mod10 <= 4) {
            return 'лида';
        }

        return 'лидов';
    }
}
