<?php

declare(strict_types=1);

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

/**
 * model_has_permissions 에 scope 컬럼 추가.
 *
 * Spatie Laravel Permission 의 모델별 권한을 특정 자원 범위(scope)에서만
 * 유효하게 만든다. NULL = 글로벌(기존과 동일).
 *
 * scope_type: 'tenant' | 'board' | 'section' | 'page' | 'post' | NULL
 * scope_id:   해당 자원의 식별자 (UUID 또는 문자열 PK), NULL 가능
 */
return new class extends Migration
{
    public function up(): void
    {
        if (! Schema::hasTable('model_has_permissions')) {
            return;
        }

        Schema::table('model_has_permissions', function (Blueprint $table) {
            if (! Schema::hasColumn('model_has_permissions', 'scope_type')) {
                $table->string('scope_type', 32)->nullable()->after('model_id');
            }
            if (! Schema::hasColumn('model_has_permissions', 'scope_id')) {
                $table->string('scope_id', 64)->nullable()->after('scope_type');
            }
        });

        // 인덱스 — 중복 추가 방지 위해 try/catch (DB-portable)
        try {
            Schema::table('model_has_permissions', function (Blueprint $table) {
                $table->index(['scope_type', 'scope_id'], 'mhp_scope_lookup_index');
            });
        } catch (\Throwable $e) {
            // 이미 존재하는 경우 무시
        }
    }

    public function down(): void
    {
        if (! Schema::hasTable('model_has_permissions')) {
            return;
        }

        Schema::table('model_has_permissions', function (Blueprint $table) {
            try {
                $table->dropIndex('mhp_scope_lookup_index');
            } catch (\Throwable $e) {
                // ignore
            }
            if (Schema::hasColumn('model_has_permissions', 'scope_id')) {
                $table->dropColumn('scope_id');
            }
            if (Schema::hasColumn('model_has_permissions', 'scope_type')) {
                $table->dropColumn('scope_type');
            }
        });
    }
};
