<?php

namespace Modules\Develop\Http\Controllers;

use Catch\Base\CatchController;
use Catch\Contracts\ModuleRepositoryInterface;
use Catch\Exceptions\FailedException;
use Catch\Support\Module\ModuleRepository;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Storage;
use Modules\Develop\Support\ModuleInstall;

class ModuleController extends CatchController
{
    protected ModuleRepository $repository;

    /**
     * @param ModuleRepository $repository
     */
    public function __construct(ModuleRepository $repository)
    {
        $this->repository = $repository;
    }

    /**
     * index
     *
     * @param Request $request
     * @return Collection
     */
    public function index(Request $request): Collection
    {
        return $this->repository->all($request->all());
    }

    /**
     * store
     *
     * @param Request $request
     * @return bool|int
     */
    public function store(Request $request): bool|int
    {
        return $this->repository->create($request->all());
    }

    /**
     * show
     *
     * @param string $name
     * @return Collection
     * @throws \Exception
     */
    public function show(mixed $name): Collection
    {
        return $this->repository->show($name);
    }

    /**
     * update
     *
     * @param $name
     * @param Request $request
     * @return bool|int
     */
    public function update($name, Request $request): bool|int
    {
        return $this->repository->update($name, $request->all());
    }


    /**
     * update
     *
     * @param $name
     * @return bool|int
     */
    public function enable($name): bool|int
    {
        return $this->repository->disOrEnable($name);
    }

    /**
     * destroy
     *
     * @param $name
     * @return bool|int
     * @throws \Exception
     */
    public function destroy($name): bool|int
    {
        return $this->repository->delete($name);
    }

    /**
     * install
     *
     * @param Request $request
     * @param ModuleRepositoryInterface $moduleRepository
     * @return true
     */
    public function install(Request $request, ModuleRepositoryInterface $moduleRepository)
    {
        if ($moduleRepository->all()->pluck('name')->contains($request->get('title'))) {
            throw new FailedException('模块已安装，无法再次安装');
        }

        $moduleInstall = new ModuleInstall($request->get('type'));

        $moduleInstall->install($request->all());

        return true;
    }

    /**
     * upload
     *
     * @param Request $request
     * @return string
     */
    public function upload(Request $request)
    {   $file = $request->file('file');

        Storage::build([
            'driver' => 'local',
            'root' => storage_path('app')
        ])->put($file->getClientOriginalName(), $file->getContent());

        return storage_path('app') . DIRECTORY_SEPARATOR . $file->getClientOriginalName();
    }
}
