<?php

namespace {{controllerNamespace}};

use {{modelNamespace}}\{{modelName}};
use Illuminate\Http\Request;

/**
 * Class {{modelName}}Controller
 * @package App\Http\Controllers
 */
class {{modelName}}Controller extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        ${{modelNamePluralLowerCase}} = {{modelName}}::paginate();

        return view('{{modelView}}.index', compact('{{modelNamePluralLowerCase}}'))
            ->with('i', (request()->input('page', 1) - 1) * ${{modelNamePluralLowerCase}}->perPage());
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        ${{modelNameLowerCase}} = new {{modelName}}();
        return view('{{modelView}}.create', compact('{{modelNameLowerCase}}'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        request()->validate({{modelName}}::$rules);

        ${{modelNameLowerCase}} = {{modelName}}::create($request->all());

        return redirect()->route('{{modelRoute}}.index')
            ->with('success', '{{modelName}} created successfully.');
    }

    /**
     * Display the specified resource.
     *
     * @param  int $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        ${{modelNameLowerCase}} = {{modelName}}::find($id);

        return view('{{modelView}}.show', compact('{{modelNameLowerCase}}'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        ${{modelNameLowerCase}} = {{modelName}}::find($id);

        return view('{{modelView}}.edit', compact('{{modelNameLowerCase}}'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  {{modelName}} ${{modelNameLowerCase}}
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, {{modelName}} ${{modelNameLowerCase}})
    {
        request()->validate({{modelName}}::$rules);

        ${{modelNameLowerCase}}->update($request->all());

        return redirect()->route('{{modelRoute}}.index')
            ->with('success', '{{modelName}} updated successfully');
    }

    /**
     * @param int $id
     * @return \Illuminate\Http\RedirectResponse
     * @throws \Exception
     */
    public function destroy($id)
    {
        ${{modelNameLowerCase}} = {{modelName}}::find($id)->delete();

        return redirect()->route('{{modelRoute}}.index')
            ->with('success', '{{modelName}} deleted successfully');
    }
}
