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

namespace App\Http\Controllers\Admin\Settings;

use App\Enums\ViewPaths\Admin\FileManager;
use App\Http\Controllers\BaseController;
use App\Http\Requests\Admin\FileManagerUploadRequest;
use App\Services\FileManagerService;
use Brian2694\Toastr\Facades\Toastr;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\StreamedResponse;

class FileManagerController extends BaseController
{

    public function __construct(private readonly FileManagerService $fileManagerService)
    {
    }

    /**
     * @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->getFoldersView();
    }

    public function getFoldersView($folderPath = "cHVibGlj"): View
    {
        $file = Storage::files(base64_decode($folderPath));
        $directories = Storage::directories(base64_decode($folderPath));
        $folders = $this->fileManagerService->formatFileAndFolders(files: $directories, type: 'folder');
        $files = $this->fileManagerService->formatFileAndFolders(files: $file, type: 'file');
        $data = array_merge($folders, $files);
        $currentFolder = explode('/', base64_decode($folderPath));
        $previousFolder = str_replace('/'.end($currentFolder), '', base64_decode($folderPath));

        return view(FileManager::VIEW[VIEW], compact('data', 'folderPath', 'currentFolder', 'previousFolder'));
    }

    public function upload(FileManagerUploadRequest $request, FileManagerService $fileManagerService): RedirectResponse
    {
        if (env('APP_MODE') == 'demo') {
            Toastr::info(translate('This_option_is_disabled_for_demo'));
            return back();
        }
        $fileManagerService->uploadImages(request: $request);
        Toastr::success(translate('image_uploaded_successfully'));
        return back()->with('success', translate('image_uploaded_successfully'));
    }

    public function download($fileName): StreamedResponse
    {
        return Storage::download(base64_decode($fileName));
    }
}