<?php

declare(strict_types=1);

namespace App\Filament\Widgets\Alerts;

use App\Filament\Resources\AlertDeliveryResource;
use App\Filament\Resources\AlertDestinationResource;
use App\Filament\Resources\AlertRuleResource;
use App\Models\AlertDelivery;
use App\Models\AlertDestination;
use App\Models\AlertRule;
use App\Models\User;
use App\Services\Auth\ManagedEnvironmentAccessScopeResolver;
use App\Support\Workspaces\WorkspaceContext;
use Filament\Widgets\StatsOverviewWidget;
use Filament\Widgets\StatsOverviewWidget\Stat;
use Illuminate\Database\Eloquent\Builder;

class AlertsKpiHeader extends StatsOverviewWidget
{
    protected static bool $isLazy = false;

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

    /**
     * @return array<Stat>
     */
    protected function getStats(): array
    {
        $user = auth()->user();

        if (! $user instanceof User) {
            return [];
        }

        $workspaceId = app(WorkspaceContext::class)->currentWorkspaceId(request());

        if (! is_int($workspaceId)) {
            return [];
        }

        $stats = [];

        if (AlertRuleResource::canViewAny()) {
            $totalRules = (int) AlertRule::query()
                ->where('workspace_id', $workspaceId)
                ->count();

            $enabledRules = (int) AlertRule::query()
                ->where('workspace_id', $workspaceId)
                ->where('is_enabled', true)
                ->count();

            $stats[] = Stat::make('Enabled rules', $enabledRules)
                ->description('Total '.$totalRules);
        }

        if (AlertDestinationResource::canViewAny()) {
            $totalDestinations = (int) AlertDestination::query()
                ->where('workspace_id', $workspaceId)
                ->count();

            $enabledDestinations = (int) AlertDestination::query()
                ->where('workspace_id', $workspaceId)
                ->where('is_enabled', true)
                ->count();

            $stats[] = Stat::make('Enabled targets', $enabledDestinations)
                ->description('Total '.$totalDestinations);
        }

        if (AlertDeliveryResource::canViewAny()) {
            $deliveriesQuery = $this->deliveriesQueryForViewer($user, $workspaceId);

            $deliveries24Hours = (int) (clone $deliveriesQuery)
                ->where('created_at', '>=', now()->subDay())
                ->count();

            $failed7Days = (int) (clone $deliveriesQuery)
                ->where('created_at', '>=', now()->subDays(7))
                ->where('status', AlertDelivery::STATUS_FAILED)
                ->count();

            $stats[] = Stat::make('Deliveries (24h)', $deliveries24Hours);
            $stats[] = Stat::make('Failed (7d)', $failed7Days);
        }

        return $stats;
    }

    private function deliveriesQueryForViewer(User $user, int $workspaceId): Builder
    {
        $query = AlertDelivery::query()
            ->where('workspace_id', $workspaceId);

        app(ManagedEnvironmentAccessScopeResolver::class)->applyWorkspaceScopeToQuery(
            query: $query,
            user: $user,
            workspaceId: $workspaceId,
            qualifiedEnvironmentColumn: 'alert_deliveries.managed_environment_id',
        );

        return $query;
    }
}
