<?php

namespace App\Filament\Resources\ProductoResource\RelationManagers;

use App\Models\Bodega;
use App\Models\Producto;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Tables;
use Filament\Tables\Table;
use Filament\Notifications\Notification;

class BodegasRelationManager extends RelationManager
{
    protected static string $relationship = 'bodegas';

    protected static ?string $title = 'Stock por Bodega';

    protected static ?string $modelLabel = 'Bodega';

    protected static ?string $pluralModelLabel = 'Bodegas';

    public function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\Select::make('bodega_id')
                    ->label('Bodega')
                    ->options(\App\Models\Bodega::pluck('nombre', 'id'))
                    ->required()
                    ->searchable()
                    ->preload(),

                Forms\Components\TextInput::make('stock')
                    ->label('Stock en esta Bodega')
                    ->numeric()
                    ->required()
                    ->default(0)
                    ->minValue(0)
                    ->helperText('Cantidad de este producto en la bodega seleccionada'),
            ]);
    }

    public function table(Table $table): Table
    {
        return $table
            ->recordTitleAttribute('nombre')
            ->columns([
                Tables\Columns\TextColumn::make('nombre')
                    ->label('Bodega')
                    ->searchable()
                    ->sortable(),

                Tables\Columns\TextColumn::make('pivot.stock')
                    ->label('Stock')
                    ->alignCenter()
                    ->sortable()
                    ->formatStateUsing(function ($state, $record) {
                        $producto = $this->getOwnerRecord();
                        
                        // Validación defensiva
                        if (!$producto || !$producto->getKey()) {
                            return "Error: Producto no encontrado";
                        }
                        
                        $unidadMedida = $producto->unidad_medida ?? 'unidad';
                        $stockEnUnidad = Producto::convertirDesdeUnidades($state, $unidadMedida);
                        $nombreUnidad = explode(' ', Producto::getUnidadesMedida()[$unidadMedida])[0];
                        
                        $estado = $state > 0 ? '✅' : '⚠️';
                        return "{$estado} {$stockEnUnidad} {$nombreUnidad}";
                    })
                    ->tooltip(function ($state, $record) {
                        $producto = $this->getOwnerRecord();
                        
                        // Validación defensiva
                        if (!$producto || !$producto->getKey()) {
                            return "Error: No se pudo cargar información del producto";
                        }
                        
                        $unidadMedida = $producto->unidad_medida ?? 'unidad';
                        $stockEnUnidad = Producto::convertirDesdeUnidades($state, $unidadMedida);
                        $nombreUnidad = Producto::getUnidadesMedida()[$unidadMedida];
                        
                        return "Stock en {$nombreUnidad}: {$stockEnUnidad}\nStock en unidades: {$state}";
                    }),

                Tables\Columns\TextColumn::make('pivot.updated_at')
                    ->label('Última Actualización')
                    ->dateTime('d/m/Y H:i')
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),
            ])
            ->filters([
                Tables\Filters\Filter::make('con_stock')
                    ->label('Solo con Stock')
                    ->query(fn ($query) => $query->where('producto_bodega.stock', '>', 0)),
            ])
            ->headerActions([
                Tables\Actions\CreateAction::make()
                    ->label('Asignar a Bodega')
                    ->modalHeading('Asignar Producto a Bodega')
                    ->mutateFormDataUsing(function (array $data): array {
                        // Asegurarse de que el bodega_id esté en el pivot
                        return $data;
                    })
                    ->using(function (array $data): void {
                        $producto = $this->getOwnerRecord();
                        
                        // Validación defensiva para evitar error getKey() on null
                        if (!$producto || !$producto->getKey()) {
                            Notification::make()
                                ->danger()
                                ->title('Error')
                                ->body('No se pudo obtener la información del producto.')
                                ->send();
                            return;
                        }
                        
                        $bodegaId = $data['bodega_id'];
                        $stock = $data['stock'];

                        // Verificar si ya existe la relación
                        if ($producto->bodegas()->where('bodega_id', $bodegaId)->exists()) {
                            Notification::make()
                                ->warning()
                                ->title('Producto ya asignado')
                                ->body('Este producto ya está asignado a esa bodega. Use la opción de editar.')
                                ->send();
                            return;
                        }

                        // Crear la relación
                        $producto->bodegas()->attach($bodegaId, ['stock' => $stock]);

                        Notification::make()
                            ->success()
                            ->title('Producto asignado')
                            ->body('El producto ha sido asignado a la bodega correctamente.')
                            ->send();
                    }),

                Tables\Actions\Action::make('distribuir_stock')
                    ->label('Distribuir Stock Total')
                    ->icon('heroicon-o-arrows-right-left')
                    ->color('warning')
                    ->form([
                        Forms\Components\Placeholder::make('info')
                            ->label('Información')
                            ->content(function () {
                                $producto = $this->getOwnerRecord();
                                
                                // Validación defensiva
                                if (!$producto || !$producto->getKey()) {
                                    return "Error: No se pudo cargar información del producto";
                                }
                                
                                $stockTotal = $producto->getStockEfectivo();
                                $unidadMedida = $producto->unidad_medida ?? 'unidad';
                                $stockEnUnidad = Producto::convertirDesdeUnidades($stockTotal, $unidadMedida);
                                $nombreUnidad = Producto::getUnidadesMedida()[$unidadMedida];
                                
                                return "Stock total disponible: {$stockEnUnidad} {$nombreUnidad} ({$stockTotal} unidades)";
                            }),

                        Forms\Components\Repeater::make('distribucion')
                            ->label('Distribución por Bodega')
                            ->schema([
                                Forms\Components\Select::make('bodega_id')
                                    ->label('Bodega')
                                    ->options(Bodega::pluck('nombre', 'id'))
                                    ->required(),
                                
                                Forms\Components\TextInput::make('stock')
                                    ->label('Stock a Asignar')
                                    ->numeric()
                                    ->required()
                                    ->default(0)
                                    ->minValue(0),
                            ])
                            ->minItems(1)
                            ->addActionLabel('Añadir Bodega'),
                    ])
                    ->action(function (array $data): void {
                        $producto = $this->getOwnerRecord();
                        
                        // Validación defensiva
                        if (!$producto || !$producto->getKey()) {
                            Notification::make()
                                ->danger()
                                ->title('Error')
                                ->body('No se pudo obtener la información del producto.')
                                ->send();
                            return;
                        }
                        
                        $distribucion = $data['distribucion'] ?? [];

                        // Validar que la suma no exceda el stock total
                        $stockAsignado = array_sum(array_column($distribucion, 'stock'));
                        $stockTotal = $producto->getStockEfectivo();

                        if ($stockAsignado > $stockTotal) {
                            Notification::make()
                                ->danger()
                                ->title('Error de Distribución')
                                ->body("El stock asignado ({$stockAsignado}) excede el stock disponible ({$stockTotal})")
                                ->send();
                            return;
                        }

                        // Distribuir el stock
                        foreach ($distribucion as $item) {
                            $producto->bodegas()->syncWithoutDetaching([
                                $item['bodega_id'] => ['stock' => $item['stock']]
                            ]);
                        }

                        Notification::make()
                            ->success()
                            ->title('Stock Distribuido')
                            ->body('El stock ha sido distribuido correctamente entre las bodegas.')
                            ->send();
                    }),
            ])
            ->actions([
                Tables\Actions\EditAction::make()
                    ->label('Editar Stock')
                    ->form([
                        Forms\Components\TextInput::make('stock')
                            ->label('Stock en esta Bodega')
                            ->numeric()
                            ->required()
                            ->minValue(0)
                            ->helperText('Cantidad de este producto en la bodega'),
                    ])
                    ->fillForm(function ($record): array {
                        return [
                            'stock' => $record->pivot?->stock ?? 0,
                        ];
                    })
                    ->using(function (array $data, $record): void {
                        $record->pivot->update(['stock' => (int)$data['stock']]);
                        
                        Notification::make()
                            ->success()
                            ->title('Stock Actualizado')
                            ->body("El stock se actualizó a {$data['stock']} unidades.")
                            ->send();
                    }),

                Tables\Actions\Action::make('vaciar_stock')
                    ->label('Vaciar Stock')
                    ->icon('heroicon-o-minus-circle')
                    ->color('warning')
                    ->requiresConfirmation()
                    ->modalHeading('Vaciar Stock de Bodega')
                    ->modalDescription('¿Estás seguro de que quieres poner el stock en 0 para esta bodega? La bodega seguirá asignada al producto.')
                    ->modalSubmitActionLabel('Sí, vaciar stock')
                    ->action(function ($record): void {
                        $record->pivot->update(['stock' => 0]);
                        
                        Notification::make()
                            ->success()
                            ->title('Stock Vaciado')
                            ->body('El stock de la bodega ha sido puesto en 0.')
                            ->send();
                    }),
/* 
                Tables\Actions\DeleteAction::make()
                    ->label('Quitar Bodega')
                    ->requiresConfirmation()
                    ->modalHeading('Quitar Producto de Bodega')
                    ->modalDescription('¿Estás seguro de que quieres quitar completamente este producto de la bodega? Se perderá toda la información de stock.')
                    ->modalSubmitActionLabel('Sí, quitar completamente'), */
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\BulkAction::make('vaciar_stock_multiple')
                        ->label('Vaciar Stock de Seleccionadas')
                        ->icon('heroicon-o-minus-circle')
                        ->color('warning')
                        ->requiresConfirmation()
                        ->modalHeading('Vaciar Stock de Bodegas Seleccionadas')
                        ->modalDescription('¿Estás seguro de que quieres poner el stock en 0 para todas las bodegas seleccionadas?')
                        ->action(function ($records): void {
                            foreach ($records as $record) {
                                $record->pivot->update(['stock' => 0]);
                            }
                            
                            Notification::make()
                                ->success()
                                ->title('Stock Vaciado')
                                ->body('El stock de las bodegas seleccionadas ha sido puesto en 0.')
                                ->send();
                        }),
                        
                    Tables\Actions\DeleteBulkAction::make()
                        ->label('Quitar de Bodegas Seleccionadas')
                        ->requiresConfirmation()
                        ->modalHeading('Quitar Producto de Bodegas')
                        ->modalDescription('¿Estás seguro de que quieres quitar completamente este producto de las bodegas seleccionadas? Se perderá toda la información de stock.')
                        ->modalSubmitActionLabel('Sí, quitar completamente'),
                ]),
            ]);
    }
}