<?php

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

/**
 * 테넌트별 통계 필드 설정 테이블
 *
 * 목적: 각 테넌트가 통계를 내고 싶은 필드를 선언하는 메타 테이블
 *
 * 예시:
 * - BP-MES 테넌트: margin_rate, processing_cost 등 통계 필요
 * - 다른 테넌트: 다른 필드 조합으로 통계 필요
 *
 * 효과:
 * - 테넌트마다 DDL 변경 없이 통계 필드 구성 가능
 * - stat_snapshots 테이블에서 캐싱 대상 식별
 * - 잠재적 Virtual Column 최적화 대상 식별
 *
 * @see /claudedocs/mes/ITEM_MANAGEMENT_MIGRATION_GUIDE.md
 */
return new class extends Migration
{
    public function up(): void
    {
        Schema::create('tenant_stat_fields', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('tenant_id')->comment('테넌트 ID');

            // ================================================
            // 통계 대상 정의
            // ================================================
            $table->string('target_table', 50)->comment('통계 대상 테이블 (products, materials 등)');
            $table->string('field_key', 100)->comment('필드 키 (attributes JSON 내 키값)');
            $table->string('field_name', 100)->comment('필드 한글명 (마진율, 가공비 등)');
            $table->string('field_type', 20)->comment('필드 타입 (decimal, varchar, integer 등)');

            // ================================================
            // 통계 방법 정의
            // ================================================
            $table->json('aggregation_types')
                ->nullable()
                ->comment('집계 함수 배열 (["avg", "sum", "min", "max", "count"])');

            $table->boolean('is_critical')
                ->default(false)
                ->comment('중요 필드 여부 (true면 일일 스냅샷 생성)');

            $table->integer('display_order')
                ->default(0)
                ->comment('통계 화면 표시 순서');

            // ================================================
            // 감사 및 메타 정보
            // ================================================
            $table->text('description')->nullable()->comment('필드 설명 및 용도');
            $table->unsignedBigInteger('created_by')->nullable()->comment('생성자');
            $table->unsignedBigInteger('updated_by')->nullable()->comment('수정자');
            $table->timestamps();

            // ================================================
            // 인덱스
            // ================================================
            $table->unique(['tenant_id', 'target_table', 'field_key'], 'idx_tenant_stat_fields_unique');
            $table->index(['tenant_id', 'is_critical'], 'idx_tenant_stat_fields_critical');
            $table->index(['target_table', 'field_key'], 'idx_tenant_stat_fields_lookup');

            // ================================================
            // 외래 키 (개발 환경에서만 권장)
            // ================================================
            // $table->foreign('tenant_id')->references('id')->on('tenants')->onDelete('cascade');
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('tenant_stat_fields');
    }
};
