<?php

declare(strict_types=1);

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

/**
 * Phase 4 — Performans indeksleri.
 *
 * Her index'i ayrı bir Schema::table call'da try/catch'le sarmalıyoruz —
 * SQLite'da Blueprint closure'u tek SQL fırlatır, içindeki try/catch
 * çalışmaz; bu nedenle her index için ayrı try/catch dış katmanda olmalı.
 */
return new class extends Migration
{
    public function up(): void
    {
        $this->safeIndex('audit_log', fn ($t) => $t->index('user_id', 'audit_log_user_id_idx'));
        $this->safeIndex('audit_log', fn ($t) => $t->index('created_at', 'audit_log_created_at_idx'));

        $this->safeIndex('accounts', fn ($t) => $t->index(['status', 'created_at'], 'accounts_status_created_idx'));
        $this->safeIndex('accounts', fn ($t) => $t->index('reseller_user_id', 'accounts_reseller_user_idx'));

        $this->safeIndex('domains', fn ($t) => $t->index(['account_id', 'type'], 'domains_account_type_idx'));
        $this->safeIndex('domains', fn ($t) => $t->index('php_version', 'domains_php_version_idx'));

        $this->safeIndex('email_accounts', fn ($t) => $t->index(['account_id', 'domain'], 'email_accounts_account_domain_idx'));

        $this->safeIndex('ssl_certificates', fn ($t) => $t->index(['renewal_status', 'expires_at'], 'ssl_certs_renewal_expires_idx'));
    }

    public function down(): void
    {
        // Üretim güvenliği için kaldırılmaz.
    }

    /** Her index'i ayrı Schema::table call'da çalıştır, hata varsa yut. */
    private function safeIndex(string $table, Closure $callback): void
    {
        try {
            Schema::table($table, $callback);
        } catch (Throwable) {
            // İndex zaten var — atlanıyor
        }
    }
};
