<?php

declare(strict_types=1);

use App\Support\SupplierRegions;
use Tests\TestCase;

// Бутстрапим приложение — mapToSupplier() пишет Log::warning при отбросе непереводимых.
uses(TestCase::class);

// Regression: Лидерра нумерует субъекты по конституционному порядку (RussianRegions,
// Красноярский=29), поставщик crm.bp-gr.ru — по автокодам ГИБДД (Красноярский=24,
// Архангельск=29). Sync слал Лидерра-код как есть → у поставщика выбирался ЧУЖОЙ регион.
// SupplierRegions::mapToSupplier переводит Лидерра-код → код поставщика.

it('translates Liderra constitutional codes to supplier (ГИБДД) codes', function (): void {
    expect(SupplierRegions::mapToSupplier([29]))->toBe([24]); // Красноярский край
    expect(SupplierRegions::mapToSupplier([35]))->toBe([29]); // Архангельская обл.
    expect(SupplierRegions::mapToSupplier([24]))->toBe([21]); // Чувашская Республика
    expect(SupplierRegions::mapToSupplier([82]))->toBe([77]); // Москва
    expect(SupplierRegions::mapToSupplier([83]))->toBe([78]); // Санкт-Петербург
});

it('returns empty for all-Russia (no regions)', function (): void {
    expect(SupplierRegions::mapToSupplier([]))->toBe([]);
});

it('ignores sentinel 0 (Вся РФ)', function (): void {
    expect(SupplierRegions::mapToSupplier([0]))->toBe([]);
});

it('drops regions the supplier does not offer', function (): void {
    // Поставщик НЕ предлагает: Московская (56), Ленинградская (53), Крым (13), новые территории.
    expect(SupplierRegions::mapToSupplier([56]))->toBe([]); // Московская обл.
    expect(SupplierRegions::mapToSupplier([53]))->toBe([]); // Ленинградская обл.
    expect(SupplierRegions::mapToSupplier([13]))->toBe([]); // Крым
    // mixed: оставляем переводимые, отбрасываем непереводимые
    expect(SupplierRegions::mapToSupplier([29, 56]))->toBe([24]); // Красноярский kept, Московская dropped
});

it('dedupes and sorts supplier codes', function (): void {
    // 35→29 (Архангельск), 29→24 (Красноярский), дубль 35 → unique+sorted [24,29]
    expect(SupplierRegions::mapToSupplier([35, 29, 35]))->toBe([24, 29]);
});

it('every map entry points to a distinct supplier code (no collisions)', function (): void {
    $targets = array_values(SupplierRegions::LIDERRA_TO_SUPPLIER);
    expect(count($targets))->toBe(count(array_unique($targets)));
});

test('mapFromSupplier inverts LIDERRA_TO_SUPPLIER bijection', function (): void {
    // ГИБДД 24 → Лидерра 29 (Красноярский); ГИБДД 77 → Лидерра 82 (Москва)
    expect(SupplierRegions::mapFromSupplier([24]))->toBe([29]);
    expect(SupplierRegions::mapFromSupplier([77]))->toBe([82]);
});

test('mapFromSupplier maps multiple codes, sorted ascending, deduped', function (): void {
    // ГИБДД 77→82 (Москва), 78→83 (СПб), 24→29 (Красноярский)
    expect(SupplierRegions::mapFromSupplier([78, 24, 77, 24]))->toBe([29, 82, 83]);
});

test('mapFromSupplier drops unknown supplier codes', function (): void {
    // 999 нет в карте → отброшен; 24 → 29
    expect(SupplierRegions::mapFromSupplier([999, 24]))->toBe([29]);
});

test('mapFromSupplier returns [] for empty input', function (): void {
    expect(SupplierRegions::mapFromSupplier([]))->toBe([]);
});
