<?php

namespace App\Filament\Resources\Payments\Tables;

use App\Services\PaymentManager;
use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Actions\ViewAction;
use Filament\Forms\Components\Textarea;
use Filament\Notifications\Notification;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Filters\TernaryFilter;
use Filament\Tables\Table;

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

                TextColumn::make('credit.id')
                    ->label('Crédito')
                    ->sortable()
                    ->searchable(),

                TextColumn::make('credit.client.name')
                    ->label('Cliente')
                    ->sortable()
                    ->searchable(),

                TextColumn::make('installment.installment_number')
                    ->label('Cuota')
                    ->sortable()
                    ->placeholder('--'),

                TextColumn::make('amount')
                    ->label('Monto')
                    ->money('COP', divideBy: 1, locale: 'es_CO')
                    ->sortable(),

                TextColumn::make('applied_amount')
                    ->label('Aplicado')
                    ->money('COP', divideBy: 1, locale: 'es_CO')
                    ->sortable(),

                TextColumn::make('payment_method')
                    ->label('Método')
                    ->badge()
                    ->formatStateUsing(fn (?string $state): string => match ($state) {
                        'cash' => 'Efectivo',
                        'transfer' => 'Transferencia',
                        'card' => 'Tarjeta',
                        'mobile' => 'Pago móvil',
                        'reversal' => 'Reversión',
                        default => $state ?? 'Sin especificar',
                    })
                    ->color(fn (?string $state): string => match ($state) {
                        'cash' => 'success',
                        'transfer' => 'primary',
                        'card' => 'warning',
                        'mobile' => 'info',
                        'reversal' => 'danger',
                        default => 'gray',
                    }),

                TextColumn::make('payment_date')
                    ->label('Fecha de pago')
                    ->date('d M Y')
                    ->sortable(),

                TextColumn::make('voided')
                    ->label('Estado')
                    ->badge()
                    ->formatStateUsing(fn (bool $state): string => $state ? 'Anulado' : 'Activo')
                    ->color(fn (bool $state): string => $state ? 'danger' : 'success'),

                TextColumn::make('registeredBy.name')
                    ->label('Registrado por')
                    ->placeholder('Sistema'),

                TextColumn::make('latitude')
                    ->label('Ubicación GPS')
                    ->getStateUsing(fn ($record): ?string => ($record->latitude !== null && $record->longitude !== null)
                            ? number_format((float) $record->latitude, 5).', '.number_format((float) $record->longitude, 5)
                            : null
                    )
                    ->url(fn ($record): ?string => ($record->latitude !== null && $record->longitude !== null)
                            ? "https://maps.google.com/?q={$record->latitude},{$record->longitude}"
                            : null,
                        shouldOpenInNewTab: true
                    )
                    ->placeholder('Sin ubicación')
                    ->icon(fn ($record): ?string => $record->latitude !== null ? 'heroicon-o-map-pin' : null)
                    ->color('primary')
                    ->toggleable(isToggledHiddenByDefault: true),

                TextColumn::make('created_at')
                    ->label('Creado')
                    ->dateTime('d M Y H:i')
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),
            ])

            ->defaultSort('created_at', 'desc')

            ->filters([
                SelectFilter::make('payment_method')
                    ->label('Método de pago')
                    ->options([
                        'cash' => 'Efectivo',
                        'transfer' => 'Transferencia',
                        'card' => 'Tarjeta',
                        'mobile' => 'Pago móvil',
                        'reversal' => 'Reversión',
                    ]),

                TernaryFilter::make('voided')
                    ->label('Estado')
                    ->placeholder('Todos')
                    ->trueLabel('Solo anulados')
                    ->falseLabel('Solo activos'),
            ])

            ->recordActions([
                ViewAction::make()
                    ->label('Ver'),
                EditAction::make()
                    ->label('Editar'),

                /**=========================================
                 * DELETE CUSTOM (NO DeleteAction NATIVO)
                 *=========================================*/
                Action::make('deletePayment')
                    ->label('Eliminar')
                    ->icon('heroicon-o-trash')
                    ->color('danger')
                    ->requiresConfirmation()
                    ->modalHeading('Eliminar pago')
                    ->modalDescription(fn ($record) => 'Eliminarás un pago de '.
                        number_format($record->amount, 0, ',', '.').
                        ' COP aplicado al crédito #'.$record->credit->code.
                        ' (cuota #'.($record->installment->installment_number ?? '--').')'
                    )
                    ->schema([
                        Textarea::make('reason')
                            ->label('Motivo de la eliminación')
                            ->required()
                            ->rows(4),
                    ])
                    ->action(function ($record, array $data) {

                        $manager = app(PaymentManager::class);

                        if (! $manager->canDeletePayment($record)) {
                            Notification::make()
                                ->title('No se puede eliminar el pago')
                                ->danger()
                                ->body('Este pago está bloqueado por reglas del sistema.')
                                ->send();

                            return;
                        }

                        $manager->deletePayment($record, $data['reason']);

                        Notification::make()
                            ->title('Pago eliminado')
                            ->success()
                            ->send();
                    })
                    ->visible(fn ($record) => app(PaymentManager::class)->canDeletePayment($record)
                    ),
            ])

            ->bulkActions([
                BulkActionGroup::make([

                    /**=========================================
                     * DELETE BULK CUSTOM (NO DeleteBulkAction)
                     *=========================================*/
                    Action::make('deletePaymentsBulk')
                        ->label('Eliminar pagos seleccionados')
                        ->icon('heroicon-o-trash')
                        ->color('danger')
                        ->requiresConfirmation()
                        ->modalHeading('Eliminar pagos')
                        ->modalDescription('Esta acción eliminará todos los pagos seleccionados y actualizará cuotas, ingresos y auditoría.')
                        ->modalSubmitActionLabel('Sí, eliminar')
                        ->action(function (array $records) {

                            $manager = app(PaymentManager::class);
                            $count = 0;

                            foreach ($records as $record) {
                                if ($manager->canDeletePayment($record)) {
                                    $manager->deletePayment($record, 'Eliminación masiva desde Filament');
                                    $count++;
                                }
                            }

                            Notification::make()
                                ->title('Pagos eliminados')
                                ->success()
                                ->body("Se eliminaron {$count} pagos correctamente.")
                                ->send();
                        }),
                ]),
            ]);
    }
}
