<?php

declare(strict_types=1);

namespace App\Filament\Widgets\Collector;

use App\Services\Metrics\CollectionMetricsService;
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
use Filament\Widgets\StatsOverviewWidget\Stat;
use Illuminate\Support\Facades\Auth;

class CollectorStatsWidget extends BaseWidget
{
    protected ?string $pollingInterval = '60s';

    protected static ?int $sort = 1;

    public static function canView(): bool
    {
        $user = Auth::user();

        return $user && $user->hasRole('collector') && ! $user->isSuperAdmin();
    }

    protected function getStats(): array
    {
        $user = Auth::user();
        $companyId = $user->company_id;

        $service = app(CollectionMetricsService::class);
        $summary = $service->getCollectorDailySummary($companyId, $user->id);

        return [
            Stat::make('Cobrado Hoy', $this->formatCurrency($summary['collected_today']))
                ->description('Recaudos del día')
                ->descriptionIcon('heroicon-m-banknotes')
                ->color($summary['collected_today'] > 0 ? 'success' : 'gray'),

            Stat::make('Cuotas Hoy', (string) $summary['due_today_count'])
                ->description($this->formatCurrency($summary['due_today_amount']).' pendiente')
                ->descriptionIcon('heroicon-m-calendar')
                ->color($summary['due_today_count'] > 0 ? 'warning' : 'success'),

            Stat::make('Cuotas Vencidas', (string) $summary['overdue_count'])
                ->description($this->formatCurrency($summary['overdue_amount']).' vencido')
                ->descriptionIcon('heroicon-m-exclamation-triangle')
                ->color($summary['overdue_count'] > 0 ? 'danger' : 'gray'),

            Stat::make('Cobrado Semana', $this->formatCurrency($summary['collected_week']))
                ->description('Acumulado semanal')
                ->descriptionIcon('heroicon-m-calendar-days')
                ->color('primary'),
        ];
    }

    private function formatCurrency(float $amount): string
    {
        return '$'.number_format($amount, 0, ',', '.');
    }
}
