<?php

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

/**
 * Item Master 하이브리드 구조 전환 - Phase 2
 *
 * 목적: 엔티티 간 관계를 관리하는 범용 링크 테이블 생성
 *
 * 지원하는 관계 유형:
 * - page-section: 페이지와 섹션 연결
 * - page-field: 페이지와 필드 직접 연결
 * - section-field: 섹션과 필드 연결
 * - section-bom: 섹션과 BOM 항목 연결
 *
 * 특징:
 * - 다대다(Many-to-Many) 관계 지원
 * - 동일 엔티티를 여러 부모에 연결 가능
 * - 부모 삭제 시 링크만 제거, 자식 엔티티는 유지
 * - group_id로 카테고리 격리
 */
return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('entity_relationships', function (Blueprint $table) {
            $table->id()->comment('관계 ID');
            $table->unsignedBigInteger('tenant_id')->comment('테넌트 ID');
            $table->unsignedInteger('group_id')->default(1)->comment('그룹 ID (1: 품목관리)');

            // 부모 엔티티 정보
            $table->string('parent_type', 50)->comment('부모 엔티티 타입 (page, section)');
            $table->unsignedBigInteger('parent_id')->comment('부모 엔티티 ID');

            // 자식 엔티티 정보
            $table->string('child_type', 50)->comment('자식 엔티티 타입 (section, field, bom)');
            $table->unsignedBigInteger('child_id')->comment('자식 엔티티 ID');

            // 관계 메타데이터
            $table->integer('order_no')->default(0)->comment('정렬 순서');
            $table->json('metadata')->nullable()->comment('관계 메타데이터 (추가 설정)');

            // 감사 컬럼
            $table->unsignedBigInteger('created_by')->nullable()->comment('생성자 ID');
            $table->unsignedBigInteger('updated_by')->nullable()->comment('수정자 ID');
            $table->timestamps();

            // 인덱스
            $table->index(['tenant_id', 'group_id'], 'idx_entity_rel_tenant_group');
            $table->index(['parent_type', 'parent_id'], 'idx_entity_rel_parent');
            $table->index(['child_type', 'child_id'], 'idx_entity_rel_child');
            $table->index(['parent_type', 'parent_id', 'order_no'], 'idx_entity_rel_parent_order');

            // 유니크 제약 (동일 부모-자식 관계 중복 방지)
            $table->unique(
                ['tenant_id', 'group_id', 'parent_type', 'parent_id', 'child_type', 'child_id'],
                'uq_entity_rel_parent_child'
            );

            // 외래키
            $table->foreign('tenant_id', 'fk_entity_rel_tenant')
                ->references('id')->on('tenants')
                ->onDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('entity_relationships');
    }
};
