<?php

namespace {{ namespace }};

use {{ namespacedModel }};
use Illuminate\Http\Request;
use {{ rootNamespace }}Http\Requests\Dashboard\{{ model }}\{{ model }}Request;
use {{ rootNamespace }}Http\Controllers\Base\BaseController;
use {{ rootNamespace }}Repositories\{{ model }}\{{ model }}RepositoryInterface;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;

class {{ class }} extends BaseController
{
    /**
         * @var {{ model }}RepositoryInterface
         */
        protected $repository;

        /**
         * {{ model }}Controller constructor.
         * @param {{ model }}RepositoryInterface ${{ modelVariable }}Repository
         */
        public function __construct({{ model }}RepositoryInterface ${{ modelVariable }}Repository)
        {

            $this->repository = ${{ modelVariable }}Repository;
        }

        /**
         * @return Application|Factory|View
         */
        public function index()
        {
            if (request()->ajax() && request()->has('draw')) {
                return $this->datatable();
            }
            $columns = $this->repository->filteredColumns();
            return view('dashboard.{{ modelVariable }}.index', compact('columns'));
        }

        /**
         * @return mixed
         */
        public function datatable()
        {

            return $this->repository->datatable()
            /*
                ->editColumn('active', function (Model $model) {
                    $url = route('dashboard.{{ modelVariable }}.toggle.active', $model);
                    return \view('actions.active', compact('model', 'url'));
                })
                ->editColumn('description', function (Model $model) {
                    return \view('actions.description', compact('model'));
                })->editColumn('category_id', function (Model $model) {
                    $url = route('dashboard.{{ modelVariable }}.update', $model);
                    return \view('actions.select_category', compact('model', 'url'));
                })
                ->editColumn('image', function (Model $model) {
                    return \view('actions.image', ['avatars' => $model->image, 'model' => $model]);
                })
                */
                ->addColumn('action', function ($model) {
                    $routeDelete = route('dashboard.{{ modelVariable }}.destroy', $model);
                    $routeUpdate = route('dashboard.{{ modelVariable }}.edit', $model);
                    $id = $model->id;
                    return view('actions.action', compact('model', 'routeDelete', 'routeUpdate', 'id'));
                })
                ->toJson();
        }

        /**
         * @return Factory|View
         */
        public function create()
        {
            ${{ modelVariable }} = new {{ model }}();
            return view('dashboard.{{ modelVariable }}.create', compact('{{ modelVariable }}'));
        }

        /**
         * @param {{ model }} ${{ modelVariable }}
         * @return Factory|View
         */
        public function edit({{ model }} ${{ modelVariable }})
        {
            $edit = true;
            return view('dashboard.{{ modelVariable }}.create', compact('{{ modelVariable }}', 'edit'));
        }

        /**
         * @param {{ model }} ${{ modelVariable }}
         * @return Factory|View
         */
        public function show({{ model }} ${{ modelVariable }})
        {
            return view('dashboard.{{ modelVariable }}.show', compact('{{ modelVariable }}'));
        }

        /**
         * @param {{ model }}Request $request
         * @return RedirectResponse
         */
        public function store({{ model }}Request $request)
        {
            $this->repository->create($request->validated());
            alert()->success(__('main.{{ modelVariable }}'), __('main.created'));
            return back();
        }

        /**
         * @param {{ model }}Request $request
         * @param {{ model }} ${{ modelVariable }}
         * @return JsonResponse|RedirectResponse
         */
        public function update({{ model }}Request $request, {{ model }} ${{ modelVariable }})
        {
            $this->repository->updateModel(${{ modelVariable }}, $request->validated());
            if (request()->ajax()) {
                return response()->json(['message' => __('main.updated')]);
            }
            alert()->success(__('main.{{ modelVariable }}'), __('main.updated'));
            return back();
        }

        public function toggleActiveStatus({{ model }} ${{ modelVariable }})
        {
            ${{ modelVariable }}->update(['active' => !${{ modelVariable }}->active]);
            if (request()->ajax()) {
                return response()->json([
                    "message" => ${{ modelVariable }}->active ? __('main.active') : __('main.not_active')
                ]);
            }
            return back();
        }

        /**
         * @param {{ model }} ${{ modelVariable }}
         * @return RedirectResponse
         */
        public function destroy({{ model }} ${{ modelVariable }})
        {
            $this->repository->deleteModel(${{ modelVariable }});

            alert()->success(__('main.{{ modelVariable }}'), __('main.deleted'));
            return back();
        }

}
