<?php

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

/**
 * 하이브리드 구조: 최소 고정 필드 + 동적 attributes
 *
 * 고정 필드 (6개):
 * - safety_stock, lead_time: 재고/조달 관리 (범용)
 * - is_variable_size: 맞춤형 vs 표준품 구분
 * - product_category, part_type: 통계용 분류 필드
 * - attributes_archive: 카테고리 변경 시 데이터 백업
 *
 * 가변 필드 (attributes JSON):
 * - 테넌트별 커스텀 필드 (margin_rate, costs, bending_*, certification_* 등)
 * - category_fields + tenant_stat_fields로 관리
 *
 * @see /claudedocs/mes/ITEM_MANAGEMENT_MIGRATION_GUIDE.md
 */
return new class extends Migration
{
    public function up(): void
    {
        Schema::table('products', function (Blueprint $table) {
            // ================================================
            // 범용 관리 필드 (3개)
            // ================================================
            if (! Schema::hasColumn('products', 'safety_stock')) {
                $table->integer('safety_stock')
                    ->nullable()
                    ->after('is_producible')
                    ->comment('안전 재고 수량');
            }

            if (! Schema::hasColumn('products', 'lead_time')) {
                $table->integer('lead_time')
                    ->nullable()
                    ->after('safety_stock')
                    ->comment('리드타임 (일)');
            }

            if (! Schema::hasColumn('products', 'is_variable_size')) {
                $table->boolean('is_variable_size')
                    ->default(false)
                    ->after('lead_time')
                    ->comment('가변 치수 여부 (맞춤형 제품)');
            }

            // ================================================
            // 통계용 분류 필드 (2개)
            // - 테넌트 공통으로 자주 사용하는 분류
            // - 인덱스 지원으로 빠른 통계 조회
            // ================================================
            if (! Schema::hasColumn('products', 'product_category')) {
                $table->string('product_category', 20)
                    ->nullable()
                    ->after('is_variable_size')
                    ->comment('제품 분류 (SCREEN, STEEL 등) - 통계용');
            }

            if (! Schema::hasColumn('products', 'part_type')) {
                $table->string('part_type', 20)
                    ->nullable()
                    ->after('product_category')
                    ->comment('부품 타입 (ASSEMBLY, BENDING, PURCHASED) - 통계용');
            }

            // ================================================
            // 데이터 보존 필드 (1개)
            // ================================================
            if (! Schema::hasColumn('products', 'attributes_archive')) {
                $table->json('attributes_archive')
                    ->nullable()
                    ->after('attributes')
                    ->comment('카테고리 변경 시 이전 attributes 백업');
            }

            // ================================================
            // 인덱스 추가 (통계 조회 최적화)
            // ================================================
            $indexes = collect(\DB::select('SHOW INDEX FROM `products`'))
                ->pluck('Key_name')
                ->toArray();

            if (! in_array('idx_products_product_category', $indexes)) {
                $table->index(['tenant_id', 'product_category'], 'idx_products_product_category');
            }

            if (! in_array('idx_products_part_type', $indexes)) {
                $table->index(['tenant_id', 'part_type'], 'idx_products_part_type');
            }

            if (! in_array('idx_products_is_variable_size', $indexes)) {
                $table->index(['tenant_id', 'is_variable_size'], 'idx_products_is_variable_size');
            }
        });
    }

    public function down(): void
    {
        Schema::table('products', function (Blueprint $table) {
            // 인덱스 제거
            $indexes = collect(\DB::select('SHOW INDEX FROM `products`'))
                ->pluck('Key_name')
                ->toArray();

            if (in_array('idx_products_product_category', $indexes)) {
                $table->dropIndex('idx_products_product_category');
            }

            if (in_array('idx_products_part_type', $indexes)) {
                $table->dropIndex('idx_products_part_type');
            }

            if (in_array('idx_products_is_variable_size', $indexes)) {
                $table->dropIndex('idx_products_is_variable_size');
            }

            // 컬럼 제거
            $columns = [
                'attributes_archive',
                'part_type',
                'product_category',
                'is_variable_size',
                'lead_time',
                'safety_stock',
            ];

            foreach ($columns as $column) {
                if (Schema::hasColumn('products', $column)) {
                    $table->dropColumn($column);
                }
            }
        });
    }
};
