<?php

namespace Database\Seeders;

/*
 * DictTagsSeeder — заполняет справочники:
 *   1. Добавляет флаги существующим странам и дополняет раздел countries.
 *   2. Создаёт раздел service_tags с тегами услуг.
 *   3. Обновляет tags в таблице services — заменяет текстовые метки на ID из справочника.
 */

use App\Models\DictSection;
use App\Models\DictValue;
use App\Models\Service;
use Illuminate\Database\Seeder;

class DictTagsSeeder extends Seeder
{
    public function run(): void
    {
        // ── 1. Флаги и недостающие страны ────────────────────────────────
        $flags = [
            'Япония'         => '🇯🇵',
            'Южная Корея'    => '🇰🇷',
            'Германия'       => '🇩🇪',
            'США'            => '🇺🇸',
            'Китай'          => '🇨🇳',
            'Великобритания' => '🇬🇧',
            'Франция'        => '🇫🇷',
            'Италия'         => '🇮🇹',
            'Швеция'         => '🇸🇪',
            'Россия'         => '🇷🇺',
            'Чехия'          => '🇨🇿',
            'Испания'        => '🇪🇸',
            'Другое'         => '',
        ];

        $extra = [
            'Беларусь' => '🇧🇾',
            'Армения'  => '🇦🇲',
            'Грузия'   => '🇬🇪',
            'ОАЭ'      => '🇦🇪',
            'Канада'   => '🇨🇦',
            'Польша'   => '🇵🇱',
            'Бельгия'  => '🇧🇪',
        ];

        $countriesSection = DictSection::where('code', 'countries')->firstOrFail();

        // Обновляем флаги существующих стран
        foreach ($flags as $name => $flag) {
            DictValue::where('section_id', $countriesSection->id)
                ->where('value', $name)
                ->update(['flag' => $flag]);
        }

        // Добавляем недостающие страны
        $sort = DictValue::where('section_id', $countriesSection->id)->max('sort_order') ?? 0;
        foreach ($extra as $name => $flag) {
            $exists = DictValue::where('section_id', $countriesSection->id)
                ->where('value', $name)
                ->exists();
            if (!$exists) {
                DictValue::create([
                    'section_id' => $countriesSection->id,
                    'value'      => $name,
                    'flag'       => $flag,
                    'sort_order' => ++$sort,
                ]);
            } else {
                DictValue::where('section_id', $countriesSection->id)
                    ->where('value', $name)
                    ->update(['flag' => $flag]);
            }
        }

        // ── 2. Раздел service_tags ───────────────────────────────────────
        $tagsSection = DictSection::firstOrCreate(
            ['code' => 'service_tags'],
            ['label' => 'Теги услуг', 'is_system' => false, 'is_hierarchical' => false, 'sort_order' => 20]
        );

        $tagNames = [
            'Все площадки',
            'Проверка ГИБДД',
            'Диагностика кузова',
            'Юридическая проверка',
            'Торг с продавцом',
            'Сопровождение сделки',
            'Льготный утиль',
            'ЭПТС и СБКТС',
            'Страховка груза',
            'Отслеживание',
            'Copart / IAAI',
            'Восстановление',
            'Срок от 5 дней',
            'ЭПТС',
            'СБКТС',
            'Утилизационный сбор',
            'Постановка на учёт',
            'Кредит / лизинг',
        ];

        foreach ($tagNames as $i => $name) {
            DictValue::firstOrCreate(
                ['section_id' => $tagsSection->id, 'value' => $name],
                ['sort_order' => $i + 1]
            );
        }

        // ── 3. Обновляем tags в services: строки → ID ────────────────────
        // Строим карту: "название" → id  (страны + теги)
        $map = DictValue::whereIn('section_id', [$countriesSection->id, $tagsSection->id])
            ->get(['id', 'value', 'flag'])
            ->mapWithKeys(fn ($v) => [
                $v->value => $v->id,
                // Также ключ с флагом (напр. "🇩🇪 Германия" → id)
                trim($v->flag . ' ' . $v->value) => $v->id,
            ]);

        $updates = [
            'avtopodbor-v-rossii'       => ['Все площадки','Проверка ГИБДД','Диагностика кузова','Юридическая проверка','Торг с продавцом','Сопровождение сделки'],
            'dostavka-iz-evropy'        => ['Германия','Франция','Великобритания','Льготный утиль','ЭПТС и СБКТС'],
            'dostavka-iz-azii'          => ['Япония','Южная Корея','Китай','Страховка груза','Отслеживание'],
            'dostavka-iz-ssha-i-kanady' => ['США','Канада','Copart / IAAI','Восстановление'],
            'dostavka-iz-oae-i-sng'     => ['ОАЭ','Грузия','Армения','Беларусь','Срок от 5 дней'],
            'tamozhnya-pod-klyuch'      => ['ЭПТС','СБКТС','Утилизационный сбор','Постановка на учёт','Кредит / лизинг'],
        ];

        foreach ($updates as $slug => $tagNames) {
            $ids = array_values(array_filter(array_map(fn ($t) => $map[$t] ?? null, $tagNames)));
            Service::where('slug', $slug)->update(['tags' => json_encode($ids)]);
        }

        $this->command->info('Флаги, страны и теги услуг заполнены.');
    }
}
