<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        // Paso 1: Agregar columnas snapshot
        Schema::table('detalle_compras', function (Blueprint $table) {
            $table->string('producto_nombre_snapshot')->nullable()->after('producto_id');
            $table->string('variante_info_snapshot')->nullable()->after('variante_id');
        });
        
        // Paso 2: Actualizar registros existentes con snapshot de información
        try {
            DB::unprepared("
                UPDATE detalle_compras 
                SET producto_nombre_snapshot = productos.nombre
                FROM productos 
                WHERE productos.id = detalle_compras.producto_id 
                AND detalle_compras.producto_id IS NOT NULL 
                AND detalle_compras.producto_nombre_snapshot IS NULL
            ");
        } catch (\Exception $e) {
            // Si falla, intentar con la sintaxis estándar
            \Illuminate\Support\Facades\DB::table('detalle_compras')
                ->whereNotNull('producto_id')
                ->whereNull('producto_nombre_snapshot')
                ->get()
                ->each(function ($detalle) {
                    $producto = \Illuminate\Support\Facades\DB::table('productos')
                        ->where('id', $detalle->producto_id)
                        ->first();
                    if ($producto) {
                        \Illuminate\Support\Facades\DB::table('detalle_compras')
                            ->where('id', $detalle->id)
                            ->update(['producto_nombre_snapshot' => $producto->nombre]);
                    }
                });
        }
        
        try {
            DB::unprepared("
                UPDATE detalle_compras 
                SET variante_info_snapshot = CONCAT(c.name, ' / ', s.name)
                FROM product_variants pv
                JOIN colors c ON c.id = pv.color_id
                JOIN sizes s ON s.id = pv.size_id
                WHERE pv.id = detalle_compras.variante_id
                AND detalle_compras.variante_id IS NOT NULL 
                AND detalle_compras.variante_info_snapshot IS NULL
            ");
        } catch (\Exception $e) {
            // Si falla, intentar con la sintaxis estándar
            \Illuminate\Support\Facades\DB::table('detalle_compras')
                ->whereNotNull('variante_id')
                ->whereNull('variante_info_snapshot')
                ->get()
                ->each(function ($detalle) {
                    $variante = \Illuminate\Support\Facades\DB::table('product_variants as pv')
                        ->join('colors as c', 'c.id', '=', 'pv.color_id')
                        ->join('sizes as s', 's.id', '=', 'pv.size_id')
                        ->where('pv.id', $detalle->variante_id)
                        ->select(\Illuminate\Support\Facades\DB::raw("CONCAT(c.name, ' / ', s.name) as info"))
                        ->first();
                    if ($variante) {
                        \Illuminate\Support\Facades\DB::table('detalle_compras')
                            ->where('id', $detalle->id)
                            ->update(['variante_info_snapshot' => $variante->info]);
                    }
                });
        }
        
        // Paso 3: Actualizar claves foráneas
        Schema::table('detalle_compras', function (Blueprint $table) {
            // Eliminar las claves foráneas existentes si existen
            try {
                $table->dropForeign(['producto_id']);
            } catch (\Exception $e) {
                // La clave foránea puede no existir
            }
            
            try {
                $table->dropForeign(['variante_id']);
            } catch (\Exception $e) {
                // La clave foránea puede no existir
            }
            
            // Recrear las claves foráneas con SET NULL para preservar historial
            $table->foreign('producto_id')
                  ->references('id')
                  ->on('productos')
                  ->onDelete('set null');
                  
            $table->foreign('variante_id')
                  ->references('id')
                  ->on('product_variants')
                  ->onDelete('set null');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('detalle_compras', function (Blueprint $table) {
            // Revertir a las claves foráneas originales
            $table->dropForeign(['producto_id']);
            $table->dropForeign(['variante_id']);
            
            $table->foreign('producto_id')
                  ->references('id')
                  ->on('productos')
                  ->onDelete('restrict'); // Comportamiento original
                  
            $table->foreign('variante_id')
                  ->references('id')
                  ->on('product_variants')
                  ->onDelete('restrict'); // Comportamiento original
            
            // Eliminar los campos snapshot
            $table->dropColumn(['producto_nombre_snapshot', 'variante_info_snapshot']);
        });
    }
};
