<?php

declare(strict_types=1);

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

/**
 * supplier_sync_runs — сводка по завершению вечерней заливки проектов поставщику (Эпик 5).
 *
 * SyncSupplierProjectsJob по завершении пишет одну строку с итогами: сколько групп
 * всего, сколько синхронизировано, сколько ушло в ручную очередь / отложено / упало.
 * SaaS-admin видит историю заливок на экране «Интеграция с поставщиком» и сверяет глазами,
 * что вечерняя заливка прошла ровно (от этого зависят заказанные у поставщика лиды).
 *
 * Системная таблица (как supplier_csv_reconcile_log) — без RLS/tenant_id, пишет
 * supplier-flow джоб под crm_supplier_worker (BYPASSRLS), читает SaaS-admin.
 *
 * Spec: docs/superpowers/specs/2026-06-25-snapshot-source-routing-design.md (Эпик 5).
 */
return new class extends Migration
{
    public function up(): void
    {
        $supplier = DB::connection('pgsql_supplier');

        $supplier->statement(<<<'SQL'
            CREATE TABLE IF NOT EXISTS supplier_sync_runs (
                id            BIGSERIAL PRIMARY KEY,
                started_at    TIMESTAMPTZ NOT NULL,
                finished_at   TIMESTAMPTZ,
                groups_total  INTEGER NOT NULL DEFAULT 0,
                synced_ok     INTEGER NOT NULL DEFAULT 0,
                manual_queued INTEGER NOT NULL DEFAULT 0,
                deferred      INTEGER NOT NULL DEFAULT 0,
                failed        INTEGER NOT NULL DEFAULT 0,
                status        VARCHAR(16) NOT NULL DEFAULT 'ok'
                              CHECK (status IN ('ok','partial','failed','aborted')),
                created_at    TIMESTAMPTZ NOT NULL DEFAULT NOW()
            )
        SQL);
        $supplier->statement('CREATE INDEX IF NOT EXISTS idx_supplier_sync_runs_created ON supplier_sync_runs (created_at DESC)');

        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 ON supplier_sync_runs TO {$role};
                        GRANT USAGE, SELECT ON SEQUENCE supplier_sync_runs_id_seq TO {$role};
                    END IF;
                END
                \$\$
            SQL);
        }
    }

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