<?php

declare(strict_types=1);

use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;

/**
 * Воронка статусов 14 → 5 (редизайн «Сделки» 2026-05-17).
 *
 * Новые 5: new / viewed / in_progress / won / lost. Slug'и `new` и `viewed`
 * сохраняются (RouteSupplierLeadJob / DealController@store default'ят 'new').
 * Ремап старых 14 → 5 в deals.status и import_unknown_statuses.mapped_to_slug
 * перед DELETE устаревших lead_statuses (FK-safe). tenant_status_overrides
 * со старыми slug'ами удаляются (кастомные ярлыки схлопнутых статусов
 * обсолетны + исключает PK-коллизию при ремапе).
 *
 * На migrate:fresh schema.sql уже сеет 5 — UPDATE/DELETE здесь no-op.
 * down() необратима (схлопывание lossy).
 *
 * Спека: docs/superpowers/specs/2026-05-17-deals-page-redesign-design.md §3.
 */
return new class extends Migration
{
    /** Старый slug → новый. new/viewed не меняются (отсутствуют в карте). */
    private const REMAP = [
        'worked' => 'in_progress', 'base' => 'in_progress', 'missed' => 'in_progress',
        'negotiations' => 'in_progress', 'waiting_payment' => 'in_progress',
        'partnership' => 'in_progress', 'test_drive' => 'in_progress', 'hot' => 'in_progress',
        'replacement' => 'in_progress', 'final_missed' => 'in_progress',
        'paid' => 'won', 'closed' => 'lost',
    ];

    private const KEEP = ['new', 'viewed', 'in_progress', 'won', 'lost'];

    public function up(): void
    {
        DB::transaction(function () {
            // 1) Новые slug'и обязаны существовать до ремапа FK-ссылок.
            DB::table('lead_statuses')->upsert([
                ['slug' => 'new', 'name_ru' => 'Новая сделка', 'is_system' => true, 'sort_order' => 1, 'color_hex' => '#3B82F6'],
                ['slug' => 'viewed', 'name_ru' => 'Просмотрено', 'is_system' => true, 'sort_order' => 2, 'color_hex' => '#8B5CF6'],
                ['slug' => 'in_progress', 'name_ru' => 'В работе', 'is_system' => true, 'sort_order' => 3, 'color_hex' => '#06B6D4'],
                ['slug' => 'won', 'name_ru' => 'Сделка', 'is_system' => true, 'sort_order' => 4, 'color_hex' => '#10B981'],
                ['slug' => 'lost', 'name_ru' => 'Не реализовано', 'is_system' => true, 'sort_order' => 5, 'color_hex' => '#6B7280'],
            ], ['slug'], ['name_ru', 'is_system', 'sort_order', 'color_hex']);

            // 2) Ремап ссылок на старые slug'и.
            foreach (self::REMAP as $old => $new) {
                DB::table('deals')->where('status', $old)->update(['status' => $new]);
                DB::table('import_unknown_statuses')->where('mapped_to_slug', $old)->update(['mapped_to_slug' => $new]);
            }

            // 3) Обсолетные кастомные ярлыки статусов — удалить (FK на lead_statuses).
            DB::table('tenant_status_overrides')->whereNotIn('status_slug', self::KEEP)->delete();

            // 4) Удалить устаревшие статусы (все FK-ссылки перенаправлены).
            DB::table('lead_statuses')->whereNotIn('slug', self::KEEP)->delete();
        });
    }

    public function down(): void
    {
        throw new RuntimeException('Воронка 14→5 необратима (схлопывание статусов lossy).');
    }
};
