<?php

namespace $NAMESPACE_CONTROLLER$;

use $NAMESPACE_DATATABLES$\$MODEL_NAME$DataTable;
use $NAMESPACE_REQUEST$\Create$MODEL_NAME$Request;
use $NAMESPACE_REQUEST$\Update$MODEL_NAME$Request;
use $NAMESPACE_REPOSITORY$\$MODEL_NAME$Repository;
use App\Repositories\CustomFieldRepository;
$ADD_USED$
use Exception;
use Flash;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Response;
use Illuminate\View\View;
use Prettus\Validator\Exceptions\ValidatorException;

class $MODEL_NAME$Controller extends Controller
{
    /** @var  $MODEL_NAME$Repository */
    private $$MODEL_NAME_CAMEL$Repository;

    /**
     * @var CustomFieldRepository
     */
    private $customFieldRepository;

    $ADD_ATTR$

    public function __construct($MODEL_NAME$Repository $$MODEL_NAME_CAMEL$Repo, CustomFieldRepository $customFieldRepo $ADD_ATTR_PARAM$)
    {
        parent::__construct();
        $this->$MODEL_NAME_CAMEL$Repository = $$MODEL_NAME_CAMEL$Repo;
        $this->customFieldRepository = $customFieldRepo;
        $ADD_ATTR_INIT$
    }

    /**
     * Display a listing of the $MODEL_NAME$.
     *
     * @param $MODEL_NAME$DataTable $$MODEL_NAME_CAMEL$DataTable
     * @return Response
     */
    public function index($MODEL_NAME$DataTable $$MODEL_NAME_CAMEL$DataTable)
    {
        return $$MODEL_NAME_CAMEL$DataTable->render('$VIEW_PREFIX$$MODEL_NAME_PLURAL_SNAKE$.index');
    }

    /**
     * Show the form for creating a new $MODEL_NAME$.
     *
     * @return Application|Factory|Response|View
     */
    public function create()
    {
        $SELECT_RELATIONS$
        $SELECTED_RELATIONS_ADD$
        $hasCustomField = in_array($this->$MODEL_NAME_CAMEL$Repository->model(),setting('custom_field_models',[]));
            if($hasCustomField){
                $customFields = $this->customFieldRepository->findByField('custom_field_model', $this->$MODEL_NAME_CAMEL$Repository->model());
                $html = generateCustomField($customFields);
            }
        return view('$VIEW_PREFIX$$MODEL_NAME_PLURAL_SNAKE$.create')->with("customFields", isset($html) ? $html : false)$SELECT_RELATIONS_PARAM$;
    }

    /**
     * Store a newly created $MODEL_NAME$ in storage.
     *
     * @param Create$MODEL_NAME$Request $request
     *
     * @return Application|RedirectResponse|Redirector|Response
     */
    public function store(Create$MODEL_NAME$Request $request)
    {
        $input = $request->all();
        $customFields = $this->customFieldRepository->findByField('custom_field_model', $this->$MODEL_NAME_CAMEL$Repository->model());
        try {
            $$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->create($input);
            $$MODEL_NAME_CAMEL$->customFieldsValues()->createMany(getCustomFieldsValues($customFields,$request));
            $MEDIA_COLUMNS$
        } catch (ValidatorException $e) {
            Flash::error($e->getMessage());
        }

        Flash::success(__('lang.saved_successfully',['operator' => __('lang.$MODEL_NAME_SNAKE$')]));

        return redirect(route('$ROUTE_NAMED_PREFIX$$MODEL_NAME_PLURAL_CAMEL$.index'));
    }

    /**
     * Display the specified $MODEL_NAME$.
     *
     * @param  int $id
     *
     * @return Application|Factory|Response|View
     */
    public function show($id)
    {
        $$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->findWithoutFail($id);

        if (empty($$MODEL_NAME_CAMEL$)) {
            Flash::error(__('lang.not_found',['operator' => __('lang.$MODEL_NAME_SNAKE$')]));
            return redirect(route('$ROUTE_NAMED_PREFIX$$MODEL_NAME_PLURAL_CAMEL$.index'));
        }
        return view('$VIEW_PREFIX$$MODEL_NAME_PLURAL_SNAKE$.show')->with('$MODEL_NAME_CAMEL$', $$MODEL_NAME_CAMEL$);
    }

    /**
     * Show the form for editing the specified $MODEL_NAME$.
     *
     * @param  int $id
     *
     * @return Application|RedirectResponse|Redirector|Response
     */
    public function edit($id)
    {
        $$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->findWithoutFail($id);
        $SELECT_RELATIONS$
        $SELECTED_RELATIONS_EDIT$

        if (empty($$MODEL_NAME_CAMEL$)) {
            Flash::error(__('lang.not_found',['operator' => __('lang.$MODEL_NAME_SNAKE$')]));

            return redirect(route('$ROUTE_NAMED_PREFIX$$MODEL_NAME_PLURAL_CAMEL$.index'));
        }
        $customFieldsValues = $$MODEL_NAME_CAMEL$->customFieldsValues()->with('customField')->get();
        $customFields =  $this->customFieldRepository->findByField('custom_field_model', $this->$MODEL_NAME_CAMEL$Repository->model());
        $hasCustomField = in_array($this->$MODEL_NAME_CAMEL$Repository->model(),setting('custom_field_models',[]));
        if($hasCustomField) {
            $html = generateCustomField($customFields, $customFieldsValues);
        }
        return view('$VIEW_PREFIX$$MODEL_NAME_PLURAL_SNAKE$.edit')->with('$MODEL_NAME_CAMEL$', $$MODEL_NAME_CAMEL$)->with("customFields", isset($html) ? $html : false)$SELECT_RELATIONS_PARAM$;
    }

    /**
     * Update the specified $MODEL_NAME$ in storage.
     *
     * @param  int              $id
     * @param Update$MODEL_NAME$Request $request
     *
     * @return Application|RedirectResponse|Redirector|Response
     */
    public function update($id, Update$MODEL_NAME$Request $request)
    {
        $$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->findWithoutFail($id);

        if (empty($$MODEL_NAME_CAMEL$)) {
            Flash::error(__('lang.not_found',['operator' => __('lang.$MODEL_NAME_SNAKE$')]));
            return redirect(route('$ROUTE_NAMED_PREFIX$$MODEL_NAME_PLURAL_CAMEL$.index'));
        }
        $input = $request->all();
        $customFields = $this->customFieldRepository->findByField('custom_field_model', $this->$MODEL_NAME_CAMEL$Repository->model());
        try {
            $$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->update($input, $id);
            $SELECTS_RELATIONS_UPDATE$
            $MEDIA_COLUMNS$
            foreach (getCustomFieldsValues($customFields, $request) as $value){
                $$MODEL_NAME_CAMEL$->customFieldsValues()
                    ->updateOrCreate(['custom_field_id'=>$value['custom_field_id']],$value);
            }
        } catch (ValidatorException $e) {
            Flash::error($e->getMessage());
        }
        Flash::success(__('lang.updated_successfully',['operator' => __('lang.$MODEL_NAME_SNAKE$')]));
        return redirect(route('$ROUTE_NAMED_PREFIX$$MODEL_NAME_PLURAL_CAMEL$.index'));
    }

    /**
     * Remove the specified $MODEL_NAME$ from storage.
     *
     * @param  int $id
     *
     * @return Application|RedirectResponse|Redirector|Response
     */
    public function destroy($id)
    {
        $$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->findWithoutFail($id);

        if (empty($$MODEL_NAME_CAMEL$)) {
            Flash::error(__('lang.not_found',['operator' => __('lang.$MODEL_NAME_SNAKE$')]));

            return redirect(route('$ROUTE_NAMED_PREFIX$$MODEL_NAME_PLURAL_CAMEL$.index'));
        }

        $this->$MODEL_NAME_CAMEL$Repository->delete($id);

        Flash::success(__('lang.deleted_successfully',['operator' => __('lang.$MODEL_NAME_SNAKE$')]));
        return redirect(route('$ROUTE_NAMED_PREFIX$$MODEL_NAME_PLURAL_CAMEL$.index'));
    }

    $REMOVE_MEDIA_FUNCTION$
}
