<?php
        namespace App\Http\Controllers;
        use App\Http\Controllers\Controller;
        use Illuminate\Http\Request;
        use App\Models\Companies;
        use Illuminate\Support\Facades\DB;
        use Illuminate\Support\Facades\Validator;
        use App\Service\CommonModelService;
        use Log;
        use Exception;

        class CompaniesController extends Controller
        {
            protected $modelService;
            public function __construct(Companies $model)
            {
                $this->modelService = new CommonModelService($model);
            }
           public function index(Request $request)
            {
               $data = Companies::where('status','<>',-1)->orderBy('display_order')->get();

                return view("crud.generated.companies.index", compact('data'));
            }

            public function create(Request $request)
            {
               $TableData = Companies::where('status','<>',-1)->orderBy('display_order')->get();
                $editable=false;
                return view("crud.generated.companies.edit",compact('TableData','editable'));
            }

            public function store(Request $request)
            {
               $validator = Validator::make($request->all(), [
                    //ADD REQUIRED FIELDS FOR VALIDATION
                ]);

                if ($validator->fails()) {
                    return response()->json([
                        'error' => $validator->errors(),
                    ],500);
                }
                $request->request->add(['alias' => slugify($request->title)]);
                $request->request->add(['display_order' => getDisplayOrder('tbl_companies')]);
                $request->request->add(['created_at' => date("Y-m-d h:i:s")]);
                $request->request->add(['updated_at' => date("Y-m-d h:i:s")]);
                $requestData=$request->all();
                array_walk_recursive($requestData, function (&$value) {
                    $value = str_replace(env('APP_URL').'/', '', $value);
                });
                array_walk_recursive($requestData, function (&$value) {
                    $value = str_replace(env('APP_URL'), '', $value);
                });
                DB::beginTransaction();
                try {
                    $operationNumber = getOperationNumber();
                    $this->modelService->create($operationNumber, $operationNumber, null, $requestData);
                } catch (\Exception $e) {
                    DB::rollBack();
                    Log::info($e->getMessage());
                    createErrorLog(CompaniesController::class, 'store', $e->getMessage());
                    return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
                }
                DB::commit();
                if ($request->ajax()) {
                    return response()->json(['status' => true, 'message' => 'The Companies Created Successfully.'], 200);
                }
                return redirect()->route('companies.index')->with('success','The Companies created Successfully.');
            }

            public function sort(Request $request)
            {
                $idOrder = $request->input('id_order');

                foreach ($idOrder as $index => $id) {
                    $companyArticle = Companies::find($id);
                    $companyArticle->display_order = $index + 1;
                    $companyArticle->save();
                }

                return response()->json(['status' => true, 'content' => 'The articles sorted successfully.'], 200);
            }
            public function updatealias(Request $request)
            {

                $articleId = $request->input('articleId');
                $newAlias = $request->input('newAlias');
                $companyArticle = Companies::find($articleId);
                if (!$companyArticle) {
                    return response()->json(['status' => false, 'content' => 'Company article not found.'], 404);
                }
                $companyArticle->alias = $newAlias;
                $companyArticle->save();
                return response()->json(['status' => true, 'content' => 'Alias updated successfully.'], 200);
            }




            public function show(Request $request, $id)
            {
               $data = Companies::findOrFail($id);

                return view("crud.generated.companies.show", compact('data'));
            }


            public function edit(Request $request, $id)
            {
               $TableData = Companies::where('status','<>',-1)->orderBy('display_order')->get();
                $data = Companies::findOrFail($id);
                $editable=true;
                return view("crud.generated.companies.edit", compact('data','TableData','editable'));
            }


            public function update(Request $request, $id)
            {
               $validator = Validator::make($request->all(), [
                   //ADD VALIDATION FOR REQIRED FIELDS
                ]);

                if ($validator->fails()) {
                    return response()->json([
                        'error' => $validator->errors(),
                    ],500);
                }
                $requestData=$request->all();
                array_walk_recursive($requestData, function (&$value) {
                    $value = str_replace(env('APP_URL').'/', '', $value);
                });
                array_walk_recursive($requestData, function (&$value) {
                    $value = str_replace(env('APP_URL'), '', $value);
                });
                DB::beginTransaction();
                try {
                    $OperationNumber = getOperationNumber();
                    $this->modelService->update($OperationNumber, $OperationNumber, null, $requestData, $request->input('company_id'));
                } catch (Exception $e) {
                    DB::rollBack();
                    Log::info($e->getMessage());
                    createErrorLog(CompaniesController::class, 'update', $e->getMessage());
                    return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
                }
                DB::commit();
                if ($request->ajax()) {
                    return response()->json(['status' => true, 'message' => 'The Companies updated Successfully.'], 200);
                }
                // return redirect()->route('companies.index')->with('success','The Companies updated Successfully.');
                return redirect()->back()->with('success', 'The  Companies  updated successfully.');
            }

            public function destroy(Request $request,$id)
            {
               DB::beginTransaction();
                try {
                    $OperationNumber = getOperationNumber();
                    $this->modelService->destroy($OperationNumber, $OperationNumber, $id);
                } catch (Exception $e) {
                    DB::rollBack();
                    Log::info($e->getMessage());
                    createErrorLog(CompaniesController::class, 'destroy', $e->getMessage());
                    return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
                }
                DB::commit();
                return response()->json(['status'=>true,'message'=>'The Companies Deleted Successfully.'],200);
            }
            public function toggle(Request $request,$id)
            {
               $data = Companies::findOrFail($id);
                $requestData=['status'=>($data->status==1)?0:1];
                DB::beginTransaction();
                try {
                    $OperationNumber = getOperationNumber();
                    $this->modelService->update($OperationNumber, $OperationNumber, null, $requestData, $id);
                } catch (Exception $e) {
                    DB::rollBack();
                    Log::info($e->getMessage());
                    createErrorLog(CompaniesController::class, 'destroy', $e->getMessage());
                    return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
                }
                DB::commit();
                return response()->json(['status'=>true,'message'=>'The Companies Deleted Successfully.'],200);
            }
            public function clone(Request $request,$id)
            {
               $data = Companies::findOrFail($id);
                unset($data['updatedby']);
                unset($data['createdby']);
                $requestData=$data->toArray();
                DB::beginTransaction();
                try {
                    $OperationNumber = getOperationNumber();
                    $this->modelService->create($OperationNumber, $OperationNumber, null, $requestData);
                } catch (Exception $e) {
                    DB::rollBack();
                    Log::info($e->getMessage());
                    createErrorLog(CompaniesController::class, 'clone', $e->getMessage());
                    return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
                }
                DB::commit();
                return response()->json(['status'=>true,'message'=>'The Companies Clonned Successfully.'],200);
            }



        }