<?php

namespace App\Filament\Resources\ProductoResource\Pages;

use App\Filament\Resources\ProductoResource;
use App\Models\Producto;
use App\Models\Bodega;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
use Filament\Notifications\Notification;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\DB;

class CreateProducto extends CreateRecord
{
    protected static string $resource = ProductoResource::class;

    protected function mutateFormDataBeforeCreate(array $data): array
    {
        Log::info('=== CreateProducto DEBUG ===');
        Log::info('Datos completos recibidos:', $data);
        Log::info('Keys disponibles:', array_keys($data));
        
        // Verificar presencia de campos específicos
        Log::info('Campos de stock presentes:', [
            'stock_entrada' => isset($data['stock_entrada']) ? $data['stock_entrada'] : 'NO PRESENTE',
            'stock_minimo_entrada' => isset($data['stock_minimo_entrada']) ? $data['stock_minimo_entrada'] : 'NO PRESENTE',
            'stock_maximo_entrada' => isset($data['stock_maximo_entrada']) ? $data['stock_maximo_entrada'] : 'NO PRESENTE',
        ]);
        
        // Asegurar que descripcion no esté vacía
        if (empty($data['descripcion']) || is_null($data['descripcion'])) {
            $data['descripcion'] = 'Sin descripción';
        }
        
        // Procesar stock inicial
        if (isset($data['stock_entrada'])) {
            $stockEntrada = $data['stock_entrada'];
            $unidadMedida = $data['unidad_medida'] ?? 'unidad';
            
            // Convertir a unidades
            $stockEntradaFloat = is_numeric($stockEntrada) ? (float) $stockEntrada : 0.0;
            $data['stock'] = Producto::convertirAUnidades($stockEntradaFloat, $unidadMedida);
            
            Log::info('Stock procesado:', [
                'stock_entrada' => $stockEntrada,
                'unidad_medida' => $unidadMedida,
                'stock_final' => $data['stock']
            ]);
        }
        
        // Procesar stock mínimo
        if (isset($data['stock_minimo_entrada'])) {
            $stockMinimoEntrada = $data['stock_minimo_entrada'];
            $unidadMedida = $data['unidad_medida'] ?? 'unidad';
            
            // Convertir a unidades
            $stockMinimoEntradaFloat = is_numeric($stockMinimoEntrada) ? (float) $stockMinimoEntrada : 0.0;
            $data['stock_minimo'] = Producto::convertirAUnidades($stockMinimoEntradaFloat, $unidadMedida);
            
            Log::info('Stock mínimo procesado:', [
                'stock_minimo_entrada' => $stockMinimoEntrada,
                'unidad_medida' => $unidadMedida,
                'stock_minimo_final' => $data['stock_minimo']
            ]);
        }
        
        // Procesar stock máximo
        if (isset($data['stock_maximo_entrada'])) {
            $stockMaximoEntrada = $data['stock_maximo_entrada'];
            $unidadMedida = $data['unidad_medida'] ?? 'unidad';
            
            // Convertir a unidades
            $stockMaximoEntradaFloat = is_numeric($stockMaximoEntrada) ? (float) $stockMaximoEntrada : 0.0;
            $data['stock_maximo'] = Producto::convertirAUnidades($stockMaximoEntradaFloat, $unidadMedida);
            
            Log::info('Stock máximo procesado:', [
                'stock_maximo_entrada' => $stockMaximoEntrada,
                'unidad_medida' => $unidadMedida,
                'stock_maximo_final' => $data['stock_maximo']
            ]);
        }
        
        // Remover campos auxiliares que no deben guardarse
        unset($data['stock_entrada'], $data['stock_minimo_entrada'], $data['stock_maximo_entrada']);
        
        Log::info('Datos finales para crear producto:', $data);
        
        return $data;
    }

    protected function afterCreate(): void
    {
        $producto = $this->record;
        
        // Solo asignar stock a bodega principal si NO tiene variantes
        if ($producto->stock > 0 && !$producto->variants()->exists()) {
            try {
                DB::beginTransaction();
                
                // Buscar o crear la bodega principal
                $bodegaPrincipal = Bodega::firstOrCreate([
                    'nombre' => 'Principal'
                ]);
                
                Log::info("Asignando stock a bodega principal", [
                    'producto_id' => $producto->id,
                    'producto_nombre' => $producto->nombre,
                    'stock' => $producto->stock,
                    'bodega_id' => $bodegaPrincipal->id,
                    'bodega_nombre' => $bodegaPrincipal->nombre
                ]);
                
                // Verificar si ya existe una relación con esta bodega
                $existeRelacion = $producto->bodegas()->where('bodega_id', $bodegaPrincipal->id)->exists();
                
                if (!$existeRelacion) {
                    // Asignar el stock a la bodega principal
                    $producto->bodegas()->attach($bodegaPrincipal->id, [
                        'stock' => $producto->stock
                    ]);
                    
                    Log::info("Stock asignado exitosamente a bodega principal");
                    
                    // Mostrar notificación al usuario
                    Notification::make()
                        ->success()
                        ->title('Producto creado exitosamente')
                        ->body("Stock inicial de {$producto->stock} unidades asignado a la bodega Principal")
                        ->send();
                } else {
                    Log::info("El producto ya tiene relación con la bodega principal, actualizando stock");
                    
                    // Actualizar el stock en la bodega principal
                    $producto->bodegas()->updateExistingPivot($bodegaPrincipal->id, [
                        'stock' => $producto->stock
                    ]);
                    
                    Notification::make()
                        ->success()
                        ->title('Producto creado exitosamente')
                        ->body("Stock actualizado en la bodega Principal: {$producto->stock} unidades")
                        ->send();
                }
                
                DB::commit();
                    
            } catch (\Exception $e) {
                DB::rollback();
                
                Log::error("Error al asignar stock a bodega principal", [
                    'producto_id' => $producto->id,
                    'error' => $e->getMessage(),
                    'trace' => $e->getTraceAsString()
                ]);
                
                // Mostrar notificación de error
                Notification::make()
                    ->warning()
                    ->title('Producto creado con advertencia')
                    ->body('El producto se creó correctamente, pero hubo un problema al asignar el stock a la bodega principal.')
                    ->persistent()
                    ->send();
            }
        } elseif ($producto->variants()->exists()) {
            // Si tiene variantes, limpiar el stock del producto principal
            $producto->update(['stock' => 0]);
            
            Log::info("Producto con variantes creado - stock principal establecido en 0", [
                'producto_id' => $producto->id,
                'producto_nombre' => $producto->nombre
            ]);
            
            Notification::make()
                ->info()
                ->title('Producto con variantes creado')
                ->body('El stock se manejará a nivel de cada variante individual')
                ->send();
        }
    }
}
