<?php

declare(strict_types=1);

namespace App\Filament\Resources\Offers\Tables;

use App\Filament\Support\SelectOptionLabels;
use App\Models\Offer;
use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteBulkAction;
use Filament\Actions\RestoreBulkAction;
use Filament\Notifications\Notification;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Filters\TrashedFilter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;

class OffersTable
{
    public static function configure(Table $table): Table
    {
        return $table
            ->modifyQueryUsing(fn (Builder $query): Builder => $query->with(['user', 'offerTo', 'product', 'project']))
            ->defaultSort('created_at', 'desc')
            ->columns([
                TextColumn::make('name')
                    ->label('نام پیشنهاد')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('user.name')
                    ->label('پیشنهاددهنده')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('offerTo.name')
                    ->label('پیشنهاد به')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('product.name')
                    ->label('محصول')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('project.name')
                    ->label('پروژه')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('offer_type')
                    ->label('نوع پیشنهاد')
                    ->badge()
                    ->formatStateUsing(fn (?string $state): string => match ($state) {
                        'دمآرد' => 'دم‌آورد',
                        'هنیزه' => 'هنیزه',
                        default => $state ?? '-',
                    })
                    ->color(fn (?string $state): string => match ($state) {
                        'دمآرد' => 'success',
                        'هنیزه' => 'warning',
                        default => 'gray',
                    }),
                
                TextColumn::make('price')
                    ->label('قیمت')
                    ->formatStateUsing(fn ($state) => blank($state) ? null : \Illuminate\Support\Number::format((float) $state) . ' تومان')
                    ->sortable(),
                
                TextColumn::make('quantity')
                    ->label('تعداد')
                    ->sortable(),
                
                TextColumn::make('status')
                    ->label('وضعیت')
                    ->badge()
                    ->color(fn (string $state): string => match ($state) {
                        'pending' => 'warning',
                        'accepted' => 'success',
                        'rejected' => 'danger',
                        'expired' => 'gray',
                        'cancelled' => 'danger',
                        default => 'gray',
                    })
                    ->formatStateUsing(fn (string $state): string => match ($state) {
                        'pending' => 'در انتظار',
                        'accepted' => 'پذیرفته شده',
                        'rejected' => 'رد شده',
                        'expired' => 'منقضی شده',
                        'cancelled' => 'لغو شده',
                        default => $state,
                    }),
                
                TextColumn::make('offer_date')
                    ->label('تاریخ پیشنهاد')
                    ->jalaliDateTime('Y/m/d H:i')
                    ->sortable(),
                
                TextColumn::make('expiry_date')
                    ->label('تاریخ انقضا')
                    ->jalaliDateTime('Y/m/d H:i')
                    ->sortable(),
                
                TextColumn::make('createdBy.name')
                    ->label('ایجادکننده')
                    ->hidden()
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('created_at')
                    ->label('تاریخ ایجاد')
                    ->jalaliDateTime('Y/m/d H:i')
                    ->sortable(),
            ])
            ->filters([
                TrashedFilter::make(),
                SelectFilter::make('status')
                    ->label('وضعیت')
                    ->options([
                        'pending' => 'در انتظار',
                        'accepted' => 'پذیرفته شده',
                        'rejected' => 'رد شده',
                        'expired' => 'منقضی شده',
                        'cancelled' => 'لغو شده',
                    ]),
                SelectFilter::make('offer_type')
                    ->label('نوع پیشنهاد')
                    ->options([
                        'دمآرد' => 'دم‌آورد',
                        'هنیزه' => 'هنیزه',
                    ]),
                SelectFilter::make('contract_type')
                    ->label('نوع قرارداد')
                    ->options([
                        'ناموت' => 'ناموت',
                        'other' => 'سایر',
                    ]),
                SelectFilter::make('user_id')
                    ->label('پیشنهاددهنده')
                    ->relationship('user', 'name')
                    ->searchable(['name', 'cellphone'])
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::user($record))
                    ->preload(),
                SelectFilter::make('offer_to')
                    ->label('پیشنهاد به')
                    ->relationship('offerTo', 'name')
                    ->searchable(['name', 'cellphone'])
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::user($record))
                    ->preload(),
                SelectFilter::make('product_id')
                    ->label('محصول')
                    ->relationship('product', 'name')
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::product($record))
                    ->searchable()
                    ->preload(),
                SelectFilter::make('project_id')
                    ->label('پروژه')
                    ->relationship('project', 'name')
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::project($record))
                    ->searchable()
                    ->preload(),
            ])
            ->recordActions([
                EditAction::make(),
                Action::make('accept')
                    ->label('پذیرش')
                    ->icon('heroicon-o-check')
                    ->color('success')
                    ->visible(fn (Offer $record) => $record->status === Offer::STATUS_PENDING)
                    ->requiresConfirmation()
                    ->action(function (Offer $record): void {
                        $record->update(['status' => Offer::STATUS_ACCEPTED]);
                        Notification::make()->title('پیشنهاد پذیرفته شد.')->success()->send();
                    }),
                Action::make('reject')
                    ->label('رد')
                    ->icon('heroicon-o-x-mark')
                    ->color('danger')
                    ->visible(fn (Offer $record) => $record->status === Offer::STATUS_PENDING)
                    ->requiresConfirmation()
                    ->action(function (Offer $record): void {
                        $record->update(['status' => Offer::STATUS_REJECTED]);
                        Notification::make()->title('پیشنهاد رد شد.')->danger()->send();
                    }),
            ])
            ->toolbarActions([
                BulkActionGroup::make([
                    DeleteBulkAction::make(),
                    ForceDeleteBulkAction::make(),
                    RestoreBulkAction::make(),
                ]),
            ]);
    }
}

