<?php

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

return new class extends Migration
{
    /**
     * BOM JSON의 child_item_id를 이전 테이블(products/materials) ID에서
     * 새 items 테이블 ID로 변환
     */
    public function up(): void
    {
        // BOM이 있는 모든 items 조회
        $items = DB::table('items')
            ->whereNotNull('bom')
            ->whereRaw('JSON_LENGTH(bom) > 0')
            ->get(['id', 'bom']);

        $updated = 0;
        $skipped = 0;

        foreach ($items as $item) {
            $bom = json_decode($item->bom, true);
            if (empty($bom)) {
                continue;
            }

            $newBom = [];
            $hasChanges = false;

            foreach ($bom as $entry) {
                $childItemId = $entry['child_item_id'] ?? null;
                $childItemType = $entry['child_item_type'] ?? null;

                if (! $childItemId || ! $childItemType) {
                    $newBom[] = $entry;

                    continue;
                }

                // child_item_type에 따른 source_table 결정
                $sourceTable = match (strtoupper($childItemType)) {
                    'MATERIAL' => 'materials',
                    'PRODUCT', 'SUBASSEMBLY', 'PART' => 'products',
                    default => null,
                };

                if (! $sourceTable) {
                    $newBom[] = $entry;

                    continue;
                }

                // item_id_mappings에서 새 item_id 조회
                $mapping = DB::table('item_id_mappings')
                    ->where('source_table', $sourceTable)
                    ->where('source_id', $childItemId)
                    ->first();

                if ($mapping) {
                    $entry['child_item_id'] = $mapping->item_id;
                    $hasChanges = true;
                }

                $newBom[] = $entry;
            }

            if ($hasChanges) {
                DB::table('items')
                    ->where('id', $item->id)
                    ->update(['bom' => json_encode($newBom)]);
                $updated++;
            } else {
                $skipped++;
            }
        }

        // 결과 로그
        DB::statement("SELECT 'BOM migration: updated={$updated}, skipped={$skipped}' AS result");
    }

    /**
     * 롤백: 새 item_id를 이전 ID로 복원
     * 주의: 완벽한 롤백은 어려움 - 원본 BOM 백업 권장
     */
    public function down(): void
    {
        // BOM이 있는 모든 items 조회
        $items = DB::table('items')
            ->whereNotNull('bom')
            ->whereRaw('JSON_LENGTH(bom) > 0')
            ->get(['id', 'bom']);

        foreach ($items as $item) {
            $bom = json_decode($item->bom, true);
            if (empty($bom)) {
                continue;
            }

            $newBom = [];
            $hasChanges = false;

            foreach ($bom as $entry) {
                $childItemId = $entry['child_item_id'] ?? null;

                if (! $childItemId) {
                    $newBom[] = $entry;

                    continue;
                }

                // item_id_mappings에서 원본 ID 조회
                $mapping = DB::table('item_id_mappings')
                    ->where('item_id', $childItemId)
                    ->first();

                if ($mapping) {
                    $entry['child_item_id'] = $mapping->source_id;
                    $hasChanges = true;
                }

                $newBom[] = $entry;
            }

            if ($hasChanges) {
                DB::table('items')
                    ->where('id', $item->id)
                    ->update(['bom' => json_encode($newBom)]);
            }
        }
    }
};
