<?php

namespace App\Http\Controllers;

use App\Actions\Site\UpdateAliases;
use App\Actions\Site\UpdateSourceControl;
use App\Facades\Toast;
use App\Helpers\HtmxResponse;
use App\Models\Server;
use App\Models\Site;
use App\SSH\Services\Webserver\Webserver;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Throwable;

class SiteSettingController extends Controller
{
    public function index(Server $server, Site $site): View
    {
        $this->authorize('manage', $server);

        return view('site-settings.index', [
            'server' => $server,
            'site' => $site,
        ]);
    }

    public function getVhost(Server $server, Site $site): RedirectResponse
    {
        $this->authorize('manage', $server);

        /** @var Webserver $handler */
        $handler = $server->webserver()->handler();

        return back()->with('vhost', $handler->getVHost($site));
    }

    public function updateVhost(Server $server, Site $site, Request $request): RedirectResponse
    {
        $this->authorize('manage', $server);

        $this->validate($request, [
            'vhost' => 'required|string',
        ]);

        try {
            /** @var Webserver $handler */
            $handler = $server->webserver()->handler();
            $handler->updateVHost($site, false, $request->input('vhost'));

            Toast::success('VHost updated successfully!');
        } catch (Throwable $e) {
            Toast::error($e->getMessage());
        }

        return back();
    }

    public function updatePHPVersion(Server $server, Site $site, Request $request): HtmxResponse
    {
        $this->authorize('manage', $server);

        $this->validate($request, [
            'version' => [
                'required',
                Rule::exists('services', 'version')->where('type', 'php'),
            ],
        ]);

        try {
            $site->changePHPVersion($request->input('version'));

            Toast::success('PHP version updated successfully!');
        } catch (Throwable $e) {
            Toast::error($e->getMessage());
        }

        return htmx()->back();
    }

    public function updateSourceControl(Server $server, Site $site, Request $request): HtmxResponse
    {
        $this->authorize('manage', $server);

        app(UpdateSourceControl::class)->update($site, $request->input());

        Toast::success('Source control updated successfully!');

        return htmx()->back();
    }

    public function updateAliases(Server $server, Site $site, Request $request): HtmxResponse
    {
        $this->authorize('manage', $server);

        app(UpdateAliases::class)->update($site, $request->input());

        Toast::success('Aliases updated successfully!');

        return htmx()->back();
    }
}