<?php

namespace Lucent\Http\Controller;

use App\Http\Controllers\Controller;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Lucent\Account\AccountService;
use Lucent\Channel\ChannelService;
use Lucent\LucentException;
use Lucent\Setup\Data\SetupStep;
use Lucent\Setup\Data\SetupStepStatus;
use Lucent\Setup\Setup;
use Lucent\Setup\Step\ComposerStep;
use Lucent\Setup\Step\DatabaseSetupStep;
use Lucent\Setup\Step\IStep;
use Lucent\Setup\Step\LaravelEnvStep;
use Lucent\Setup\Step\LucentConfigStep;
use Lucent\Setup\Step\StorageLinkSetupStep;
use Lucent\Setup\Step\StorageSetupStep;
use Lucent\Svelte\Svelte;
use function Lucent\Response\fail;
use function Lucent\Response\ok;


class SetupController
{
    public function __construct(
        private readonly AccountService $accountService,
        private readonly ChannelService $channelService,
        private readonly Svelte         $svelte,
    )
    {

    }

    public function setup(Request $request): View|RedirectResponse
    {


        $steps = array_reduce([
            new ComposerStep,
            new LucentConfigStep,
            new LaravelEnvStep,
            new StorageSetupStep,
            new StorageLinkSetupStep,
            new DatabaseSetupStep,
        ], fn(array $carry, IStep $setupStep) => array_merge($carry, [$setupStep()]), []);
        $allSuccess = array_reduce($steps, fn(bool $carry, SetupStep $step) => !$carry ? false : $step->status === SetupStepStatus::SUCCESS, true);

        if($allSuccess){
            if ($this->accountService->countUsers() > 0) {
                return redirect($this->channelService->channel->lucentUrl . "/login");
            }
        }

        return $this->svelte->render(
            layout: "account",
            view: "setup",
            title: "Setup Lucent",
            data: [
                "steps" => $steps,
                "allSuccess" => $allSuccess,
            ]

        );
    }


}
