/home/brandsfa/www/app/Http/Controllers/Admin/Settings/AddonController.php
<?php

namespace App\Http\Controllers\Admin\Settings;

use App\Enums\ViewPaths\Admin\AddonSetup;
use App\Http\Controllers\BaseController;
use App\Http\Requests\Admin\AddonRequest;
use App\Services\AddonService;
use Brian2694\Toastr\Facades\Toastr;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\View;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;

class AddonController extends BaseController
{

    /**
     * @param Request|null $request
     * @param string|null $type
     * @return View Index function is the starting point of a controller
     * Index function is the starting point of a controller
     */
    public function index(Request|null $request, string $type = null): View
    {
        return $this->getView();
    }

    public function getView(): View
    {
        $addons = self::getDirectories();
        return view(AddonSetup::VIEW[VIEW], compact('addons'));
    }

    public function publish(Request $request, AddonService $addonService): JsonResponse|int
    {
        $data = $addonService->getPublishData(request: $request);
        return response()->json($data);
    }

    public function activation(Request $request, AddonService $addonService): Redirector|RedirectResponse|Application
    {
        $data = $addonService->getActivationData(request: $request);
        if ($data['status']) {
            Toastr::success(translate('activated_successfully'));
            return back();
        }
        return redirect($data['activationUrl']);
    }

    public function upload(AddonRequest $request, AddonService $addonService): JsonResponse
    {
        $data = $addonService->getUploadData(request: $request);
        return response()->json([
            'status' => $data['status'],
            'message'=> $data['message']
        ]);
    }

    public function delete(Request $request, AddonService $addonService): JsonResponse
    {
        $data = $addonService->deleteAddon(request: $request);
        return response()->json($data);
    }

    function getDirectories(): array
    {
        $scan = scandir(base_path('Modules/'));
        $addonsFolders = array_diff($scan, ['.', '..','.DS_Store']);
        $addons = [];
        foreach ($addonsFolders as $directory) {
            $addons[] = 'Modules/' . $directory;
        }
        return $addons;
    }
}