<?php

declare(strict_types=1);

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

/**
 * supplier_deferred_sync — очередь отложенных онлайн-правок проектов.
 *
 * Онлайн-режим в окне 18:00→00:00 МСК НЕ шлёт правки поставщику сразу (иначе
 * перезапишет уже зафиксированный слепок 21:00). Вместо этого проект кладётся сюда,
 * а FlushDeferredOnlineSyncJob в 00:05 МСК досылает их вне окна.
 *
 * Системная очередь (как supplier_manual_sync_queue) — без RLS/tenant_id, доступ
 * только из supplier-flow джоба под crm_supplier_worker (BYPASSRLS).
 * project_id — PK: естественный дедуп (ON CONFLICT DO NOTHING на повторных правках).
 *
 * Spec: docs/superpowers/specs/2026-06-25-snapshot-source-routing-design.md (Эпик 4).
 */
return new class extends Migration
{
    public function up(): void
    {
        $supplier = DB::connection('pgsql_supplier');

        $supplier->statement(<<<'SQL'
            CREATE TABLE IF NOT EXISTS supplier_deferred_sync (
                project_id BIGINT PRIMARY KEY REFERENCES projects(id) ON DELETE CASCADE,
                created_at TIMESTAMPTZ NOT NULL DEFAULT now()
            )
        SQL);

        foreach (['crm_supplier_worker'] as $role) {
            $supplier->statement(<<<SQL
                DO \$\$
                BEGIN
                    IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = '{$role}') THEN
                        GRANT SELECT, INSERT, DELETE ON supplier_deferred_sync TO {$role};
                    END IF;
                END
                \$\$
            SQL);
        }
    }

    public function down(): void
    {
        DB::connection('pgsql_supplier')->statement('DROP TABLE IF EXISTS supplier_deferred_sync CASCADE');
    }
};
