<?php

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

/**
 * Phase 3: 제품-자재 관계 FK 제약조건 제거 (신중한 검토 필요)
 *
 * 실제 상황: product_components 테이블은 ref_type/ref_id 통합 구조 사용
 * - material_id 컬럼이 존재하지 않음 (ref_type='MATERIAL', ref_id=material.id)
 * - 물리적 FK 제약조건이 없는 상태
 *
 * 목적: 현재 구조 확인 및 논리적 관계 문서화
 * 결론: 이미 FK 없는 유연한 구조로 구성되어 있음
 */
return new class extends Migration
{
    /**
     * 기존 FK 제약조건 이름을 동적으로 찾는 헬퍼 함수
     */
    private function findForeignKeyName(string $table, string $column): ?string
    {
        $result = DB::selectOne('
            SELECT CONSTRAINT_NAME
            FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
            WHERE TABLE_SCHEMA = DATABASE()
              AND TABLE_NAME = ?
              AND COLUMN_NAME = ?
              AND REFERENCED_TABLE_NAME IS NOT NULL
            LIMIT 1
        ', [$table, $column]);

        return $result ? $result->CONSTRAINT_NAME : null;
    }

    /**
     * FK 제약조건을 안전하게 제거하는 헬퍼 함수
     */
    private function dropForeignKeyIfExists(string $table, string $column): void
    {
        $fkName = $this->findForeignKeyName($table, $column);
        if ($fkName) {
            DB::statement("ALTER TABLE `{$table}` DROP FOREIGN KEY `{$fkName}`");
            echo "✅ Dropped FK: {$table}.{$column} ({$fkName})\n";
        } else {
            echo "ℹ️  No FK found: {$table}.{$column}\n";
        }
    }

    public function up(): void
    {
        echo "🚀 Phase 3: 제품-자재 관계 현황 분석 시작\n\n";
        echo "📋 분석 범위: BOM 시스템의 자재 참조 관계\n\n";

        // product_components 테이블 존재 여부 확인
        if (! Schema::hasTable('product_components')) {
            echo "ℹ️  product_components 테이블이 존재하지 않습니다. 건너뜁니다.\n";

            return;
        }

        echo "1️⃣  Product_components 테이블 구조 분석...\n";

        // 테이블 구조 확인
        $columns = DB::select('DESCRIBE product_components');
        $columnNames = array_map(function ($col) {
            return $col->Field;
        }, $columns);

        echo "   현재 테이블 구조:\n";
        echo '   - ref_type 컬럼: '.(in_array('ref_type', $columnNames) ? '존재 (통합 참조 타입)' : '없음')."\n";
        echo '   - ref_id 컬럼: '.(in_array('ref_id', $columnNames) ? '존재 (통합 참조 ID)' : '없음')."\n";
        echo '   - material_id 컬럼: '.(in_array('material_id', $columnNames) ? '존재' : '없음 (예상대로)')."\n\n";

        // 현재 FK 상태 확인
        $parentProductFk = $this->findForeignKeyName('product_components', 'parent_product_id');
        $refIdFk = $this->findForeignKeyName('product_components', 'ref_id');

        echo "2️⃣  FK 제약조건 상태 확인...\n";
        echo '   - parent_product_id FK: '.($parentProductFk ? "존재 ({$parentProductFk})" : '없음')."\n";
        echo '   - ref_id FK: '.($refIdFk ? "존재 ({$refIdFk})" : '없음 (유연한 구조)')."\n\n";

        // 성능을 위한 인덱스 확인
        echo "3️⃣  성능 인덱스 상태 확인...\n";
        $refTypeIndexExists = DB::selectOne("
            SHOW INDEX FROM product_components WHERE Key_name LIKE '%ref_type%' OR Column_name = 'ref_type'
        ");
        $refIdIndexExists = DB::selectOne("
            SHOW INDEX FROM product_components WHERE Key_name LIKE '%ref_id%' OR Column_name = 'ref_id'
        ");

        echo '   - ref_type 인덱스: '.($refTypeIndexExists ? '존재' : '없음')."\n";
        echo '   - ref_id 인덱스: '.($refIdIndexExists ? '존재' : '없음')."\n";

        // 필요시 성능 인덱스 추가
        if (! $refTypeIndexExists || ! $refIdIndexExists) {
            echo "\n4️⃣  성능 인덱스 추가...\n";
            try {
                DB::statement('CREATE INDEX idx_components_ref_type_id ON product_components (ref_type, ref_id)');
                echo "✅ Added composite index: product_components(ref_type, ref_id)\n";
            } catch (\Exception $e) {
                echo "ℹ️  Index may already exist or not needed\n";
            }
        }

        echo "\n🎉 Phase 3 분석 완료!\n";
        echo "📋 현재 구조 요약:\n";
        echo "   - 이미 유연한 ref_type/ref_id 구조 사용 중\n";
        echo "   - material_id 컬럼 없음 (통합 구조로 대체)\n";
        echo "   - 물리적 FK 제약조건 없어 관리 유연성 확보됨\n";
        echo "📈 결론: 추가 FK 제거 작업 불필요 (이미 최적화됨)\n";
        echo "✅ 권장사항: Service 레이어에서 논리적 무결성 검증 유지\n";
    }

    public function down(): void
    {
        echo "🔄 Phase 3 분석 롤백 시작...\n\n";

        echo "ℹ️  이 마이그레이션은 분석 목적으로 실행되었습니다.\n";
        echo "📋 롤백 내용:\n";
        echo "   - 추가된 성능 인덱스 제거 (필요시)\n\n";

        if (Schema::hasTable('product_components')) {
            echo "1️⃣  성능 인덱스 제거...\n";
            try {
                DB::statement('DROP INDEX idx_components_ref_type_id ON product_components');
                echo "✅ Removed index: product_components(ref_type, ref_id)\n";
            } catch (\Exception $e) {
                echo "ℹ️  Index may not exist or already removed\n";
            }
        }

        echo "\n🔄 Phase 3 분석 롤백 완료!\n";
        echo "📝 참고: 원래 ref_type/ref_id 구조가 복구되었습니다.\n";
    }
};
