<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Models\Bodega;
use App\Models\ProductVariant;
use App\Models\Producto;
use Illuminate\Support\Facades\DB;

class MigrarVariantesBodegaPrincipal extends Command
{
    /**
     * The name and signature of the console command.
     */
    protected $signature = 'stock:migrar-todo-principal';

    /**
     * The console command description.
     */
    protected $description = 'Migra el stock de productos y variantes a la bodega principal';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $this->info('🚀 Iniciando migración completa de stock a bodega principal...');

        DB::beginTransaction();

        try {
            // 1. Crear o encontrar la bodega principal
            $bodegaPrincipal = Bodega::firstOrCreate([
                'nombre' => 'Principal'
            ], [
                'descripcion' => 'Bodega principal del sistema',
                'ubicacion' => 'Sede principal',
                'estado' => true
            ]);

            $this->info("✅ Bodega principal: {$bodegaPrincipal->nombre}");

            // 2. MIGRAR PRODUCTOS DIRECTOS (sin variantes)
            $this->info("\n📦 Migrando productos directos...");
            $productosDirectos = Producto::where('estado', true)
                ->where('stock', '>', 0)
                ->whereDoesntHave('variants') // Solo productos sin variantes
                ->get();
            
            $this->info("Encontrados {$productosDirectos->count()} productos directos con stock");

            $productosActualizados = 0;

            foreach ($productosDirectos as $producto) {
                // Verificar si ya existe una relación con esta bodega
                $existeRelacion = $producto->bodegas()
                    ->where('bodega_id', $bodegaPrincipal->id)
                    ->exists();

                if (!$existeRelacion) {
                    // Crear la relación con el stock actual del producto
                    $producto->bodegas()->attach($bodegaPrincipal->id, [
                        'stock' => $producto->stock
                    ]);

                    $this->line("✓ {$producto->nombre}: {$producto->stock} unidades → Bodega Principal");
                    $productosActualizados++;
                } else {
                    // Actualizar el stock existente
                    $stockActual = $producto->bodegas()
                        ->where('bodega_id', $bodegaPrincipal->id)
                        ->first()->pivot->stock;

                    $nuevoStock = $stockActual + $producto->stock;

                    $producto->bodegas()->updateExistingPivot($bodegaPrincipal->id, [
                        'stock' => $nuevoStock
                    ]);

                    $this->line("✓ {$producto->nombre}: {$stockActual} + {$producto->stock} = {$nuevoStock} unidades → Bodega Principal");
                    $productosActualizados++;
                }
            }

            // 3. MIGRAR VARIANTES DE PRODUCTOS
            $this->info("\n🔄 Migrando variantes de productos...");
            $variantes = ProductVariant::with('producto')
                ->where('stock', '>', 0)
                ->get();
            
            $this->info("Encontradas {$variantes->count()} variantes con stock");

            $variantesActualizadas = 0;

            foreach ($variantes as $variante) {
                // Verificar si ya existe una relación con esta bodega
                $existeRelacion = $variante->bodegas()
                    ->where('bodega_id', $bodegaPrincipal->id)
                    ->exists();

                if (!$existeRelacion) {
                    // Crear la relación con el stock actual de la variante
                    $variante->bodegas()->attach($bodegaPrincipal->id, [
                        'stock' => $variante->stock
                    ]);

                    $this->line("✓ {$variante->producto->nombre} [{$variante->sku}]: {$variante->stock} unidades → Bodega Principal");
                    $variantesActualizadas++;
                } else {
                    // Actualizar el stock existente sumando el stock de la variante
                    $stockActual = $variante->bodegas()
                        ->where('bodega_id', $bodegaPrincipal->id)
                        ->first()->pivot->stock;

                    $nuevoStock = $stockActual + $variante->stock;

                    $variante->bodegas()->updateExistingPivot($bodegaPrincipal->id, [
                        'stock' => $nuevoStock
                    ]);

                    $this->line("✓ {$variante->producto->nombre} [{$variante->sku}]: {$stockActual} + {$variante->stock} = {$nuevoStock} unidades → Bodega Principal");
                    $variantesActualizadas++;
                }
            }

            DB::commit();

            $this->info("\n🎉 Migración completa de stock exitosa!");
            $this->info("📦 Productos directos procesados: {$productosActualizados}");
            $this->info("� Variantes procesadas: {$variantesActualizadas}");
            $this->info("🏢 Bodega principal: {$bodegaPrincipal->nombre}");
            $this->info("📊 Total de elementos migrados: " . ($productosActualizados + $variantesActualizadas));

        } catch (\Exception $e) {
            DB::rollBack();
            $this->error("❌ Error durante la migración: " . $e->getMessage());
            $this->error("🔍 Línea: " . $e->getLine());
            return Command::FAILURE;
        }

        return Command::SUCCESS;
    }
}