<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\$MODEL$;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Validator;

class $NAME$ extends Controller
{

    // used for insert & update
    public $validation = [$VALIDATION$
    ];


    public function index()
    {
        // $IF_HAS_PARENT$$parentId$END_HAS_PARENT$

        $order = request()->input('order', 'desc');
        $orderBy = request()->input('by', '$PRIMARY_KEY$');

        $items = $MODEL$::orderBy($orderBy, $order)
            ->where(array_filter(request()->input('filter',[])))
            ->paginate(20);

        if(request()->expectsJson()) {
            return $items->toArray();
        }
        return view('$VIEW_FOLDER$.index')
            ->withItems($items)
            ->withPage(request()->input('page', 1))
            ->withOrder($order)
            ->withOrderBy($orderBy)$IF_HAS_PARENT$
            ->withParent($parentId)$END_HAS_PARENT$;
    }


    public function create($IF_HAS_PARENT$$parentId$END_HAS_PARENT$)
    {
        return view('$VIEW_FOLDER$.create')$IF_HAS_PARENT$->withParent($parentId)$END_HAS_PARENT$;
    }


    public function store($IF_HAS_PARENT$$parentId$END_HAS_PARENT$)
    {
        $validator = Validator::make(request()->all(), $this->validation);
        if ($validator->fails()) {
            if (request()->expectsJson()) {
                // $errorMessages = $validator->errors()->all();
            } else {
                return redirect()->back()->withInput(request()->input())->withErrors($validator->errors());
            }
        }

        $input = request()->all();
        $item = new $MODEL$;
        $item->fill($input);

$FILE_UPLOAD$

        // insert empty as null
$SET_EMPTY_AS_NULL$



        try{
            $item->save();
        }
        catch(QueryException $e){
            return redirect()->back()->withInput(request()->input())->withErrors($e->getMessage());
        }

        $SET_MANY_TO_MANY$

        request()->session()->put('highlight', $item->id);

        // in modal, after insert redirect to edit form
        Session::flash('flash_message', 'Item successfully added!');
        return redirect()->route('$VIEW_FOLDER$.edit', [$item->id]);

        // return redirect()->route('$VIEW_FOLDER$.index'$IF_HAS_PARENT$, [$parentId]$END_HAS_PARENT$); // go to index
    }


    public function show($id)
    {
        return view('$VIEW_FOLDER$.view')->withItem($MODEL$::findOrFail($id))$IF_HAS_PARENT$->withParent($parentId)$END_HAS_PARENT$;
    }


    public function edit($IF_HAS_PARENT$$parentId, $END_HAS_PARENT$$id)
    {
        return view('$VIEW_FOLDER$.edit')->withItem($MODEL$::findOrFail($id))$IF_HAS_PARENT$->withParent($parentId)$END_HAS_PARENT$;
    }


    public function update($IF_HAS_PARENT$$parentId, $END_HAS_PARENT$$id)
    {

        $item = $MODEL$::findOrFail($id);

        $validator = Validator::make(request()->all(), $this->validation);
        if ($validator->fails()) {
            if (request()->expectsJson()) {
                // $errorMessages = $validator->errors()->all();
            } else {
                return redirect()->back()->withInput(request()->input())->withErrors($validator->errors());
            }
        }

        $input = request()->all();
        $item->fill($input);

$FILE_UPLOAD$

        // insert empty as null
$SET_EMPTY_AS_NULL$



        try{
            $item->save();
        }
        catch(QueryException $e){
            return redirect()->back()->withInput(request()->input())->withErrors($e->getMessage());
        }

        $SET_MANY_TO_MANY$

        // Session::flash('flash_message', 'Item successfully edited!');
        request()->session()->put('highlight', $item->id);
        // return redirect()->route('$VIEW_FOLDER$.index'$IF_HAS_PARENT$, [$parentId]$END_HAS_PARENT$);

        Session::flash('flash_message', 'Item successfully edited!');
        return redirect()->back()->withItem($item);


    }


    public function destroy($IF_HAS_PARENT$$parentId, $END_HAS_PARENT$$id)
    {
        $item = $MODEL$::findOrFail($id);
        $ON_DESTROY_DELETE_FILES$
        $item->delete();
        Session::flash('flash_message', 'Item successfully deleted!');
        return redirect()->route('$VIEW_FOLDER$.index'$IF_HAS_PARENT$, [$parentId]$END_HAS_PARENT$);
    }


}
