<?php

declare(strict_types=1);

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

return new class extends Migration
{
    public function up(): void
    {
        // DDL через pgsql_supplier (урок Спека B — prod-роли + избегаем deadlock смешивания
        // соединений). На dev pgsql_supplier = postgres superuser, на prod — crm_supplier_worker.
        $supplier = DB::connection('pgsql_supplier');

        $supplier->statement('ALTER TABLE email_verifications ADD COLUMN IF NOT EXISTS code_hash VARCHAR(255)');
        $supplier->statement('ALTER TABLE email_verifications ADD COLUMN IF NOT EXISTS failed_attempts SMALLINT NOT NULL DEFAULT 0');

        // tenants.status был VARCHAR(20), но CHECK допускает 'pending_email_confirm' (21 симв.) —
        // латентный дефект: значение не влезало в колонку. Самозапись (G1/SP1) первой реально
        // ставит этот статус, поэтому расширяем до VARCHAR(30). Идемпотентно (повторный ALTER TYPE — no-op).
        $supplier->statement('ALTER TABLE tenants ALTER COLUMN status TYPE VARCHAR(30)');

        // Самозапись пишет/читает email_verifications через BYPASSRLS-роль (нет tenant-GUC
        // на публичном роуте). Гарантируем права на проде (на dev — superuser, no-op).
        foreach (['crm_app_user', 'crm_supplier_worker', 'crm_migrator', 'crm_admin_user'] as $role) {
            $supplier->statement(<<<SQL
                DO \$\$
                BEGIN
                    IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = '{$role}') THEN
                        GRANT SELECT, INSERT, UPDATE ON email_verifications TO {$role};
                    END IF;
                END
                \$\$
            SQL);
        }
    }

    public function down(): void
    {
        $supplier = DB::connection('pgsql_supplier');
        $supplier->statement('ALTER TABLE email_verifications DROP COLUMN IF EXISTS failed_attempts');
        $supplier->statement('ALTER TABLE email_verifications DROP COLUMN IF EXISTS code_hash');
    }
};
