<?php

declare(strict_types=1);

namespace App\Filament\Resources\SubscriptionRequests\Tables;

use App\Models\SubscriptionRequest;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Actions\ViewAction;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Notifications\Notification;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
use Illuminate\Support\Facades\Auth;

class SubscriptionRequestsTable
{
    public static function configure(Table $table): Table
    {
        return $table
            ->columns([
                TextColumn::make('id')
                    ->label('#')
                    ->sortable(),

                TextColumn::make('company.name')
                    ->label('Empresa')
                    ->searchable()
                    ->sortable()
                    ->description(fn ($record) => $record->company?->business_name),

                TextColumn::make('request_type_label')
                    ->label('Tipo')
                    ->badge()
                    ->color('info'),

                TextColumn::make('current_value')
                    ->label('Valor Actual')
                    ->placeholder('-'),

                TextColumn::make('requested_value')
                    ->label('Valor Solicitado')
                    ->placeholder('-')
                    ->weight('bold'),

                TextColumn::make('requestedPlan.name')
                    ->label('Plan Solicitado')
                    ->placeholder('-')
                    ->badge()
                    ->color('success'),

                TextColumn::make('status')
                    ->label('Estado')
                    ->badge()
                    ->formatStateUsing(fn ($record) => $record->status_label)
                    ->color(fn ($record) => $record->status_color),

                TextColumn::make('priority_label')
                    ->label('Prioridad')
                    ->badge()
                    ->color(fn ($record) => $record->priority_color),

                TextColumn::make('requestedBy.name')
                    ->label('Solicitado por')
                    ->toggleable(isToggledHiddenByDefault: true),

                TextColumn::make('created_at')
                    ->label('Fecha')
                    ->dateTime('d/m/Y H:i')
                    ->sortable(),

                TextColumn::make('reviewedBy.name')
                    ->label('Revisado por')
                    ->placeholder('-')
                    ->toggleable(isToggledHiddenByDefault: true),
            ])
            ->defaultSort('created_at', 'desc')
            ->filters([
                SelectFilter::make('status')
                    ->label('Estado')
                    ->options([
                        SubscriptionRequest::STATUS_PENDING => 'Pendiente',
                        SubscriptionRequest::STATUS_APPROVED => 'Aprobado',
                        SubscriptionRequest::STATUS_REJECTED => 'Rechazado',
                        SubscriptionRequest::STATUS_IMPLEMENTED => 'Implementado',
                        SubscriptionRequest::STATUS_CANCELED => 'Cancelado',
                    ])
                    ->default(SubscriptionRequest::STATUS_PENDING),

                SelectFilter::make('request_type')
                    ->label('Tipo')
                    ->options(SubscriptionRequest::getRequestTypes()),

                SelectFilter::make('priority')
                    ->label('Prioridad')
                    ->options([
                        '1' => 'Urgente',
                        '3' => 'Alta',
                        '5' => 'Normal',
                        '7' => 'Baja',
                    ]),
            ])
            ->actions([
                ViewAction::make()
                    ->label('Ver'),

                ActionGroup::make([
                    Action::make('approve')
                        ->label('Aprobar')
                        ->icon('heroicon-o-check-circle')
                        ->color('success')
                        ->requiresConfirmation()
                        ->modalHeading('Aprobar Solicitud')
                        ->modalDescription('¿Confirmas que quieres aprobar esta solicitud?')
                        ->form([
                            Textarea::make('admin_notes')
                                ->label('Notas (opcional)')
                                ->rows(3)
                                ->helperText('Estas notas serán visibles para la empresa'),
                        ])
                        ->action(function (SubscriptionRequest $record, array $data): void {
                            $record->approve(Auth::id(), $data['admin_notes'] ?? null);

                            Notification::make()
                                ->title('Solicitud aprobada')
                                ->body('La solicitud ha sido aprobada. Procede a implementar los cambios.')
                                ->success()
                                ->send();
                        })
                        ->visible(fn ($record) => $record->canBeReviewed()),

                    Action::make('reject')
                        ->label('Rechazar')
                        ->icon('heroicon-o-x-circle')
                        ->color('danger')
                        ->requiresConfirmation()
                        ->modalHeading('Rechazar Solicitud')
                        ->modalDescription('Indica el motivo del rechazo.')
                        ->form([
                            Textarea::make('admin_notes')
                                ->label('Motivo del Rechazo')
                                ->required()
                                ->rows(3)
                                ->helperText('Este motivo será visible para la empresa'),
                        ])
                        ->action(function (SubscriptionRequest $record, array $data): void {
                            $record->reject(Auth::id(), $data['admin_notes']);

                            Notification::make()
                                ->title('Solicitud rechazada')
                                ->body('La solicitud ha sido rechazada.')
                                ->warning()
                                ->send();
                        })
                        ->visible(fn ($record) => $record->canBeReviewed()),

                    Action::make('implement')
                        ->label('Marcar como Implementado')
                        ->icon('heroicon-o-check-badge')
                        ->color('success')
                        ->requiresConfirmation()
                        ->modalHeading('Confirmar Implementación')
                        ->modalDescription('Confirma que los cambios solicitados han sido aplicados.')
                        ->form([
                            Textarea::make('implementation_notes')
                                ->label('Detalles de Implementación')
                                ->rows(3)
                                ->helperText('Describe los cambios realizados'),
                        ])
                        ->action(function (SubscriptionRequest $record, array $data): void {
                            $record->markImplemented(Auth::id(), [
                                'notes' => $data['implementation_notes'] ?? null,
                                'implemented_at' => now()->toDateTimeString(),
                            ]);

                            Notification::make()
                                ->title('Implementación confirmada')
                                ->body('La solicitud ha sido marcada como implementada.')
                                ->success()
                                ->send();
                        })
                        ->visible(fn ($record) => $record->canBeImplemented()),

                    Action::make('set_priority')
                        ->label('Cambiar Prioridad')
                        ->icon('heroicon-o-flag')
                        ->color('warning')
                        ->form([
                            Select::make('priority')
                                ->label('Nueva Prioridad')
                                ->options([
                                    SubscriptionRequest::PRIORITY_URGENT => 'Urgente',
                                    SubscriptionRequest::PRIORITY_HIGH => 'Alta',
                                    SubscriptionRequest::PRIORITY_NORMAL => 'Normal',
                                    SubscriptionRequest::PRIORITY_LOW => 'Baja',
                                ])
                                ->required(),
                        ])
                        ->action(function (SubscriptionRequest $record, array $data): void {
                            $record->update(['priority' => $data['priority']]);

                            Notification::make()
                                ->title('Prioridad actualizada')
                                ->success()
                                ->send();
                        })
                        ->visible(fn ($record) => $record->isPending()),
                ])->label('Acciones'),
            ])
            ->bulkActions([])
            ->emptyStateHeading('No hay solicitudes')
            ->emptyStateDescription('Las solicitudes de cambio de suscripción aparecerán aquí.')
            ->emptyStateIcon('heroicon-o-inbox');
    }
}
