<?php

namespace App\Http\Controllers\Settings;

use App\Actions\Projects\CreateProject;
use App\Actions\Projects\DeleteProject;
use App\Actions\Projects\UpdateProject;
use App\Facades\Toast;
use App\Helpers\HtmxResponse;
use App\Http\Controllers\Controller;
use App\Models\Project;
use App\Models\User;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;

class ProjectController extends Controller
{
    public function index(): View
    {
        return view('settings.projects.index', [
            'projects' => auth()->user()->projects,
        ]);
    }

    public function create(Request $request): HtmxResponse
    {
        app(CreateProject::class)->create($request->user(), $request->input());

        Toast::success('Project created.');

        return htmx()->redirect(route('projects'));
    }

    public function update(Request $request, Project $project): HtmxResponse
    {
        /** @var Project $project */
        $project = $request->user()->projects()->findOrFail($project->id);

        app(UpdateProject::class)->update($project, $request->input());

        Toast::success('Project updated.');

        return htmx()->redirect(route('projects'));
    }

    public function delete(Project $project): RedirectResponse
    {
        /** @var User $user */
        $user = auth()->user();

        /** @var Project $project */
        $project = $user->projects()->findOrFail($project->id);

        try {
            app(DeleteProject::class)->delete($user, $project);
        } catch (ValidationException $e) {
            Toast::error($e->getMessage());

            return back();
        }

        Toast::success('Project deleted.');

        return back();
    }

    public function switch($projectId): RedirectResponse
    {
        /** @var User $user */
        $user = auth()->user();

        /** @var Project $project */
        $project = $user->projects()->findOrFail($projectId);

        $user->current_project_id = $project->id;
        $user->save();

        return redirect()->route('servers');
    }
}