<?php

declare(strict_types=1);

namespace App\Filament\Resources\WalletTransactions\Tables;

use App\Filament\Support\SelectOptionLabels;

use App\Models\WalletTransaction;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\TextInput;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;

class WalletTransactionsTable
{
    public static function configure(Table $table): Table
    {
        return $table
            ->modifyQueryUsing(fn (Builder $query): Builder => $query->with(['user', 'project']))
            ->columns([
                TextColumn::make('id')->label('شناسه')->sortable(),
                TextColumn::make('user.getFilamentName')->label('کاربر')->getStateUsing(fn (WalletTransaction $record) => $record->user?->getFilamentName())->searchable(['user.first_name', 'user.last_name', 'user.cellphone', 'user.national_code'])->sortable(),
                TextColumn::make('type')->label('نوع')->badge()->formatStateUsing(fn (string $state) => match ($state) {
                    'deposit' => 'واریز',
                    'withdrawal' => 'برداشت',
                    'profit' => 'سود',
                    'commission' => 'کارمزد',
                    'fee' => 'کارمزد',
                    'charge' => 'شارژ',
                    'purchase' => 'خرید',
                    'sale' => 'فروش',
                    default => $state,
                }),
                TextColumn::make('amount')->label('مبلغ')->formatStateUsing(fn ($state) => $state ? \Illuminate\Support\Number::format((float) $state) . ' تومان' : '-')->sortable(),
                TextColumn::make('balance_after')->label('موجودی پس')->formatStateUsing(fn ($state) => $state !== null ? \Illuminate\Support\Number::format((float) $state) : '-')->toggleable(),
                TextColumn::make('tracking_code')->label('کد پیگیری')->searchable()->toggleable(),
                TextColumn::make('status')
                    ->label('وضعیت')
                    ->badge()
                    ->formatStateUsing(fn (string $state): string => match ($state) {
                        'pending' => 'در انتظار',
                        'completed' => 'تکمیل شده',
                        'failed' => 'ناموفق',
                        'cancelled' => 'لغو شده',
                        default => $state,
                    })
                    ->color(fn (string $state) => match ($state) {
                        'completed' => 'success',
                        'pending' => 'warning',
                        'failed' => 'danger',
                        'cancelled' => 'gray',
                        default => 'gray',
                    }),
                TextColumn::make('project.name')->label('پروژه')->toggleable(),
                TextColumn::make('description')->label('شرح')->limit(40)->toggleable(),
                TextColumn::make('created_at')->label('تاریخ/زمان')->jalaliDateTime('Y/m/d H:i')->sortable(),
            ])
            ->filters([
                Filter::make('date_range')
                    ->label('بازه زمانی')
                    ->schema([
                        DatePicker::make('date_from')->label('از تاریخ')->jalali(),
                        DatePicker::make('date_to')->label('تا تاریخ')->jalali(),
                    ])
                    ->query(function (Builder $q, array $data): Builder {
                        if (filled($data['date_from'] ?? null)) {
                            $q->whereDate('created_at', '>=', $data['date_from']);
                        }
                        if (filled($data['date_to'] ?? null)) {
                            $q->whereDate('created_at', '<=', $data['date_to']);
                        }
                        return $q;
                    }),
                SelectFilter::make('user_id')
                    ->label('کاربر')
                    ->relationship('user', 'first_name')
                    ->searchable(['first_name', 'last_name', 'cellphone', 'national_code', 'email'])
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::user($record)),
                Filter::make('tracking_code')
                    ->form([TextInput::make('tracking_code')->label('کد پیگیری')])
                    ->query(fn (Builder $q, array $data) => $q->when(
                        filled($data['tracking_code'] ?? null),
                        fn (Builder $q) => $q->where('tracking_code', 'like', '%' . $data['tracking_code'] . '%')
                    )),
                SelectFilter::make('status')
                    ->label('وضعیت')
                    ->options([
                        'pending' => 'در انتظار',
                        'completed' => 'تکمیل شده',
                        'failed' => 'ناموفق',
                        'cancelled' => 'لغو شده',
                    ]),
                SelectFilter::make('type')
                    ->label('نوع واریز / تراکنش')
                    ->options([
                        'deposit' => 'واریز',
                        'withdrawal' => 'برداشت',
                        'profit' => 'سود',
                        'commission' => 'کارمزد',
                        'fee' => 'کارمزد',
                        'charge' => 'شارژ',
                        'purchase' => 'خرید',
                        'sale' => 'فروش',
                    ]),
                SelectFilter::make('project_id')
                    ->label('پروژه')
                    ->relationship('project', 'name')
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::project($record))
                    ->searchable()
                    ->preload(),
            ])
            ->defaultSort('created_at', 'desc');
    }
}
