<?php

namespace App\Filament\Resources\ProductoResource\RelationManagers;

use App\Models\ProductVariant;
use App\Models\Bodega;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Actions\Action;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
use Filament\Notifications\Notification;

class VariantesRelationManager extends RelationManager
{
    protected static string $relationship = 'variants';

    public function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\Section::make('Información de la Variante')
                    ->schema([
                        Forms\Components\Select::make('color_id')
                            ->relationship('color', 'name')
                            ->searchable()
                            ->required()
                            ->reactive()
                            ->afterStateUpdated(fn($set, $get, $component) => $this->updateSkuAndBarcode($set, $get, $component)),

                        Forms\Components\Select::make('size_id')
                            ->relationship('size', 'name')
                            ->searchable()
                            ->required()
                            ->reactive()
                            ->afterStateUpdated(fn($set, $get, $component) => $this->updateSkuAndBarcode($set, $get, $component)),

                        Forms\Components\TextInput::make('stock')
                            ->label('Stock Inicial')
                            ->required()
                            ->numeric()
                            ->default(0)
                            ->helperText('Este será el stock inicial que se asignará a la bodega seleccionada'),

                        Forms\Components\TextInput::make('sku')
                            ->label('SKU')
                            ->required()
                            ->maxLength(50)
                            ->dehydrated(), // Se guarda en la base de datos

                        TextInput::make('barcode')
                            ->label('Código de Barras')
                            ->required()
                            ->length(13)
                            ->dehydrated()
                            ->suffixAction(
                                Action::make('imprimirQr')
                                    ->icon('heroicon-o-printer')
                                    ->color('primary')
                                    ->hidden(fn($record) => is_null($record))
                                    ->action(fn($state) => redirect()->route('imprimir.barcode', ['barcode' => $state]))
                                    ->hidden(fn($record) => is_null($record))
                            )
                    ])
                    ->columns(2),

                Forms\Components\Section::make('Asignación de Bodega')
                    ->schema([
                        Forms\Components\Select::make('bodega_id')
                            ->label('Bodega Inicial')
                            ->options(Bodega::pluck('nombre', 'id'))
                            ->required()
                            ->searchable()
                            ->preload()
                            ->default(function () {
                                // Intentar obtener la bodega principal como default
                                $bodegaPrincipal = Bodega::where('nombre', 'Principal')->first();
                                return $bodegaPrincipal?->id;
                            })
                            ->helperText('Seleccione la bodega donde se asignará el stock inicial de esta variante'),

                        Forms\Components\Placeholder::make('info_bodega')
                            ->label('Información')
                            ->content('La variante se creará con el stock especificado en la bodega seleccionada. Podrá distribuir a otras bodegas posteriormente.')
                    ])
                    ->columns(1),
            ]);
    }


    protected static function updateSkuAndBarcode($set, $get, $component)
    {
        $producto = $component->getLivewire()->ownerRecord;
        $color = $get('color_id') ? \App\Models\Color::find($get('color_id')) : null;
        $size = $get('size_id') ? \App\Models\Size::find($get('size_id')) : null;

        $exists = ProductVariant::where('producto_id', $get('producto_id'))
            ->where('color_id', $get('color_id'))
            ->where('size_id', $get('size_id'))
            ->exists();

        if ($exists) {
            // Mostrar notificación en Filament
            Notification::make()
                ->title('Error')
                ->body('Esta combinación de producto, color y talla ya existe.')
                ->danger()
                ->send();
        }
        // Generar SKU basado en el producto, color y talla
        $baseSku = strtoupper(substr($producto?->nombre ?? 'XX', 0, 2)) . '-' .
            strtoupper(substr($color?->name ?? 'XX', 0, 2)) . '-' .
            strtoupper(substr($size?->name ?? 'XX', 0, 2));

        // Asegurar SKU único
        $sku = $baseSku;
        $counter = 1;
        while (ProductVariant::where('sku', $sku)->exists()) {
            $sku = $baseSku . '-' . $counter;
            $counter++;
        }

        // Obtener datos para el código de barras
        $countryCode = '57'; // Código de país (puedes cambiarlo)
        $categoryId = $producto?->categoria_id ?? 00;
        $productId = $producto?->id ?? 00000;
        $variantId = ProductVariant::where('producto_id',$productId)->count() ?? 0;
        $variantId += 1;

        // Generar código de barras estructurado
        $eanService = app(\App\Services\EAN13Service::class);
        $barcode = $eanService->generateUniqueBarcode($countryCode, $categoryId, $productId, $variantId);

        // Asignar valores al formulario
        $set('sku', $sku);
        $set('barcode', $barcode);
    }

    /**
     * Generar SKU y código de barras únicos para una variante
     */
    private function generateUniqueSkuAndBarcode(ProductVariant $variante): void
    {
        $producto = $variante->producto;
        $color = $variante->color;
        $size = $variante->size;

        // Generar SKU
        $baseSku = strtoupper(substr($producto->nombre ?? 'XX', 0, 2)) . '-' .
            strtoupper(substr($color->name ?? 'XX', 0, 2)) . '-' .
            strtoupper(substr($size->name ?? 'XX', 0, 2));

        $sku = $baseSku;
        $counter = 1;
        while (ProductVariant::where('sku', $sku)->exists()) {
            $sku = $baseSku . '-' . $counter;
            $counter++;
        }

        // Generar código de barras
        $countryCode = '57';
        $categoryId = $producto->categoria_id ?? 00;
        $productId = $producto->id ?? 00000;
        $variantId = ProductVariant::where('producto_id', $producto->id)->count() + 1;

        $eanService = app(\App\Services\EAN13Service::class);
        $barcode = $eanService->generateUniqueBarcode($countryCode, $categoryId, $productId, $variantId);

        $variante->sku = $sku;
        $variante->barcode = $barcode;
    }




    public function table(Table $table): Table
    {
        return $table
            ->recordTitleAttribute('sku')
            ->columns([
                Tables\Columns\TextColumn::make('sku')
                    ->label('SKU')
                    ->searchable()
                    ->sortable(),
                    
                Tables\Columns\TextColumn::make('color.name')
                    ->label('Color')
                    ->badge()
                    ->color('info'),
                    
                Tables\Columns\TextColumn::make('size.name')
                    ->label('Talla')
                    ->badge()
                    ->color('warning'),
                    
                Tables\Columns\TextColumn::make('stock')
                    ->label('Stock Directo')
                    ->numeric()
                    ->sortable()
                    ->tooltip('Stock directo de la variante (sin considerar bodegas)'),
                    
                Tables\Columns\TextColumn::make('stock_efectivo')
                    ->label('Stock Total')
                    ->getStateUsing(function ($record) {
                        return $record->getStockEfectivo();
                    })
                    ->badge()
                    ->color(fn ($state) => $state > 0 ? 'success' : 'danger')
                    ->tooltip('Stock total considerando todas las bodegas'),
                    
                Tables\Columns\TextColumn::make('bodegas_info')
                    ->label('Distribución en Bodegas')
                    ->getStateUsing(function ($record) {
                        $bodegas = $record->bodegas()->get();
                        if ($bodegas->count() === 0) {
                            return 'Sin asignar a bodegas';
                        }
                        
                        $distribucion = $bodegas->map(function ($bodega) {
                            return "{$bodega->nombre}: {$bodega->pivot->stock}";
                        })->join(' | ');
                        
                        return $distribucion;
                    })
                    ->wrap()
                    ->tooltip('Distribución de stock por bodega'),
                    
                Tables\Columns\TextColumn::make('barcode')
                    ->label('Código de Barras')
                    ->action(fn($record) => redirect()->route('imprimir.barcode', ['barcode' => $record->barcode]))
                    ->tooltip('Click para imprimir código QR')
                    ->copyable()
                    ->copyMessage('Código copiado')
                    ->toggleable(isToggledHiddenByDefault: true),
            ])

            ->filters([
                Tables\Filters\SelectFilter::make('color_id')
                    ->label('Color')
                    ->relationship('color', 'name')
                    ->searchable(),
                    
                Tables\Filters\SelectFilter::make('size_id')
                    ->label('Talla')
                    ->relationship('size', 'name')
                    ->searchable(),
                    
                Tables\Filters\Filter::make('con_stock')
                    ->label('Con Stock')
                    ->query(fn (Builder $query): Builder => 
                        $query->where('stock', '>', 0)
                              ->orWhereHas('bodegas', function ($q) {
                                  $q->where('variante_bodega.stock', '>', 0);
                              })
                    ),
                    
                Tables\Filters\Filter::make('sin_stock')
                    ->label('Sin Stock')
                    ->query(fn (Builder $query): Builder => 
                        $query->where('stock', '=', 0)
                              ->whereDoesntHave('bodegas', function ($q) {
                                  $q->where('variante_bodega.stock', '>', 0);
                              })
                    ),
                    
                Tables\Filters\SelectFilter::make('bodega_id')
                    ->label('En Bodega')
                    ->options(Bodega::pluck('nombre', 'id'))
                    ->query(function (Builder $query, array $data): Builder {
                        return $query->when(
                            $data['value'],
                            fn (Builder $query, $value): Builder => $query->whereHas('bodegas', function ($q) use ($value) {
                                $q->where('bodegas.id', $value);
                            })
                        );
                    }),
            ])
            ->headerActions([
                Tables\Actions\CreateAction::make()
                    ->label('Crear Variante')
                    ->modalHeading('Crear Nueva Variante')
                    ->modalDescription('Complete la información de la variante y seleccione la bodega inicial')
                    ->modalWidth('3xl')
                    ->using(function (array $data, string $model): ProductVariant {
                        // Extraer bodega_id de los datos antes de crear la variante
                        $bodegaId = $data['bodega_id'];
                        $stockInicial = $data['stock'];
                        
                        // Remover bodega_id de los datos para evitar errores en la creación
                        unset($data['bodega_id']);
                        
                        // Crear la variante
                        $variante = $this->getOwnerRecord()->variants()->create($data);
                        
                        // Asignar a la bodega seleccionada
                        if ($bodegaId && $stockInicial > 0) {
                            $variante->bodegas()->attach($bodegaId, ['stock' => $stockInicial]);
                            
                            $bodegaNombre = Bodega::find($bodegaId)->nombre;
                            Notification::make()
                                ->success()
                                ->title('Variante creada exitosamente')
                                ->body("La variante {$variante->sku} se creó con {$stockInicial} unidades en la bodega {$bodegaNombre}")
                                ->send();
                        } else if ($bodegaId) {
                            // Si no hay stock inicial pero se seleccionó bodega, crear la relación con stock 0
                            $variante->bodegas()->attach($bodegaId, ['stock' => 0]);
                            
                            $bodegaNombre = Bodega::find($bodegaId)->nombre;
                            Notification::make()
                                ->success()
                                ->title('Variante creada')
                                ->body("La variante {$variante->sku} se creó y asignó a la bodega {$bodegaNombre}")
                                ->send();
                        }
                        
                        return $variante;
                    }),
            ])
            ->actions([
                Tables\Actions\EditAction::make()
                    ->label('Editar')
                    ->modalWidth('3xl'),
                    
                Tables\Actions\Action::make('gestionar_bodegas')
                    ->label('Gestionar Bodegas')
                    ->icon('heroicon-o-building-storefront')
                    ->color('info')
                    ->url(fn (ProductVariant $record): string => 
                        "/admin/product-variants/{$record->id}/edit"
                    )
                    ->openUrlInNewTab()
                    ->tooltip('Abrir gestión completa de bodegas para esta variante'),
                    
                Tables\Actions\Action::make('duplicar_variante')
                    ->label('Duplicar')
                    ->icon('heroicon-o-document-duplicate')
                    ->color('warning')
                    ->form([
                        Forms\Components\Select::make('color_id')
                            ->label('Nuevo Color')
                            ->relationship('color', 'name')
                            ->required(),
                        Forms\Components\Select::make('size_id')
                            ->label('Nueva Talla')
                            ->relationship('size', 'name')
                            ->required(),
                        Forms\Components\TextInput::make('stock_inicial')
                            ->label('Stock Inicial')
                            ->numeric()
                            ->default(0),
                        Forms\Components\Select::make('bodega_id')
                            ->label('Bodega Inicial')
                            ->options(Bodega::pluck('nombre', 'id'))
                            ->required(),
                    ])
                    ->action(function (ProductVariant $record, array $data): void {
                        // Verificar que no exista la combinación
                        $exists = ProductVariant::where('producto_id', $record->producto_id)
                            ->where('color_id', $data['color_id'])
                            ->where('size_id', $data['size_id'])
                            ->exists();
                            
                        if ($exists) {
                            Notification::make()
                                ->danger()
                                ->title('Error')
                                ->body('Ya existe una variante con esa combinación de color y talla')
                                ->send();
                            return;
                        }
                        
                        // Crear nueva variante
                        $newVariant = $record->replicate([
                            'sku', 'barcode', 'color_id', 'size_id'
                        ]);
                        $newVariant->color_id = $data['color_id'];
                        $newVariant->size_id = $data['size_id'];
                        $newVariant->stock = $data['stock_inicial'];
                        
                        // Generar SKU y código de barras únicos
                        $this->generateUniqueSkuAndBarcode($newVariant);
                        $newVariant->save();
                        
                        // Asignar a bodega
                        if ($data['bodega_id'] && $data['stock_inicial'] > 0) {
                            $newVariant->bodegas()->attach($data['bodega_id'], ['stock' => $data['stock_inicial']]);
                        }
                        
                        Notification::make()
                            ->success()
                            ->title('Variante duplicada')
                            ->body("Nueva variante {$newVariant->sku} creada exitosamente")
                            ->send();
                    }),
                    
                Tables\Actions\DeleteAction::make()
                    ->label('Eliminar'),
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make(),
                ]),
            ]);
    }
}
