<?php

namespace App\Console\Commands;

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

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

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Migra todo el stock actual de productos a la bodega principal';

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

        DB::beginTransaction();

        try {
            // 1. Crear o encontrar la bodega principal
            $bodegaPrincipal = Bodega::firstOrCreate([
                'nombre' => 'Principal'
            ]);

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

            // 2. Obtener todos los productos que necesitan migración
            $productos = Producto::with('variants')->get()->filter(function ($producto) {
                // Productos con stock directo O con variantes que tienen stock
                return $producto->stock > 0 || 
                       ($producto->variants()->exists() && $producto->variants()->sum('stock') > 0);
            });
            
            $this->info("Encontrados {$productos->count()} productos con stock para migrar");

            $productosActualizados = 0;

            foreach ($productos as $producto) {
                // Calcular stock total a migrar
                $stockAMigrar = 0;
                
                if ($producto->variants()->exists()) {
                    // Para productos con variantes, usar la suma de variantes
                    $stockAMigrar = $producto->variants()->sum('stock');
                    $this->line("  → Producto con variantes: {$producto->nombre}");
                    $this->line("    Stock total de variantes: {$stockAMigrar}");
                } else {
                    // Para productos sin variantes, usar stock directo
                    $stockAMigrar = $producto->stock;
                }
                
                if ($stockAMigrar <= 0) {
                    continue; // Saltar productos sin stock
                }
                // 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 calculado
                    $producto->bodegas()->attach($bodegaPrincipal->id, [
                        'stock' => $stockAMigrar
                    ]);

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

                    $nuevoStock = $stockActual + $stockAMigrar;

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

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

            DB::commit();

            $this->info("\n🎉 Migración completada exitosamente!");
            $this->info("📦 Productos procesados: {$productosActualizados}");
            $this->info("🏢 Bodega principal: {$bodegaPrincipal->nombre}");

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

        return Command::SUCCESS;
    }
}
