<?php
namespace Modules\Admin\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use App\Service\CommonModelService;
use Log;
use Exception;
use Modules\Admin\Models\Districts;

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

        return view("admin::districts.index", compact('data'));
    }

    public function create(Request $request)
    {
        // createActivityLog(DistrictsController::class, 'create', ' Districts create');
        $TableData = Districts::where('status', '<>', -1)->orderBy('display_order')->get();
        $editable = false;
        return view("admin::districts.edit", compact('TableData', 'editable'));
    }

    public function store(Request $request)
    {
        // createActivityLog(DistrictsController::class, 'store', ' Districts store');
        $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_districts')]);
        $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(DistrictsController::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 Districts Created Successfully.'], 200);
        }
        return redirect()->route('districts.index')->with('success', 'The Districts created Successfully.');
    }

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

        foreach ($idOrder as $index => $id) {
            $companyArticle = Districts::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 = Districts::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)
    {
        // createActivityLog(DistrictsController::class, 'show', ' Districts show');
        $data = Districts::findOrFail($id);

        return view("admin::districts.show", compact('data'));
    }


    public function edit(Request $request, $id)
    {
        // createActivityLog(DistrictsController::class, 'edit', ' Districts edit');
        $TableData = Districts::where('status', '<>', -1)->orderBy('display_order')->get();
        $data = Districts::findOrFail($id);
        $editable = true;
        return view("admin::districts.edit", compact('data', 'TableData', 'editable'));
    }


    public function update(Request $request, $id)
    {
        // createActivityLog(DistrictsController::class, 'update', ' Districts update');
        $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('district_id'));
        } catch (Exception $e) {
            DB::rollBack();
            Log::info($e->getMessage());
            createErrorLog(DistrictsController::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 Districts updated Successfully.'], 200);
        }
        // return redirect()->route('districts.index')->with('success','The Districts updated Successfully.');
        return redirect()->back()->with('success', 'The  Districts  updated successfully.');
    }

    public function destroy(Request $request, $id)
    {
        // createActivityLog(DistrictsController::class, 'destroy', ' Districts destroy');
        DB::beginTransaction();
        try {
            $OperationNumber = getOperationNumber();
            $this->modelService->destroy($OperationNumber, $OperationNumber, $id);
        } catch (Exception $e) {
            DB::rollBack();
            Log::info($e->getMessage());
            createErrorLog(DistrictsController::class, 'destroy', $e->getMessage());
            return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
        }
        DB::commit();
        return response()->json(['status' => true, 'message' => 'The Districts Deleted Successfully.'], 200);
    }
    public function toggle(Request $request, $id)
    {
        // createActivityLog(DistrictsController::class, 'destroy', ' Districts destroy');
        $data = Districts::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(DistrictsController::class, 'destroy', $e->getMessage());
            return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
        }
        DB::commit();
        return response()->json(['status' => true, 'message' => 'The Districts Deleted Successfully.'], 200);
    }
    public function clone(Request $request, $id)
    {
        // createActivityLog(DistrictsController::class, 'clone', ' Districts clone');
        $data = Districts::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(DistrictsController::class, 'clone', $e->getMessage());
            return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
        }
        DB::commit();
        return response()->json(['status' => true, 'message' => 'The Districts Clonned Successfully.'], 200);
    }



}