<?php

declare(strict_types=1);

namespace App\Filament\Resources\Products\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\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ToggleColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Filters\TrashedFilter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;

class ProductsTable
{
    public static function configure(Table $table): Table
    {
        return $table
            ->modifyQueryUsing(fn (Builder $query): Builder => $query->with(['category', 'producer', 'breed']))
            ->defaultSort('created_at', 'desc')
            ->columns([
                ImageColumn::make('image')
                    ->label('تصویر')
                    ->circular()
                    ->defaultImageUrl(url('/images/placeholder.png')),
                
                TextColumn::make('name')
                    ->label('نام محصول')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('category.title')
                    ->label('دسته')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('producer.brand_name')
                    ->label('تولیدکننده')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('breed.name')
                    ->label('نژاد')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('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) {
                        'active' => 'success',
                        'inactive' => 'danger',
                        'pending' => 'warning',
                        'sold' => 'info',
                        'deleted' => 'gray',
                        'expired' => 'danger',
                        default => 'gray',
                    })
                    ->formatStateUsing(fn (string $state): string => match ($state) {
                        'active' => 'فعال',
                        'inactive' => 'غیرفعال',
                        'pending' => 'در انتظار',
                        'sold' => 'فروخته شده',
                        'deleted' => 'حذف شده',
                        'expired' => 'منقضی شده',
                        default => $state,
                    }),
                
                ToggleColumn::make('is_active')
                    ->label('فعال'),
                
                ToggleColumn::make('is_featured')
                    ->label('ویژه'),
                
                TextColumn::make('view_count')
                    ->label('بازدید')
                    ->sortable(),
                
                TextColumn::make('order_count')
                    ->label('سفارش')
                    ->sortable(),
                
                TextColumn::make('createdBy.name')
                    ->label('ایجادکننده')
                    ->hidden()
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('created_at')
                    ->label('تاریخ ایجاد')
                    ->jalaliDateTime('Y/m/d H:i')
                    ->sortable(),
                
                TextColumn::make('updated_at')
                    ->label('تاریخ بروزرسانی')
                    ->jalaliDateTime('Y/m/d H:i')
                    ->sortable(),
            ])
            ->filters([
                TrashedFilter::make(),
                SelectFilter::make('status')
                    ->label('وضعیت')
                    ->options([
                        'active' => 'فعال',
                        'inactive' => 'غیرفعال',
                        'pending' => 'در انتظار',
                        'sold' => 'فروخته شده',
                        'deleted' => 'حذف شده',
                        'expired' => 'منقضی شده',
                    ]),
                SelectFilter::make('is_active')
                    ->label('فعال')
                    ->options([
                        1 => 'بله',
                        0 => 'خیر',
                    ]),
                SelectFilter::make('is_featured')
                    ->label('ویژه')
                    ->options([
                        1 => 'بله',
                        0 => 'خیر',
                    ]),
                SelectFilter::make('category_id')
                    ->label('دسته')
                    ->relationship('category', 'title')
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::category($record))
                    ->searchable()
                    ->preload(),
                SelectFilter::make('producer_id')
                    ->label('تولیدکننده')
                    ->relationship('producer', 'brand_name')
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::producer($record))
                    ->searchable()
                    ->preload(),
                SelectFilter::make('breed_id')
                    ->label('نژاد')
                    ->relationship('breed', 'name')
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::generic($record, 'name', 'نژاد'))
                    ->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(),
                SelectFilter::make('gender')
                    ->label('جنسیت')
                    ->options([
                        'male' => 'نر',
                        'female' => 'ماده',
                        'both' => 'هر دو',
                        'unknown' => 'نامشخص',
                    ]),
            ])
            ->recordActions([
                EditAction::make(),
            ])
            ->toolbarActions([
                BulkActionGroup::make([
                    DeleteBulkAction::make(),
                    ForceDeleteBulkAction::make(),
                    RestoreBulkAction::make(),
                ]),
            ]);
    }
}

