<?php

declare(strict_types=1);

namespace App\Rules\SignalIdentifier;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

/**
 * Валидатор имени отправителя для signal_type=sms.
 *
 * Поставщик crm.bp-gr.ru блокирует 11-значные физические номера в роли
 * "имени отправителя" (см. tooltip в форме создания SMS-проекта).
 * Допустимы: буквенный alpha-sender (TINKOFF) или короткий числовой код (900, 1234).
 *
 * Spec: docs/superpowers/specs/2026-05-10-supplier-integration-design.md §3.1
 */
class SmsSenderRule implements ValidationRule
{
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        if (! is_string($value) || $value === '' || strlen($value) > 30) {
            $fail('SMS sender must be 1–30 characters.');

            return;
        }

        if (! preg_match('/^[A-Za-z0-9_-]+$/', $value)) {
            $fail('SMS sender must contain only letters, digits, underscore or hyphen.');

            return;
        }

        // Поставщик блокирует 11-значные номера (физический телефон в роли отправителя).
        if (preg_match('/^\d{11}$/', $value)) {
            $fail('SMS sender cannot be an 11-digit phone number (supplier rejection).');
        }
    }
}
