<?php

namespace App\Web\Pages\Servers\PHP;

use App\Actions\PHP\InstallNewPHP;
use App\Models\Server;
use App\Models\Service;
use App\Web\Components\Page;
use App\Web\Pages\Servers\PHP\Widgets\PHPList;
use App\Web\Traits\PageHasServer;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Support\Enums\IconPosition;

class Index extends Page
{
    use PageHasServer;

    protected static ?string $slug = 'servers/{server}/php';

    protected static bool $shouldRegisterNavigation = false;

    protected static ?string $title = 'PHP';

    public Server $server;

    public static function canAccess(): bool
    {
        return auth()->user()?->can('viewAny', [Service::class, static::getServerFromRoute()]) ?? false;
    }

    public function getWidgets(): array
    {
        return [
            [PHPList::class, ['server' => $this->server]],
        ];
    }

    protected function getHeaderActions(): array
    {
        $phps = [];
        foreach (config('core.php_versions') as $version) {
            if (! $this->server->service('php', $version) && $version !== 'none') {
                $phps[] = Action::make($version)
                    ->label($version)
                    ->requiresConfirmation()
                    ->modalHeading('Install PHP '.$version)
                    ->modalSubmitActionLabel('Install')
                    ->action(function () use ($version) {
                        app(InstallNewPHP::class)->install($this->server, ['version' => $version]);

                        $this->dispatch('$refresh');
                    });
            }
        }

        return [
            ActionGroup::make($phps)
                ->authorize(fn () => auth()->user()?->can('create', [Service::class, $this->server]))
                ->label('Install PHP')
                ->icon('heroicon-o-chevron-up-down')
                ->iconPosition(IconPosition::After)
                ->dropdownPlacement('bottom-end')
                ->color('primary')
                ->button(),
        ];
    }
}