<?php

declare(strict_types=1);

namespace App\Filament\Widgets;

use App\Models\Comment;
use App\Models\ConsultationRequest;
use App\Models\MediaFlag;
use App\Models\MediaItem;
use App\Models\Order;
use App\Models\ProjectRequest;
use App\Models\Report;
use App\Models\SupportTicket;
use App\Models\WithdrawalRequest;
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
use Filament\Widgets\StatsOverviewWidget\Stat;
use Illuminate\Support\Facades\Schema;

class PendingAdminQueueOverview extends BaseWidget
{
    protected static ?int $sort = -1;

    protected int|string|array $columnSpan = 'full';

    protected function getStats(): array
    {
        $pendingWithdrawals = Schema::hasTable('withdrawal_requests')
            ? WithdrawalRequest::query()->where('status', WithdrawalRequest::STATUS_PENDING)->count()
            : 0;

        $pendingReports = Schema::hasTable('reports')
            ? Report::query()->where('status', 'pending')->count()
            : 0;

        $pendingMedia = Schema::hasTable('media_items')
            ? MediaItem::query()->where('status', MediaItem::STATUS_PENDING)->count()
            : 0;

        $mediaFlags = Schema::hasTable('media_flags')
            ? MediaFlag::query()->count()
            : 0;

        $projectRequests = Schema::hasTable('project_requests')
            ? ProjectRequest::query()->where('status', ProjectRequest::STATUS_WAITING)->count()
            : 0;

        $consultations = Schema::hasTable('consultation_requests')
            ? ConsultationRequest::query()->where('status', ConsultationRequest::STATUS_PENDING)->count()
            : 0;

        $pendingOrders = Schema::hasTable('orders')
            ? Order::query()->where('status', 'pending')->count()
            : 0;

        $pendingComments = Schema::hasTable('comments')
            ? Comment::query()
                ->whereNotIn('status', [Comment::STATUS_APPROVED, Comment::STATUS_REJECTED, Comment::STATUS_BLOCKED])
                ->count()
            : 0;

        $openTickets = Schema::hasTable('support_tickets')
            ? SupportTicket::query()->whereIn('status', [
                SupportTicket::STATUS_OPEN,
                SupportTicket::STATUS_UNREAD,
            ])->count()
            : 0;

        return [
            Stat::make('برداشت‌های در انتظار', $pendingWithdrawals)
                ->description('نیاز به تأیید مالی')
                ->color($pendingWithdrawals > 0 ? 'danger' : 'success'),
            Stat::make('گزارش‌های در انتظار', $pendingReports)
                ->description('رشد / سلامت / جیره')
                ->color($pendingReports > 0 ? 'warning' : 'success'),
            Stat::make('رسانه در انتظار', $pendingMedia)
                ->description($mediaFlags > 0 ? "{$mediaFlags} گزارش تخلف" : 'بدون گزارش تخلف')
                ->color(($pendingMedia + $mediaFlags) > 0 ? 'warning' : 'success'),
            Stat::make('درخواست پروژه', $projectRequests)
                ->description('تولیدکننده → ادمین')
                ->color($projectRequests > 0 ? 'warning' : 'success'),
            Stat::make('درخواست مشاوره', $consultations)
                ->description('نیاز به بررسی')
                ->color($consultations > 0 ? 'warning' : 'success'),
            Stat::make('سفارشات در انتظار', $pendingOrders)
                ->color($pendingOrders > 0 ? 'warning' : 'success'),
            Stat::make('تیکت‌های باز', $openTickets)
                ->color($openTickets > 0 ? 'danger' : 'success'),
            Stat::make('کامنت‌های بررسی‌نشده', $pendingComments)
                ->color($pendingComments > 0 ? 'warning' : 'success'),
        ];
    }

    protected function getColumns(): int
    {
        return 4;
    }
}
