<?php

namespace App\Filament\Widgets;

use App\Models\User;
use App\Support\NumberToWords as N;
use Filament\Tables;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as BaseWidget;
use Illuminate\Database\Eloquent\Builder;

class EmployeePerformanceWidget extends BaseWidget
{
    protected static ?string $heading = 'ارزیابی عملکرد کارمندان';
    protected int|string|array $columnSpan = 'full';
    protected static ?int $sort = 98;

    public static function canView(): bool
    {
        $user = auth()->user();

        return $user?->can('view_reports') && $user->canSeeAll('invoices');
    }

    public function table(Table $table): Table
    {
        return $table
            ->query(
                User::query()->whereHas('roles', fn (Builder $q) => $q->where('name', 'staff'))
            )
            ->columns([
                Tables\Columns\TextColumn::make('name')->label('کارمند'),

                Tables\Columns\TextColumn::make('invoices')->label('فاکتورها')
                    ->state(fn (User $u) => N::digits($u->invoices()->whereIn('type', ['invoice', 'official'])->count())),

                Tables\Columns\TextColumn::make('converted')->label('پیش‌فاکتورهای موفق')
                    ->state(fn (User $u) => N::digits($u->invoices()->whereIn('type', ['invoice', 'official'])->whereNotNull('converted_from_id')->count())),

                Tables\Columns\TextColumn::make('open_tasks')->label('تسک باز')
                    ->state(fn (User $u) => N::digits($u->tasks()->whereIn('status', ['open', 'in_progress'])->count())),

                Tables\Columns\TextColumn::make('done_month')->label('تسک انجام‌شده (ماه)')
                    ->state(fn (User $u) => N::digits($u->tasks()->where('status', 'done')
                        ->whereMonth('tasks.updated_at', now()->month)->whereYear('tasks.updated_at', now()->year)->count())),

                Tables\Columns\TextColumn::make('sales')->label('مجموع فروش')
                    ->state(fn (User $u) => N::money($u->salesTotal()) . ' ریال'),

                Tables\Columns\TextColumn::make('bonus')->label('پاداش')
                    ->state(fn (User $u) => N::money($u->bonusAmount()) . ' ریال')
                    ->description(fn (User $u) => N::digits((float) $u->bonus_percent) . '٪'),

                Tables\Columns\TextColumn::make('score')->label('امتیاز عملکرد')->badge()
                    ->state(fn (User $u) => N::digits(static::score($u)))
                    ->color(fn (User $u) => match (true) {
                        static::score($u) >= 80 => 'success',
                        static::score($u) >= 50 => 'warning',
                        static::score($u) >= 25 => 'info',
                        default => 'danger',
                    }),

                Tables\Columns\TextColumn::make('rating')->label('ارزیابی')
                    ->state(fn (User $u) => match (true) {
                        static::score($u) >= 80 => 'عالی',
                        static::score($u) >= 50 => 'خوب',
                        static::score($u) >= 25 => 'متوسط',
                        default => 'ضعیف',
                    }),
            ])
            ->paginated(false);
    }

    /**
     * امتیاز عملکرد (۰ تا ۱۰۰): فاکتور×۵ + پیش‌فاکتور موفق×۱۰ + تسک انجام‌شده ماه×۴
     */
    protected static function score(User $u): int
    {
        $invoices = $u->invoices()->whereIn('type', ['invoice', 'official'])->count();
        $converted = $u->invoices()->whereIn('type', ['invoice', 'official'])->whereNotNull('converted_from_id')->count();
        $doneMonth = $u->tasks()->where('status', 'done')
            ->whereMonth('tasks.updated_at', now()->month)->whereYear('tasks.updated_at', now()->year)->count();

        return (int) min(100, $invoices * 5 + $converted * 10 + $doneMonth * 4);
    }
}
