<?php

namespace App\Filament\Resources\Incomes\Tables;

use App\Enums\IncomeCategory;
use App\Filament\Resources\Incomes\IncomeResource;
use App\Models\Income;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\DatePicker;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;

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

                Tables\Columns\TextColumn::make('operation_date')
                    ->label('Fecha')
                    ->date()
                    ->sortable(),

                /** ORIGEN: Pago/Overpayment vs Operativo */
                Tables\Columns\TextColumn::make('origin')
                    ->label('Origen')
                    ->badge()
                    ->state(function (Income $record): string {
                        if ($record->isOverpayment()) {
                            return 'Pago en exceso';
                        }

                        return $record->payment_id
                            ? 'Pago de cliente'
                            : 'Ingreso operativo';
                    })
                    ->color(function (Income $record): string {
                        if ($record->isOverpayment()) {
                            return 'info';
                        }

                        return $record->payment_id ? 'success' : 'warning';
                    }),

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

                Tables\Columns\TextColumn::make('credit.client.name')
                    ->label('Cliente')
                    ->searchable()
                    ->placeholder('-'),

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

                /** CATEGORÍA usando el modelo */
                Tables\Columns\TextColumn::make('category')
                    ->label('Tipo')
                    ->badge()
                    ->formatStateUsing(fn (Income $record) => $record->getCategoryLabel())
                    ->color(fn (Income $record) => $record->getCategoryColor()),

                /** MÉTODO TRADUCIDO */
                Tables\Columns\TextColumn::make('method')
                    ->label('Método')
                    ->badge()
                    ->formatStateUsing(function (?string $state): string {
                        return match ($state) {
                            'cash' => 'Efectivo',
                            'transfer' => 'Transferencia bancaria',
                            'card' => 'Tarjeta',
                            'mobile_money' => 'Billetera digital',
                            'other' => 'Otro',
                            null => '-',
                            default => $state,
                        };
                    }),

                /** USUARIO Y COBRADOR */
                Tables\Columns\TextColumn::make('user.name')
                    ->label('Creado por')
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),

                Tables\Columns\TextColumn::make('collector.name')
                    ->label('Cobrador')
                    ->toggleable(isToggledHiddenByDefault: true),

                Tables\Columns\TextColumn::make('created_at')
                    ->label('Creado')
                    ->since()
                    ->toggleable(isToggledHiddenByDefault: true),
            ])

            ->actions([

                EditAction::make()
                    ->label('Editar')
                    ->visible(fn (Income $record) => $record->isOperational())
                    ->tooltip('Solo ingresos operativos pueden editarse'),

                DeleteAction::make()
                    ->label('Eliminar')
                    ->visible(fn (Income $record) => $record->isOperational())
                    ->modalHeading('Eliminar ingreso')
                    ->modalDescription('Este ingreso es operativo y puede eliminarse. Esta acción es irreversible.')
                    ->tooltip('Solo ingresos operativos pueden eliminarse'),

            ])

            ->filters([
                Tables\Filters\SelectFilter::make('category')
                    ->label('Categoría')
                    ->options(IncomeCategory::allOptions()),

                Tables\Filters\SelectFilter::make('origin_type')
                    ->label('Tipo de origen')
                    ->options([
                        'payment_linked' => 'Ingresos por pago',
                        'capital' => 'Transacciones de capital',
                        'operational' => 'Ingresos operativos',
                        'overpayment' => 'Pagos en exceso',
                    ])
                    ->query(fn (Builder $query, array $data) => match ($data['value'] ?? null) {
                        'payment_linked' => $query->whereIn('category', array_map(
                            fn ($c) => $c->value,
                            IncomeCategory::paymentLinkedCategories(),
                        )),
                        'capital' => $query->whereIn('category', array_map(
                            fn ($c) => $c->value,
                            IncomeCategory::capitalCategories(),
                        )),
                        'operational' => $query->whereIn('category', array_map(
                            fn ($c) => $c->value,
                            IncomeCategory::operationalCategories(),
                        )),
                        'overpayment' => $query->where('category', IncomeCategory::OVERPAYMENT->value),
                        default => $query,
                    }),

                Tables\Filters\Filter::make('operation_date')
                    ->form([
                        DatePicker::make('from')
                            ->label('Desde'),

                        DatePicker::make('until')
                            ->label('Hasta'),
                    ])
                    ->query(function (Builder $query, array $data) {
                        return $query
                            ->when($data['from'] ?? null, fn (Builder $q, $date) => $q->whereDate('operation_date', '>=', $date)
                            )
                            ->when($data['until'] ?? null, fn (Builder $q, $date) => $q->whereDate('operation_date', '<=', $date)
                            );
                    }),
            ])
            ->defaultSort('operation_date', 'desc')
            ->recordUrl(fn (Income $record) => IncomeResource::getUrl('view', ['record' => $record])
            );
    }
}
