<?php

namespace {{namespace}}\{{moduleName}}\Http\Controllers\Backend;

use App\Authorizable;
use App\Http\Controllers\Controller;
use {{namespace}}\{{moduleName}}\Models\{{moduleName}};
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Yajra\DataTables\DataTables;
use Carbon\Carbon;

class {{moduleNamePlural}}Controller extends Controller
{
    // use Authorizable;

    public function __construct()
    {
        // Page Title
        $this->module_title = '{{moduleNamePlural}}';

        // module name
        $this->module_name = '{{moduleNameLowerPlural}}';

        // directory path of the module
        $this->module_path = '{{moduleNameLower}}::backend';

        view()->share([
          'module_title' => $this->module_title,
          'module_icon' => 'fa-regular fa-sun',
          'module_name' => $this->module_name,
          'module_path' => $this->module_path,
      ]);
    }

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        $module_action = 'List';

        return view('{{moduleNameLower}}::backend.{{moduleNameLowerPlural}}.index_datatable',  compact('module_action'));
    }

    /**
     * Select Options for Select 2 Request/ Response.
     *
     * @return Response
     */
    public function index_list(Request $request)
    {
        $term = trim($request->q);

        if (empty($term)) {
            return response()->json([]);
        }

        $query_data = {{moduleName}}::where('name', 'LIKE', "%$term%")->orWhere('slug', 'LIKE', "%$term%")->limit(7)->get();

        $data = [];

        foreach ($query_data as $row) {
            $data[] = [
                'id' => $row->id,
                'text' => $row->name.' (Slug: '.$row->slug.')',
            ];
        }
        return response()->json($data);
    }

    public function index_data()
    {
        $query = {{moduleName}}::query();

        return Datatables::of($query)
                        ->addColumn('action', function ($data) {
                            return view('{{moduleNameLower}}::backend.{{moduleNameLowerPlural}}.action_column', compact('data'));
                        })
                        ->editColumn('status', function ($data) {
                            return $data->getStatusLabelAttribute();
                        })
                        ->editColumn('updated_at', function ($data) {
                            $module_name = $this->module_name;

                            $diff = Carbon::now()->diffInHours($data->updated_at);

                            if ($diff < 25) {
                                return $data->updated_at->diffForHumans();
                            } else {
                                return $data->updated_at->isoFormat('llll');
                            }
                        })
                        ->rawColumns(['action', 'status'])
                        ->orderColumns(['id'], '-:column $1')
                        ->make(true);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function create()
    {
        $module_action = 'Create';

        return view('{{moduleNameLower}}::backend.{{moduleNameLowerPlural}}.create', compact('module_action'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        $data = {{moduleName}}::create($request->all());

        $message = 'New '.Str::singular({{moduleNamePlural}}).' Added';

       if (request()->wantsJson()) {
            return response()->json(['message' => $message, 'status' => true], 200);
        } else {
            flash("<i class='fas fa-check'></i> $message")->success()->important();

            return redirect("app/notification/$this->module_name");
        }
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        $module_action = 'Show';

        $data = {{moduleName}}::findOrFail($id);

        return view('{{moduleNameLower}}::backend.{{moduleNameLowerPlural}}.show', compact('module_action', "$data"));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function edit($id)
    {
        $module_action = 'Edit';

        $data = {{moduleName}}::findOrFail($id);

        if (request()->wantsJson()) {
            return response()->json(['data' => $$module_name_singular, 'status' => true]);
        } else {
            return view('{{moduleNameLower}}::backend.{{moduleNameLowerPlural}}.edit', compact('module_action', "$data"));
        }
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        $data = {{moduleName}}::findOrFail($id);

        $data->update($request->all());

        $message = Str::singular({{moduleNamePlural}}).' Updated Successfully';

        if (request()->wantsJson()) {
            return response()->json(['message' => $message, 'status' => true], 200);
        } else {
            flash("<i class='fas fa-check'></i> $message")->success()->important();

            return redirect()->route("backend.{{moduleNameLowerPlural}}.show", $data->id);
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function destroy($id)
    {
        $data = {{moduleName}}::findOrFail($id);

        $data->delete();

        $message = Str::singular({{moduleNamePlural}}).' Deleted Successfully';

        if (request()->wantsJson()) {
            return response()->json(['message' => $message, 'status' => true], 200);
        } else {
            flash('<i class="fas fa-check"></i> '.label_case($this->module_name).' Deleted Successfully!')->success()->important();

            return redirect("app//notification/$this->module_name");
        }
    }

    /**
     * List of trashed ertries
     * works if the softdelete is enabled.
     *
     * @return Response
     */
    public function trashed()
    {
        $module_name = $this->module_name;

        $module_name_singular = Str::singular($module_name);

        $module_action = 'Trash List';

        $data = {{moduleName}}::onlyTrashed()->orderBy('deleted_at', 'desc')->paginate();

        return view('{{moduleNameLower}}::backend.{{moduleNameLowerPlural}}.trash', compact("$data", 'module_name_singular', 'module_action'));
    }

    /**
     * Restore a soft deleted entry.
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function restore($id)
    {
        $module_action = 'Restore';

        $data = {{moduleName}}::withTrashed()->find($id);
        $data->restore();

        $message = Str::singular({{moduleNamePlural}}).'Data Restoreded Successfully !';

        return response()->json(['message' => $message, 'status' => true], 200);
    }

}
