<?php

declare(strict_types=1);

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

/**
 * Phase 3 supplier webhook reliability — расширяет platform enum в
 * supplier_projects и project_supplier_links до (B1,B2,B3,DIRECT).
 *
 * DIRECT — это «прямая» платформа поставщика без B-префикса в имени
 * проекта (e.g. `client.carmoney.ru`, `cashmotor.ru`, числовые телефоны).
 * До Phase 3 такие webhook'и отвергались с 302-редиректом и терялись:
 * наблюдалось 67 потерь/день на проде 25.05.2026 для tenant client1.
 *
 * Spec: docs/superpowers/specs/2026-05-25-supplier-webhook-reliability-design.md §3 Phase 3
 *
 * NB: chk_supplier_projects_b1_not_for_sms (B1+SMS deny) НЕ трогаем —
 * DIRECT+SMS этим constraint'ом не блокируется (он специфичен для B1).
 */
return new class extends Migration
{
    public function up(): void
    {
        // 1) Расширить platform-колонки до VARCHAR(8) (было VARCHAR(4): "DIRECT" не вмещается).
        // supplier_manual_sync_queue.platform уже VARCHAR(8) — пропускаем.
        DB::statement('ALTER TABLE supplier_projects ALTER COLUMN platform TYPE VARCHAR(8)');
        DB::statement('ALTER TABLE project_supplier_links ALTER COLUMN platform TYPE VARCHAR(8)');
        DB::statement('ALTER TABLE supplier_leads ALTER COLUMN platform TYPE VARCHAR(8)');

        // 2) Расширить CHECK constraints на enum значения.
        DB::statement('ALTER TABLE supplier_projects DROP CONSTRAINT chk_supplier_projects_platform');
        DB::statement("ALTER TABLE supplier_projects ADD CONSTRAINT chk_supplier_projects_platform CHECK (platform IN ('B1','B2','B3','DIRECT'))");

        DB::statement('ALTER TABLE project_supplier_links DROP CONSTRAINT chk_psl_platform');
        DB::statement("ALTER TABLE project_supplier_links ADD CONSTRAINT chk_psl_platform CHECK (platform IN ('B1','B2','B3','DIRECT'))");

        DB::statement('ALTER TABLE supplier_leads DROP CONSTRAINT chk_supplier_leads_platform');
        DB::statement("ALTER TABLE supplier_leads ADD CONSTRAINT chk_supplier_leads_platform CHECK (platform IN ('B1','B2','B3','DIRECT'))");
    }

    public function down(): void
    {
        // Перед откатом — убедиться что в БД нет rows с platform='DIRECT',
        // иначе constraint провалится при ADD. Это ответственность того, кто
        // запускает migrate:rollback. На prod — отдельный cleanup SQL до отката:
        //   DELETE FROM project_supplier_links WHERE platform='DIRECT';
        //   DELETE FROM supplier_projects WHERE platform='DIRECT';
        //   DELETE FROM supplier_leads WHERE platform='DIRECT';
        DB::statement('ALTER TABLE supplier_projects DROP CONSTRAINT chk_supplier_projects_platform');
        DB::statement("ALTER TABLE supplier_projects ADD CONSTRAINT chk_supplier_projects_platform CHECK (platform IN ('B1','B2','B3'))");

        DB::statement('ALTER TABLE project_supplier_links DROP CONSTRAINT chk_psl_platform');
        DB::statement("ALTER TABLE project_supplier_links ADD CONSTRAINT chk_psl_platform CHECK (platform IN ('B1','B2','B3'))");

        DB::statement('ALTER TABLE supplier_leads DROP CONSTRAINT chk_supplier_leads_platform');
        DB::statement("ALTER TABLE supplier_leads ADD CONSTRAINT chk_supplier_leads_platform CHECK (platform IN ('B1','B2','B3'))");

        // Сужение TYPE обратно к VARCHAR(4) — только если все значения помещаются (B1/B2/B3 = 2 символа).
        DB::statement('ALTER TABLE supplier_leads ALTER COLUMN platform TYPE VARCHAR(4)');
        DB::statement('ALTER TABLE project_supplier_links ALTER COLUMN platform TYPE VARCHAR(4)');
        DB::statement('ALTER TABLE supplier_projects ALTER COLUMN platform TYPE VARCHAR(4)');
    }
};
