<?php

declare(strict_types=1);

namespace App\Console\Commands;

use App\Models\SupplierLead;
use App\Services\LeadRegionResolver;
use App\Support\RussianRegions;
use Illuminate\Console\Command;

/**
 * Staging-smoke резолва региона по телефону (spec §9.4): дёргает живой каскад
 * DaData → Россвязь → tag и печатает решение. В БД ничего НЕ пишет.
 *
 *   php artisan phone-region:smoke --phone=79161234567 [--tag=Москва]
 *
 * Принудительно включает services.dadata.enabled на время прогона (smoke всегда
 * проверяет полный каскад, независимо от глобального feature-flag). С реальным
 * DADATA_API_KEY делает платный вызов — запускать осознанно.
 */
class PhoneRegionSmokeCommand extends Command
{
    /** @var string */
    protected $signature = 'phone-region:smoke
        {--phone= : Телефон в формате 7XXXXXXXXXX}
        {--tag= : Регион-тег поставщика (fallback-слой)}';

    /** @var string */
    protected $description = 'Прогон резолва региона по телефону (DaData→Россвязь→tag) без записи в БД (staging-smoke)';

    public function handle(LeadRegionResolver $resolver): int
    {
        $phone = (string) $this->option('phone');
        if ($phone === '') {
            $this->error('Укажите --phone=7XXXXXXXXXX');

            return self::FAILURE;
        }

        // Smoke всегда прогоняет полный каскад, даже если глобальный флаг выключен.
        config(['services.dadata.enabled' => true]);

        $lead = new SupplierLead([
            'phone' => $phone,
            'raw_payload' => ['tag' => (string) $this->option('tag')],
        ]);

        $r = $resolver->resolve($lead);

        $region = $r->subjectCode !== null
            ? (RussianRegions::CODE_TO_NAME[$r->subjectCode] ?? '?')
            : '—';

        $this->info('Телефон:    '.$this->maskPhone($phone));
        $this->line('Источник:   '.$r->source);
        $this->line('Субъект:    '.($r->subjectCode ?? '—').' ('.$region.')');
        $this->line('Оператор:   '.($r->phoneOperator ?? '—'));
        $this->line('DaData qc:  '.($r->qc ?? '—'));
        $this->line('Cache hit:  '.($r->cacheHit ? 'да' : 'нет'));
        $this->line('Россвязь:   '.($r->rossvyazMatched ? 'совпала' : 'нет'));
        $this->line('Длит., мс:  '.($r->durationMs ?? '—'));
        $this->newLine();
        $this->comment('NB: запись в БД НЕ выполнялась (smoke).');

        return self::SUCCESS;
    }

    private function maskPhone(string $phone): string
    {
        $digits = preg_replace('/\D+/', '', $phone) ?? '';
        if (strlen($digits) < 8) {
            return '***';
        }

        return substr($digits, 0, 4).'***'.substr($digits, -4);
    }
}
