<?php

declare(strict_types=1);

namespace App\Filament\Resources\HeldPayments\Tables;

use App\Filament\Resources\HeldPayments\HeldPaymentResource;
use App\Models\HeldPayment;
use App\Support\Format;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;

/**
 * La bandeja no calcula si cada fila se puede aprobar (approvalBlocker() hace
 * varias consultas): eso lo dice la vista del retenido.
 */
class HeldPaymentsTable
{
    public static function configure(Table $table): Table
    {
        return $table
            ->columns([
                TextColumn::make('company.name')
                    ->label('Empresa')
                    ->visible(fn (): bool => HeldPaymentResource::viewerIsSuperAdmin()),
                // Las FKs de usuario quedan en null si se borra el usuario.
                TextColumn::make('capturedBy.name')
                    ->label('Cobrador')
                    ->state(fn (HeldPayment $record): ?string => HeldPaymentResource::capturerLabel($record))
                    ->color(fn (HeldPayment $record): ?string => HeldPaymentResource::capturerColor($record))
                    ->placeholder('Usuario eliminado')
                    ->searchable(),
                TextColumn::make('credit.client.name')
                    ->label('Cliente')
                    ->placeholder('Crédito no disponible')
                    ->searchable(),
                // Filament no llama a formatStateUsing() con el estado vacío: sin monto va el placeholder.
                TextColumn::make('amount')
                    ->label('Monto')
                    ->formatStateUsing(fn ($state): string => Format::money($state))
                    ->placeholder('Ilegible')
                    ->sortable(),
                TextColumn::make('payment_date')
                    ->label('Fecha de cobro')
                    ->date('d/m/Y')
                    ->placeholder('—')
                    ->sortable(),
                TextColumn::make('offline_created_at')
                    ->label('Capturado')
                    ->since()
                    ->placeholder('—'),
                // El detalle va debajo: el mismo motivo (p. ej. `invalid`) cubre casos distintos.
                TextColumn::make('reason')
                    ->label('Motivo')
                    ->badge()
                    ->formatStateUsing(fn (string $state): string => HeldPayment::reasonLabel($state))
                    ->description(fn (HeldPayment $record): ?string => $record->reason_detail)
                    ->wrap(),
                TextColumn::make('status')
                    ->label('Estado')
                    ->badge()
                    ->formatStateUsing(fn (string $state): string => HeldPayment::statusLabel($state))
                    ->color(fn (string $state): string => match ($state) {
                        HeldPayment::STATUS_PENDING => 'warning',
                        HeldPayment::STATUS_APPROVED => 'success',
                        default => 'danger',
                    }),
            ])
            ->filters([
                SelectFilter::make('status')
                    ->label('Estado')
                    ->options([
                        HeldPayment::STATUS_PENDING => HeldPayment::statusLabel(HeldPayment::STATUS_PENDING),
                        HeldPayment::STATUS_APPROVED => HeldPayment::statusLabel(HeldPayment::STATUS_APPROVED),
                        HeldPayment::STATUS_REJECTED => HeldPayment::statusLabel(HeldPayment::STATUS_REJECTED),
                    ])
                    ->default(HeldPayment::STATUS_PENDING),
                SelectFilter::make('reason')
                    ->label('Motivo')
                    ->options(array_combine(HeldPayment::REASONS, array_map(HeldPayment::reasonLabel(...), HeldPayment::REASONS))),
            ])
            // Una cola: primero lo que lleva más tiempo esperando.
            ->defaultSort('created_at', 'asc')
            ->recordUrl(fn (HeldPayment $record) => HeldPaymentResource::getUrl('view', ['record' => $record]));
    }
}
