<?php

declare(strict_types=1);

namespace App\Filament\Resources\Orders\Tables;

use App\Filament\Support\SelectOptionLabels;

use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteBulkAction;
use Filament\Actions\RestoreBulkAction;
use Filament\Actions\Action;
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;
use App\Models\Order;

class OrdersTable
{
    public static function configure(Table $table): Table
    {
        return $table
            ->modifyQueryUsing(fn (Builder $query): Builder => $query->with(['user', 'product', 'project', 'producer']))
            ->defaultSort('created_at', 'desc')
            ->columns([
                TextColumn::make('order_number')
                    ->label('شماره سفارش')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('type')
                    ->label('نوع')
                    ->badge()
                    ->color(fn (string $state): string => match ($state) {
                        'order' => 'success',
                        'request' => 'info',
                        default => 'gray',
                    })
                    ->formatStateUsing(fn (string $state): string => match ($state) {
                        'order' => 'سفارش',
                        'request' => 'درخواست',
                        default => $state,
                    }),
                
                TextColumn::make('user.name')
                    ->label('سفارش‌دهنده')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('product.name')
                    ->label('محصول')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('project.name')
                    ->label('پروژه')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('quantity')
                    ->label('تعداد')
                    ->sortable(),
                
                TextColumn::make('unit')
                    ->label('واحد'),
                
                TextColumn::make('unit_price')
                    ->label('قیمت واحد')
                    ->formatStateUsing(fn ($state) => blank($state) ? null : \Illuminate\Support\Number::format((float) $state) . ' تومان')
                    ->sortable(),
                
                TextColumn::make('total_price')
                    ->label('قیمت کل')
                    ->formatStateUsing(fn ($state) => blank($state) ? null : \Illuminate\Support\Number::format((float) $state) . ' تومان')
                    ->sortable(),
                
                TextColumn::make('status')
                    ->label('وضعیت')
                    ->badge()
                    ->color(fn (string $state): string => match ($state) {
                        'pending' => 'warning',
                        'confirmed' => 'success',
                        'processing' => 'info',
                        'shipped' => 'primary',
                        'delivered' => 'success',
                        'cancelled' => 'danger',
                        'rejected' => 'danger',
                        default => 'gray',
                    })
                    ->formatStateUsing(fn (string $state): string => match ($state) {
                        'pending' => 'در انتظار',
                        'confirmed' => 'تایید شده',
                        'processing' => 'در حال پردازش',
                        'shipped' => 'ارسال شده',
                        'delivered' => 'تحویل داده شده',
                        'cancelled' => 'لغو شده',
                        'rejected' => 'رد شده',
                        default => $state,
                    }),
                
                TextColumn::make('order_date')
                    ->label('تاریخ سفارش')
                    ->jalaliDateTime('Y/m/d H:i')
                    ->sortable(),
                
                TextColumn::make('delivery_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('type')
                    ->label('نوع')
                    ->options([
                        'order' => 'سفارش',
                        'request' => 'درخواست',
                    ]),
                SelectFilter::make('status')
                    ->label('وضعیت')
                    ->options([
                        'pending' => 'در انتظار',
                        'confirmed' => 'تایید شده',
                        'processing' => 'در حال پردازش',
                        'shipped' => 'ارسال شده',
                        'delivered' => 'تحویل داده شده',
                        'cancelled' => 'لغو شده',
                        'rejected' => 'رد شده',
                    ]),
                SelectFilter::make('user_id')
                    ->label('سفارش‌دهنده')
                    ->relationship('user', 'name')
                    ->searchable(['name', 'cellphone'])
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::user($record))
                    ->preload(),
                SelectFilter::make('producer_id')
                    ->label('تولیدکننده')
                    ->relationship('producer', 'brand_name')
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::producer($record))
                    ->searchable()
                    ->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(),
                SelectFilter::make('province_id')
                    ->label('استان')
                    ->relationship('province', 'name')
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::generic($record, 'name', 'استان'))
                    ->searchable()
                    ->preload(),
                SelectFilter::make('county_id')
                    ->label('شهرستان')
                    ->relationship('county', 'name')
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::generic($record, 'name', 'شهر'))
                    ->searchable()
                    ->preload(),
            ])
            ->recordActions([
                EditAction::make(),
                Action::make('confirm')
                    ->label('تأیید')
                    ->icon('heroicon-o-check')
                    ->color('success')
                    ->visible(fn (Order $record) => $record->status === 'pending')
                    ->requiresConfirmation()
                    ->action(function (Order $record): void {
                        $record->update(['status' => 'confirmed']);
                        Notification::make()->title('سفارش تأیید شد.')->success()->send();
                    }),
                Action::make('reject')
                    ->label('رد')
                    ->icon('heroicon-o-x-mark')
                    ->color('danger')
                    ->visible(fn (Order $record) => in_array($record->status, ['pending', 'confirmed'], true))
                    ->requiresConfirmation()
                    ->action(function (Order $record): void {
                        $record->update(['status' => 'rejected']);
                        Notification::make()->title('سفارش رد شد.')->danger()->send();
                    }),
                Action::make('cancel')
                    ->label('لغو')
                    ->icon('heroicon-o-no-symbol')
                    ->color('gray')
                    ->visible(fn (Order $record) => ! in_array($record->status, ['cancelled', 'rejected', 'delivered'], true))
                    ->requiresConfirmation()
                    ->action(function (Order $record): void {
                        $record->update(['status' => 'cancelled']);
                        Notification::make()->title('سفارش لغو شد.')->warning()->send();
                    }),
            ])
            ->toolbarActions([
                BulkActionGroup::make([
                    DeleteBulkAction::make(),
                    ForceDeleteBulkAction::make(),
                    RestoreBulkAction::make(),
                ]),
            ]);
    }
}

