<?php

declare(strict_types=1);

namespace App\Filament\Widgets\Supervisor;

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

/**
 * Widget de estadísticas del equipo para Supervisor.
 *
 * Muestra: Collectors activos, Cobrado hoy/semana, Pagos del día, Promedio por collector
 */
class TeamStatsWidget extends BaseWidget
{
    protected ?string $pollingInterval = '60s';

    protected static ?int $sort = 1;

    /**
     * Solo visible para Supervisores.
     */
    public static function canView(): bool
    {
        $user = Auth::user();

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

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

        $collectionService = app(CollectionMetricsService::class);

        // Visibilidad supervisor→cobrador (#71): un supervisor asignado solo ve los
        // totales de su equipo; con sees_all_collectors ve toda la empresa.
        $collectorIds = app(CollectorVisibilityResolver::class)->visibleCollectorIds($user);
        $team = $collectionService->getTeamSummary($companyId, $user->id, $collectorIds);

        // "Activo" = con cartera activa asignada (definición unificada con la PWA, #77).
        // La productividad del día (cuántos de ellos cobraron hoy) va en la descripción.
        $activeWithCredits = $team['collectors_with_active_credits'];
        $collectedTodayRate = $activeWithCredits > 0
            ? round(($team['active_collectors_today'] / $activeWithCredits) * 100, 0)
            : 0;

        return [
            Stat::make('Collectors Activos', "{$activeWithCredits} / {$team['total_collectors']}")
                ->description("{$team['active_collectors_today']} cobraron hoy ({$collectedTodayRate}%)")
                ->descriptionIcon($collectedTodayRate >= 80 ? 'heroicon-m-check-circle' : 'heroicon-m-exclamation-triangle')
                ->color($collectedTodayRate >= 80 ? 'success' : ($collectedTodayRate >= 50 ? 'warning' : 'danger')),

            Stat::make('Cobrado Hoy', $this->formatCurrency($team['collected_today']))
                ->description("{$team['payments_count_today']} pagos registrados")
                ->descriptionIcon('heroicon-m-banknotes')
                ->color($team['collected_today'] > 0 ? 'success' : 'gray'),

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

            Stat::make('Promedio/Collector', $this->formatCurrency($team['average_per_collector']))
                ->description('Cobro promedio hoy')
                ->descriptionIcon('heroicon-m-user')
                ->color('info'),
        ];
    }

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