<?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 Yajra\DataTables\DataTables;
use {{namespace}}\{{moduleName}}\Http\Requests\{{moduleName}}Request;
use App\Trait\ModuleTrait;

class {{moduleNamePlural}}Controller extends Controller
{
    protected string $exportClass = '\App\Exports\{{moduleName}}Export';

    use ModuleTrait {
        initializeModuleTrait as private traitInitializeModuleTrait;
        }

    public function __construct()
    {
        $this->traitInitializeModuleTrait(
            '{{moduleNameLower}}.title', // module title
            '{{moduleNameLowerPlural}}', // module name
            'fa-solid fa-clipboard-list' // module icon
        );
    }

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */

    public function index(Request $request)
    {
        $filter = [
            'status' => $request->status,
        ];

        $module_action = 'List';

        $export_import = true;
        $export_columns = [
            [
                'value' => 'name',
                'text' => ' Name',
            ]
        ];
        $export_url = route('backend.{{moduleNameLowerPlural}}.export');

        return view('{{moduleNameLower}}::backend.{{moduleNameLower}}.index', compact('module_action', 'filter', 'export_import', 'export_columns', 'export_url'));
    }

    public function bulk_action(Request $request)
    {
        $ids = explode(',', $request->rowIds);
        $actionType = $request->action_type;
        $moduleName = '{{moduleName}}'; // Adjust as necessary for dynamic use
        $messageKey = __('{{moduleName}}.Post_status'); // You might want to adjust this based on the action

        return $this->performBulkAction({{moduleName}}::class, $ids, $actionType, $messageKey, $moduleName);
    }

    public function index_data(Datatables $datatable, Request $request)
    {
        $query = {{moduleName}}::query()->withTrashed();

        $filter = $request->filter;

        if (isset($filter['name'])) {
            $query->where('name', $filter['name']);
        }

        return $datatable->eloquent($query)
          ->editColumn('name', fn($data) => $data->name)
          ->addColumn('check', function ($data) {
              return '<input type="checkbox" class="form-check-input select-table-row"  id="datatable-row-'.$data->id.'"  name="datatable_ids[]" value="'.$data->id.'" onclick="dataTableRowCheck('.$data->id.')">';
          })
          ->addColumn('action', function ($data) {
              return view('{{moduleNameLower}}::backend.{{moduleNameLower}}.action', compact('data'));
          })
          ->editColumn('status', function ($data) {
              return $data->getStatusLabelAttribute();
          })
          ->editColumn('updated_at', fn($data) => formatUpdatedAt($data->updated_at))
          ->rawColumns(['action', 'status', 'check'])
          ->orderColumns(['id'], '-:column $1')
          ->make(true);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  Request  $request
     * @return Response
     */

      public function create()
    {
      return view('{{moduleNameLower}}::backend.{{moduleNameLower}}.create');
    }

    public function store({{moduleName}}Request $request)
    {
        $data = $request->all();
        ${{moduleNameLower}} = {{moduleName}}::create($data);

        return redirect()->route('backend.{{moduleNameLowerPlural}}.index', ${{moduleNameLower}}->id)->with('success', '${{moduleNameLower}} Added Successfully');

    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function edit($id)
    {
        $data = {{moduleName}}::findOrFail($id);
    return view('{{moduleNameLower}}::backend.{{moduleNameLower}}.edit', compact('data'));

    }

    /**
     * Update the specified resource in storage.
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function update({{moduleName}}Request $request, {{moduleName}} ${{moduleNameLower}})
    {
        $requestData = $request->all();
        ${{moduleNameLower}}->update($requestData);

        return redirect()->route('backend.{{moduleNameLowerPlural}}.index', ${{moduleNameLower}}->id)->with('success', '{{moduleName}} Updated Successfully');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return Response
     */

    public function destroy($id)
    {
        $data = {{moduleName}}::findOrFail($id);
        $data->delete();
        $message = __('Taxes Deleted Successfully');
        return response()->json(['message' =>  $message, 'type' => 'DELETE_FORM']);
    }

    public function restore($id)
    {
        $data = {{moduleName}}::withTrashed()->findOrFail($id);
        $data->restore();
        return response()->json(['message' => 'Tax entry restored successfully']);
    }

    public function forceDelete($id)
    {
        $data = {{moduleName}}::withTrashed()->findOrFail($id);
        $data->forceDelete();
        return response()->json(['message' => 'Tax entry permanently deleted']);
    }
}
