<?php

declare(strict_types=1);

namespace App\Filament\Widgets\Supervisor;

use App\Services\CollectorVisibilityResolver;
use App\Services\Metrics\CollectionMetricsService;
use Filament\Widgets\Widget;
use Illuminate\Support\Facades\Auth;

/**
 * Widget de alertas de rendimiento.
 *
 * Muestra alertas que requieren atención del supervisor:
 * - Collectors sin actividad
 * - Alta morosidad
 * - Metas no cumplidas
 */
class PerformanceAlertsWidget extends Widget
{
    protected string $view = 'filament.widgets.supervisor.performance-alerts';

    protected static ?int $sort = 4;

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

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

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

    public function getAlerts(): array
    {
        $user = Auth::user();
        $companyId = $user->company_id;

        $service = app(CollectionMetricsService::class);
        $alerts = $service->getPerformanceAlerts($companyId)->toArray();

        // Visibilidad supervisor→cobrador (#71): un supervisor asignado solo ve las
        // alertas de su equipo. getPerformanceAlerts cachea a nivel empresa, así que
        // se filtra por el cobrador de cada alerta.
        $collectorIds = app(CollectorVisibilityResolver::class)->visibleCollectorIds($user);
        if ($collectorIds !== null) {
            $alerts = array_values(array_filter(
                $alerts,
                fn ($a) => in_array($a['collector_id'] ?? null, $collectorIds, true),
            ));
        }

        return $alerts;
    }

    public function getSeverityColor(string $severity): string
    {
        return match ($severity) {
            'high' => 'danger',
            'medium' => 'warning',
            'low' => 'info',
            default => 'gray',
        };
    }

    public function getSeverityIcon(string $severity): string
    {
        return match ($severity) {
            'high' => 'heroicon-o-exclamation-triangle',
            'medium' => 'heroicon-o-exclamation-circle',
            'low' => 'heroicon-o-information-circle',
            default => 'heroicon-o-bell',
        };
    }

    public function getTypeIcon(string $type): string
    {
        return match ($type) {
            'no_activity' => 'heroicon-o-clock',
            'high_delinquency' => 'heroicon-o-chart-bar',
            'goal_not_met' => 'heroicon-o-flag',
            default => 'heroicon-o-bell-alert',
        };
    }
}
