<?php

namespace App\Web\Pages\Settings\Projects;

use App\Actions\Projects\DeleteProject;
use App\Models\Project;
use App\Web\Components\Page;
use App\Web\Pages\Settings\Projects\Widgets\AddUser;
use App\Web\Pages\Settings\Projects\Widgets\ProjectUsersList;
use App\Web\Pages\Settings\Projects\Widgets\UpdateProject;
use Exception;
use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Illuminate\Contracts\Support\Htmlable;

class Settings extends Page
{
    protected static ?string $slug = 'settings/projects/{project}';

    protected static ?string $title = 'Project Settings';

    protected static bool $shouldRegisterNavigation = false;

    public Project $project;

    public function mount(): void
    {
        $this->authorize('update', $this->project);
    }

    public function getWidgets(): array
    {
        return [
            [
                UpdateProject::class,
                ['project' => $this->project],
            ],
            [
                AddUser::class,
                ['project' => $this->project],
            ],
            [
                ProjectUsersList::class,
                ['project' => $this->project],
            ],
        ];
    }

    public function getTitle(): string|Htmlable
    {
        return 'Project Settings';
    }

    protected function getHeaderActions(): array
    {
        return [
            Action::make('delete')
                ->record($this->project)
                ->color('danger')
                ->label('Delete Project')
                ->icon('heroicon-o-trash')
                ->modalHeading('Delete Project')
                ->modalDescription('Are you sure you want to delete this project? This action will delete all associated data and cannot be undone.')
                ->requiresConfirmation()
                ->action(function (Project $record) {
                    try {
                        app(DeleteProject::class)->delete(auth()->user(), $record);

                        Notification::make()
                            ->success()
                            ->title('Project deleted successfully.')
                            ->send();

                        $this->redirect(Index::getUrl());
                    } catch (Exception $e) {
                        Notification::make()
                            ->title($e->getMessage())
                            ->danger()
                            ->send();
                    }
                }),
        ];
    }
}