<?php

declare(strict_types=1);

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

/**
 * external_service_balances — последний известный баланс внешних платных сервисов
 * (dadata / supplier / yandex_cloud) для плитки «Балансы сервисов» дашборда.
 *
 * Системная таблица (как supplier_sync_runs) — без RLS/tenant_id. Пишет ежедневная
 * RefreshExternalBalancesJob под crm_supplier_worker (BYPASSRLS), читает SaaS-admin
 * через pgsql_admin. Хранит ТОЛЬКО последнее значение на сервис (история — отдельный
 * follow-up), поэтому service_key — PRIMARY KEY (upsert по нему).
 *
 * Spec: docs/superpowers/specs/2026-06-28-external-service-balances-design.md
 * План: docs/superpowers/plans/2026-06-28-external-service-balances.md (Task 1)
 */
return new class extends Migration
{
    public function up(): void
    {
        $supplier = DB::connection('pgsql_supplier');

        $supplier->statement(<<<'SQL'
            CREATE TABLE IF NOT EXISTS external_service_balances (
                service_key          VARCHAR(32) PRIMARY KEY,
                balance_amount       NUMERIC(14,2),
                currency             VARCHAR(8) NOT NULL DEFAULT 'RUB',
                daily_spend_estimate NUMERIC(14,2),
                days_left            INTEGER,
                light                VARCHAR(8) NOT NULL DEFAULT 'green'
                                     CHECK (light IN ('green','amber','red','grey')),
                ok                   BOOLEAN NOT NULL DEFAULT FALSE,
                error                TEXT,
                checked_at           TIMESTAMPTZ,
                created_at           TIMESTAMPTZ NOT NULL DEFAULT NOW(),
                updated_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, UPDATE ON external_service_balances TO {$role};
                    END IF;
                END
                \$\$
            SQL);
        }
    }

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