<?php

namespace App\Filament\Resources\Expenses\Tables;

use App\Enums\ExpenseCategory;
use App\Filament\Resources\Expenses\ExpenseResource;
use App\Models\Company;
use App\Models\Expense;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\DatePicker;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Support\Facades\Auth;

class ExpensesTable
{
    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(),

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

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

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

                Tables\Columns\TextColumn::make('category')
                    ->label('Tipo')
                    ->badge()
                    ->formatStateUsing(fn (?ExpenseCategory $state) => $state?->getLabel() ?? 'Desconocido')
                    ->color(fn (?ExpenseCategory $state) => $state?->getColor() ?? 'gray'),

                Tables\Columns\TextColumn::make('method')
                    ->label('Método')
                    ->badge()
                    ->formatStateUsing(fn (?string $state) => match ($state) {
                        'cash' => 'Efectivo',
                        'bank_transfer' => 'Transferencia bancaria',
                        'card' => 'Tarjeta',
                        'mobile_money' => 'Billetera digital',
                        'other' => 'Otro',
                        default => $state,
                    }),

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

            ->actions([

                EditAction::make()
                    ->label('Editar')
                    ->visible(fn (Expense $record) => $record->canBeEdited())
                    ->tooltip('Solo egresos operativos pueden editarse'),

                DeleteAction::make()
                    ->label('Eliminar')
                    ->visible(fn (Expense $record) => $record->canBeDeleted())
                    ->modalHeading('Eliminar egreso')
                    ->modalDescription('Este egreso es operativo. Esta acción es irreversible.')
                    ->tooltip('Solo egresos operativos pueden eliminarse'),

            ])

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

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

                        DatePicker::make('until')
                            ->label('Hasta'),
                    ])
                    ->query(function ($query, array $data) {
                        return $query
                            ->when($data['from'] ?? null, fn ($q, $date) => $q->whereDate('operation_date', '>=', $date)
                            )
                            ->when($data['until'] ?? null, fn ($q, $date) => $q->whereDate('operation_date', '<=', $date)
                            );
                    }),

                Tables\Filters\SelectFilter::make('company_id')
                    ->label('Compañía')
                    ->options(
                        fn () => Auth::user()->isSuperAdmin()
                            ? Company::query()->pluck('name', 'id')->toArray()
                            : []
                    )
                    ->visible(fn () => Auth::user()->isSuperAdmin()),
            ])
            ->defaultSort('operation_date', 'desc')
            ->recordUrl(fn (Expense $record) => ExpenseResource::getUrl('view', ['record' => $record])
            );
    }
}
