<?php

namespace App\Filament\Resources\Clients\RelationManagers;

use App\Filament\Resources\Credits\CreditResource;
use App\Filament\Resources\Payments\PaymentResource;
use App\Models\Credit;
use Filament\Actions\Action;
use Filament\Actions\CreateAction;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;

class CreditsRelationManager extends RelationManager
{
    protected static string $relationship = 'credits';

    protected static ?string $title = 'Créditos del Cliente';

    protected static ?string $recordTitleAttribute = 'id';

    public function table(Table $table): Table
    {
        return $table
            ->columns([
                TextColumn::make('code')
                    ->label('Código')
                    ->badge()
                    ->color('gray')
                    ->sortable(['company_credit_number']),

                TextColumn::make('id')
                    ->label('ID interno')
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),

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

                TextColumn::make('installments_count')
                    ->label('Cuotas')
                    ->sortable(),

                TextColumn::make('periodicity')
                    ->label('Periodicidad')
                    ->badge()
                    ->formatStateUsing(fn ($state) => match ($state) {
                        'daily' => 'Diario',
                        'weekly' => 'Semanal',
                        'biweekly' => 'Quincenal',
                        'monthly' => 'Mensual',
                        default => $state,
                    })
                    ->color(fn ($state) => match ($state) {
                        'weekly' => 'info',
                        'biweekly' => 'warning',
                        'monthly' => 'primary',
                        default => 'gray',
                    }),

                TextColumn::make('remaining_balance')
                    ->label('Saldo Pendiente')
                    ->getStateUsing(fn (Credit $record) => $record->installments->sum(fn ($i) => max(0, $i->total_amount - $i->amount_paid)
                    )
                    )
                    ->money('COP', locale: 'es_CO')
                    ->color('danger'),

                TextColumn::make('status')
                    ->label('Estado')
                    ->badge()
                    ->formatStateUsing(fn (string $state): string => match ($state) {
                        'active' => 'Activo',
                        'delayed' => 'En mora',
                        'overdue' => 'Vencido',
                        'paid' => 'Pagado',
                        'canceled' => 'Cancelado',
                        'extended' => 'Extendido',
                        'refinanced' => 'Refinanciado',
                        'restructured' => 'Reestructurado',
                        'renewed' => 'Renovado',
                        default => $state,
                    })
                    ->color(fn (string $state): string => match ($state) {
                        'active' => 'success',
                        'delayed' => 'warning',
                        'overdue' => 'danger',
                        'paid' => 'info',
                        'canceled' => 'gray',
                        'extended' => 'purple',
                        'refinanced' => 'purple',
                        'restructured' => 'purple',
                        'renewed' => 'purple',
                        default => 'gray',
                    }),

                TextColumn::make('start_date')
                    ->label('Inicio')
                    ->date('d/m/Y')
                    ->sortable(),
            ])

            ->filters([
                SelectFilter::make('status')
                    ->label('Estado')
                    ->options([
                        'active' => 'Activo',
                        'delayed' => 'En mora',
                        'overdue' => 'Vencido',
                        'paid' => 'Pagado',
                        'canceled' => 'Cancelado',
                        'extended' => 'Extendido',
                        'refinanced' => 'Refinanciado',
                        'restructured' => 'Reestructurado',
                        'renewed' => 'Renovado',
                    ]),
            ])

            ->headerActions([
                CreateAction::make()
                    ->label('Nuevo Crédito')
                    ->url(fn () => CreditResource::getUrl('create', [
                        'client_id' => $this->ownerRecord->id,
                    ])),
            ])

            ->actions([
                // Registrar pago
                Action::make('payment')
                    ->label('Abonar')
                    ->icon('heroicon-o-banknotes')
                    ->color('success')
                    ->url(fn (Credit $record) => PaymentResource::getUrl('create', ['credit_id' => $record->id])
                    )
                    ->visible(fn (Credit $record) => ! $record->isClosed()),

                // Ver crédito
                Action::make('view')
                    ->label('Ver')
                    ->icon('heroicon-o-eye')
                    ->url(fn (Credit $record) => CreditResource::getUrl('view', ['record' => $record])
                    ),
            ])

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

            ->emptyStateHeading('Sin créditos')
            ->emptyStateDescription('Este cliente aún no tiene créditos registrados.')
            ->emptyStateIcon('heroicon-o-currency-dollar')
            ->emptyStateActions([
                Action::make('create')
                    ->label('Crear primer crédito')
                    ->icon('heroicon-o-plus')
                    ->url(fn () => CreditResource::getUrl('create', [
                        'client_id' => $this->ownerRecord->id,
                    ])),
            ]);
    }
}
