<?php

namespace App\Http\Controllers\Fastag;

//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);

use App\Http\Controllers\APIBaseController as APIBaseController;
use App\Http\Requests\FASTag\FASTagRequest;
use App\Models\FastagErrorList;
use App\Models\GatePaymentsMapping;
use App\Models\ImageUpload;
use App\Models\Tariff;
use App\Models\TransactionAdditionalCharge;
use App\Models\TaxBreakup;
use App\Models\Area;
use App\Models\GateConfiguration;
use App\Models\Location;
use App\Models\Settings;
use App\Models\ShiftManagement;
use App\Models\StickerMembership;
use App\Models\TransactionDiscount;
use App\Models\User;
use App\Models\Transaction;
use App\Models\FastagEntry;
use App\Models\VehicleTypes;
use App\Models\Voucher;
use App\Models\PaymentModes;
use App\Models\Membership;
use App\Models\Member;
use App\Models\MemberVehicles;
use App\Models\Corporate;

use Carbon\Carbon;
use DB;
use Exception;
use Illuminate\Http\Request;
use Validator;

use Illuminate\Support\Facades\URL;
use DateTime;
use App\Traits\GenerateBarcode;
use App\Traits\CalculateTariff;
use App\Traits\FastagEngineCallAPI;
use Log;

class FastagController extends APIBaseController
{
    use GenerateBarcode, CalculateTariff, FastagEngineCallAPI;

    public $User;
    public $Gate;
    public $GatePayment;
    public $ShiftManagment;
    public $StickerMembership;
    public $FastagEntry;
    public $PaymentMode;
    public $VehicleType;
    public $logPath;
    public $settings;
    public $Tariff;

    public function __construct()
    {
        $this->User = new User();
        $this->Gate = new GateConfiguration();
        $this->GatePayment = new GatePaymentsMapping();
        $this->ShiftManagment = new ShiftManagement();
        $this->StickerMembership = new StickerMembership();
        $this->FastagEntry = new FastagEntry();
        $this->PaymentMode = new PaymentModes();
        $this->VehicleType = new VehicleTypes();
        $this->Tariff = new Tariff();
        $this->settings = Settings::all()->first();
        $this->logPath = storage_path() . '/logs/fastag/';
    }

    public function AddTest(Request $request)
    {
        //Get input request parameters
        $data = array();
        try {
            $input = $request->all();
            return $this->sendFastageResponse($input, 'Successfully');
        } catch (\Exception $e) {
            return $this->sendFastageError('Exception Error.', $e->getMessage(), 422);
        }
    }


    public function storeEntryVehImages($input, $txnid)
    {
        $logMsg = '';
        $successTransactionIdAtEntry = $txnid;

        $entryEnfImage = "enf";  //enf for face image
        $entryEnvImage = "env";  //env for vehicle image
        $entryEncImage = "enc";  //enc for Vehicle Croped Image
        $imageTimestampName = date("YmdHis");
        /*---- transaction id convert to md5 encryption ----*/
        $md5OfTransactionId = md5($successTransactionIdAtEntry);
        //echo "transaction_id:$md5OfTransactionId\n";
        $created_at = date("Y-m-d H:i:s");

        $contentEnf = base64_decode($input['VehicleImage']);  //face image
        $contentEnv = base64_decode($input['DriverImage']); //vehicle image
        $contentEnc = base64_decode($input['vehicleCropedImage']);  //croped image
        $entryFirstImage = 1;
        $entrySecondImage = 1;
        $entryThirdImage = 1;

        if ($entryFirstImage == "NULL" || $entryFirstImage == "-1") {
            $logMsg .= "Image is not captured getting null string for first image \n";

        } else {
            $fullImageNameEnf = $entryEnfImage . "_" . $imageTimestampName . "_" . $successTransactionIdAtEntry;
            $logMsg .= "full image path enf:$fullImageNameEnf\n";
            //$dir = "../storage/images/transactions";
            $dir = storage_path() . '/images/transactions';
            if (!file_exists($dir)) {
                $oldmask = umask(0);  // helpful when used in linux server
                /*---- using mkdir to create a directory if not exists and giving permission ----*/
                mkdir($dir, 0777);
                $fileEnfEntry = storage_path() . "/images/transactions/$fullImageNameEnf.jpg";
                file_put_contents($fileEnfEntry, $contentEnf);
                $logMsg .= "full image path enf1:$fileEnfEntry\n";
            } else {
                $fileEnfEntry = storage_path() . "/images/transactions/$fullImageNameEnf.jpg";
                file_put_contents($fileEnfEntry, $contentEnf);
                $logMsg .= "full image path enf2:$fileEnfEntry\n";
            }
            $finalImageName = $fullImageNameEnf . ".jpg";
            $logMsg .= "final image path enf:$finalImageName\n";

            $image1 = new ImageUpload();
            $image1->module = 'Entry';
            $image1->module_id = $successTransactionIdAtEntry;
            $image1->file_name = $finalImageName;
            $image1->save();

            if ($image1) {
                $logMsg .= $finalImageName . " inserted successfully\n";
            } else {
                $logMsg .= $finalImageName . " Not inserted successfully\n";
            }
        }




        /*---- image "Null" means unmanned entry and image "-1" means manned entry ----*/
        if ($entrySecondImage == "NULL" || $entrySecondImage == "-1") {
            $logMsg .= "Image is not captured getting null string for second image \n";
        } else {
            $logMsg .= "inside image env\n";
            /*---- creating image name using type of image, timestamp and transaction id ----*/
            $fullImageNameEnvEntry = $entryEnvImage . "_" . $imageTimestampName . "_" . $successTransactionIdAtEntry;
            $dir = storage_path() . "/images/transactions";
            $logMsg .= "full image path env:$fullImageNameEnvEntry\n";
            if (!file_exists($dir)) {

                $oldmask = umask(0);  // helpful when used in linux server

                /*---- using mkdir to create a directory if not exists and giving permission ----*/
                mkdir($dir, 0777);

                /*---- path for creating directory ----*/
                $fileEnvEntry = storage_path() . "/images/transactions/$fullImageNameEnvEntry.jpg";
                file_put_contents($fileEnvEntry, $contentEnv);
                $logMsg .= "full image path env1:$fileEnvEntry\n";
            } else {

                /*---- path for creating directory ----*/
                $fileEnvEntry = storage_path() . "/images/transactions/$fullImageNameEnvEntry.jpg";
                file_put_contents($fileEnvEntry, $contentEnv);
                $logMsg .= "full image path env2:$fileEnvEntry\n";
            }

            $finalImageNameEnv = $fullImageNameEnvEntry . ".jpg";
            $logMsg .= "final image path env:$finalImageNameEnv\n";

            $image2 = new ImageUpload();
            $image2->module = 'Entry';
            $image2->module_id = $successTransactionIdAtEntry;
            $image2->file_name = $finalImageNameEnv;
            $image2->save();

            if ($image2) {
                $logMsg .= $finalImageNameEnv . " inserted successfully\n";
            } else {
                $logMsg .= $finalImageNameEnv . " Not inserted successfully\n";
            }
        }


        /*---- image "Null" means unmanned entry and image "-1" means manned entry ----*/
        if ($entryThirdImage == "NULL" || $entryThirdImage == "-1" || $entryThirdImage == "#") {
            $logMsg .= "Image is not captured getting null string for croped image \n";
        } else {
            $logMsg .= "inside image enc\n";
            /*---- creating image name using type of image, timestamp and transaction id ----*/
            $fullImageNameEncEntry = $entryEncImage . "_" . $imageTimestampName . "_" . $successTransactionIdAtEntry;
            $dir = storage_path() . "/images/transactions";
            $logMsg .= "full image path enc:$fullImageNameEncEntry\n";
            if (!file_exists($dir)) {

                $oldmask = umask(0);  // helpful when used in linux server

                /*---- using mkdir to create a directory if not exists and giving permission ----*/
                mkdir($dir, 0777);

                /*---- path for creating directory ----*/
                $fileEncEntry = storage_path() . "/images/transactions/$fullImageNameEncEntry.bmp";
                file_put_contents($fileEncEntry, $contentEnc);
                $logMsg .= "full image path enc1:$fileEncEntry\n";
            } else {

                /*---- path for creating directory ----*/
                $fileEncEntry = storage_path() . "/images/transactions/$fullImageNameEncEntry.bmp";
                file_put_contents($fileEncEntry, $contentEnc);
                $logMsg .= "full image path enc2:$fileEncEntry\n";
            }

            $finalImageNameEnc = $fullImageNameEncEntry . ".bmp";
            $logMsg .= "final image path enc:$finalImageNameEnc\n";

            $queryEntryEncImages = new ImageUpload();
            $queryEntryEncImages->module = 'Entry';
            $queryEntryEncImages->module_id = $successTransactionIdAtEntry;
            $queryEntryEncImages->file_name = $finalImageNameEnc;
            $queryEntryEncImages->save();

            if ($queryEntryEncImages) {
                $logMsg .= $finalImageNameEnc . " inserted successfully\n";
            } else {
                $logMsg .= $finalImageNameEnc . " Not inserted successfully\n";
            }
        }
        $this->createLog(true, $this->logPath, "FASTag Entry Image", $input, $logMsg);
    }


    public function storeExitVehImages($input, $txnid){


        $logMsg = '';
        $spsTransactionIdExit = $txnid;

        $exitEnfImage = "exf"; //face image
        $exitEnvImage = "exv"; //vehicle image
        $exitEncImage = "exc"; //croped image
        $imageTimestampNameExit = date("YmdHis");
        /*---- transaction id md5 encryption ----*/
        $md5OfTransactionId = md5($spsTransactionIdExit);
        //echo "transaction_id:$md5OfTransactionId\n";
        $created_at = date("Y-m-d H:i:s");
        //if($image != NULL)
        /*---- decoding base64 encoded string into binary string ----*/
        $contentEnvExit = base64_decode($input['VehicleImage']); //vehicle image
        $contentEnfExit = base64_decode($input['DriverImage']); //face image
        $contentEncExit = base64_decode($input['vehicleCropedImage']); //croped image

        $envImageExit = 1;
        $enfImageExit = 1;
        $encImageExit = 1;
        /*---- check for image present or not(vehicle image) ----*/
        if ($envImageExit == "-1" || $envImageExit == "NULL") {
            echo "Image is not captured getting null string for first image \n";
            $finalImageNameExit = "-1";
        } else {
            /*---- creating image name using type of image, timestamp and transaction id ----*/
            $fullImageNameEnv =
                $exitEnvImage .
                "_" .
                $imageTimestampNameExit .
                "_" .
                $spsTransactionIdExit;
            $dir = "../storage/images/transactions";
            /*---- checking if directory is already exists or not ----*/
            if (!file_exists($dir)) {
                $oldmask = umask(0); // helpful when used in linux server

                /*---- using mkdir to create a directory if not exists and giving permission ----*/
                mkdir($dir, 0777);
                $fileEnvExit = storage_path() . "/images/transactions/$fullImageNameEnv.jpg";
                file_put_contents(
                    $fileEnvExit,
                    $contentEnvExit
                );
            } else {
                /*---- if directory name already exists then write image directly to that directory ----*/
                $fileEnvExit = storage_path() . "/images/transactions/$fullImageNameEnv.jpg";
                file_put_contents(
                    $fileEnvExit,
                    $contentEnvExit
                );
            }

            $finalImageNameExit = $fullImageNameEnv . ".jpg";
            //echo "final image of env:$finalImageName\n\n\n\n";

            /*---- Inserting image detail into sps_images table ----*/

            // $queryExitEnvImages = "insert into sps_images(module,module_id,file_name,created_at)values('Exit','$spsTransactionIdExit','$finalImageNameExit','$created_at')";
            // if (mysqli_query($conn, $queryExitEnvImages)) {
            //     //echo "inserted successfully\n";
            // } else {
            //     echo "inserted failed image\n";
            // }

            $image1 = new ImageUpload();
            $image1->module = 'Exit';
            $image1->module_id = $spsTransactionIdExit;
            $image1->file_name = $finalImageNameExit;
            $image1->save();

            if ($image1) {
                $logMsg .= $finalImageNameExit . " inserted successfully\n";
            } else {
                $logMsg .= $finalImageNameExit . " Not inserted successfully\n";
            }


        }
        /*---- check for image present or not(face image) ----*/
        if ($enfImageExit == "-1" || $enfImageExit == "NULL") {
            echo "Image is not captured getting null string for second image\n";
            $finalEnfImageNameExit = "-1";
        } else {
            $fullImageName2 =
                $exitEnfImage .
                "_" .
                $imageTimestampNameExit .
                "_" .
                $spsTransactionIdExit;
            /*---- path for creating directory ----*/
            $dir = "../storage/images/transactions";
            /*---- checking if directory is already exists or not ----*/
            if (!file_exists($dir)) {
                $oldmask = umask(0); // helpful when used in linux server

                /*---- using mkdir to create a directory if not exists and giving permission ----*/
                mkdir($dir, 0777);

                $fileEnfExit = storage_path() . "/images/transactions/$fullImageName2.jpg";
                /*---- writing image to a directory ----*/

                file_put_contents(
                    $fileEnfExit,
                    $contentEnfExit
                );
            } else {
                /*---- if directory name already exists then write image directly to that directory ----*/
                $fileEnfExit = storage_path() . "/images/transactions/$fullImageName2.jpg";
                /*---- writing image to a directory ----*/

                file_put_contents(
                    $fileEnfExit,
                    $contentEnfExit
                );
            }

            $finalEnfImageNameExit = $fullImageName2 . ".jpg";
            //echo "final image of enf:$finalEnfImageNameExit\n\n\n\n\n\n";

            /*---- Inserting image detail into sps_images table ----*/

            // $queryExitEnfImages = "insert into sps_images(module,module_id,file_name,created_at)values('Exit','$spsTransactionIdExit','$finalEnfImageNameExit','$created_at')";
            // if (mysqli_query($conn, $queryExitEnfImages)) {
            //     echo "inserted successfully\n";
            // } else {
            //     echo "Error in inserting images\n";
            // }



            $image1 = new ImageUpload();
            $image1->module = 'Exit';
            $image1->module_id = $spsTransactionIdExit;
            $image1->file_name = $finalEnfImageNameExit;
            $image1->save();

            if ($image1) {
                $logMsg .= $finalEnfImageNameExit . " inserted successfully\n";
            } else {
                $logMsg .= $finalEnfImageNameExit . " Not inserted successfully\n";
            }


        }

        /*---- check for image present or not(vehicle croped image) ----*/
        if (
            $encImageExit == "-1" ||
            $encImageExit == "#" ||
            $encImageExit == "NULL"
        ) {
            echo "Image is not captured getting null string for third image \n";
            $finalEncImageNameExit = "-1";
        } else {
            /*---- creating image name using type of image, timestamp and transaction id ----*/
            $fullImageNameEnc =
                $exitEncImage .
                "_" .
                $imageTimestampNameExit .
                "_" .
                $spsTransactionIdExit;
            $dir = storage_path() . "/images/transactions";
            /*---- checking if directory is already exists or not ----*/
            if (!file_exists($dir)) {
                $oldmask = umask(0); // helpful when used in linux server

                /*---- using mkdir to create a directory if not exists and giving permission ----*/
                mkdir($dir, 0777);
                $fileEncExit = storage_path() . "/images/transactions/$fullImageNameEnc.bmp";
                file_put_contents(
                    $fileEncExit,
                    $contentEncExit
                );
            } else {
                /*---- if directory name already exists then write image directly to that directory ----*/
                $fileEncExit = storage_path() . "/images/transactions/$fullImageNameEnc.bmp";
                file_put_contents(
                    $fileEncExit,
                    $contentEncExit
                );
            }

            $finalEncImageNameExit = $fullImageNameEnc . ".bmp";
            //echo "final image of enc:$finalImageName\n\n\n\n";

            /*---- Inserting image detail into sps_images table ----*/

            // $queryExitEncImages = "insert into sps_images(module,module_id,file_name,created_at)values('Exit','$spsTransactionIdExit','$finalEncImageNameExit','$created_at')";
            // if (mysqli_query($conn, $queryExitEncImages)) {
            //     //echo "inserted successfully\n";
            // } else {
            //     echo "inserted failed image\n";
            // }


            $image1 = new ImageUpload();
            $image1->module = 'Exit';
            $image1->module_id = $spsTransactionIdExit;
            $image1->file_name = $finalEncImageNameExit;
            $image1->save();
            if ($image1) {
                $logMsg .= $finalEncImageNameExit . " inserted successfully\n";
            } else {
                $logMsg .= $finalEncImageNameExit . " Not inserted successfully\n";
            }

        }


    }


    public function storeFastagEntry(FASTagRequest $request)
    {
        $transaction = '';
        $response = [];
        $exception = '';

        try {
            $entryStatus = DB::transaction(function () use (&$request, &$transaction, &$response, &$exception) {
                //Get input request parameters
                try {
                    $input = $request->all();
                    $checkShiftManagement = $this->checkShiftManagementValidation($input);
                    if (!is_array($checkShiftManagement)) {
                        throw new Exception($checkShiftManagement);
                    }

                    $area = $checkShiftManagement['area'];
                    $location = $checkShiftManagement['location'];
                    $gate = $checkShiftManagement['gate'];
                    $userId = $checkShiftManagement['userId'];
                    $shiftId = $checkShiftManagement['shiftId'];
                    $isFastagPayment = $input['isFastagPayment'];
                    $laneId = $input['laneId'];
                    $vehicleNumber = !empty($input['vehicleNumber']) ? $input['vehicleNumber'] : "0";
                    $anprVehicleNumber = !empty($input['vehicleNumber']) ? $input['vehicleNumber'] : "0";

                    //Checking Block vehicle
                    if ($this->FastagEntry->getBlockVehicleDetails($input)) {
                        throw new \Exception('Blocked Vehicle');
                    }

                    // generating barcode
                    $barcode = $input['Barcode'];
                    $checkIfBarcodeExist = Transaction::where('barcode', $barcode)->count();
                    if ($checkIfBarcodeExist > 0) {
                        throw new \Exception('Duplicate entry - ' . $barcode);
                    }


                    //check duplicate vehicle number

                    if(!empty($input['vehicleNumber'])){
                        $checkIfVehicleExist = Transaction::where('vehicle_number', $anprVehicleNumber)->where('out_time', '=', '0000-00-00 00:00:00')->count();
                        //dd(DB::getQueryLog());
                        if ($checkIfVehicleExist > 0) {
                            //throw new \Exception('Duplicate Vehicle entry - ' . $anprVehicleNumber);
                            $anprVehicleNumber = "0";
                            $vehicleNumber = "0";
                        }
                    }

                    $dayTypeEntry = $this->getDaytype($area->area_id, $location->location_id, $input['InTime']);

                    //Payment Mode
                    $paymentMode = $this->PaymentMode->getpaymentModeList(["keyword" => "FASTag", "perpage" => false]);
                    $paymentMode = $paymentMode->toArray();

                    $vehicleType = $this->VehicleType->getVehicleTypeByName("4 Wheeler");
                    if (is_null($vehicleType)) {
                        $vehicleType = 1;
                    } else {
                        $vehicleType = $vehicleType->toArray()['id'];
                    }

                    $inType = 1; // 1 for normal entry, 2 for membership
                    $inTypeId = 0; // 0 for normal entry, 6396907430015851 for membership card
                    $inPaymentMode = isset($paymentMode['data'][0]['id']) ? $paymentMode['data'][0]['id'] : 8;
                    $inMasterPaymentMode = isset($paymentMode['data'][0]['master_id']) ? $paymentMode['data'][0]['master_id'] : 4;


                    $tariff['vehicle_type'] = $vehicleType;
                    $tariff['day_type'] = $dayTypeEntry;
                    $tariff['status'] = 1;

                    $tariffCodeDetails = $this->Tariff->getTariffList($tariff);
                    $tariffCode = 0;
                    if (!empty($tariffCodeDetails)) {
                        $tariffCode = $tariffCodeDetails->first()->tariff_code;
                    }

                    $fastags = $input['Fastags']['Fastag']; // fasTAG Data

                    //print_r($fastags);


                    //Validation if vehicle is already entered -- need check
                    if (!empty($fastags)) {
                        $transaction = $this->FastagEntry->getUniqueFastagDetail($fastags);
                        if ($transaction != False) {
                            $fastags = $transaction;
                        }else{
                            throw new Exception('Vehicle Already Entered-1.');
                        }
                    } else {
                        throw new Exception('FASTag IDs are not found');
                    }




                    $fastagId = null;
                    $fastagEntryTagId = null;
                    $fastagTxnTagId = null;
                    $membership = 0;

                    //die("here");
                    if (!empty($fastags && is_array($fastags))) {

                        //$fastagsArray = [];

                        $fastagId = "";
                        $fastagTagId = "";
                        $fastagTagSig = "";
                        $txnResponse = "";
                        $fastagDetail = [];
                        $vechNo = "0";
                        $fastagVechNo = "0";
                        foreach ($fastags as $fastag) {


                            $validator = Validator::make($fastag, [
                                "epc_id" => "required|string|min:24",
                                "tag_id" => "required|string|min:24",
                                "tag_signature_data_hex" => "required|string",
                            ]);



                            if ($fastagTxnTagId != $fastag['tag_id'] && strlen($validator->errors()->first()) == 0) {


                                $tagDataforCheck = array("fastag_id" => $fastag['tag_id'], "id" => "", "laneId" =>
                                $laneId, "vehicleNo" => $anprVehicleNumber, "in_time" => $input['InTime'], "out_time" => "", "IP" => $input['IP']);

                                $fastagDetail = $this->checkFastagTagDetail($tagDataforCheck, "entry");


                                $fastagMessage = $this->getFastagErrorMessage($fastagDetail['fastagStatusCode']);

                                $fastagDetail["tag_signature_data_hex"] = $fastag['tag_signature_data_hex'];
                                $fastagDetail["fastagMessage"] = $fastagMessage;

                                if ($fastagDetail['fastagStatusCode'] == "00") {

                                    $fastagVechNo = $fastagDetail['fastag_vehicle_no'];
                                    break;
                                }
                            }
                        }

                        $fastagVechNo = $fastagDetail['fastag_vehicle_no'];
                        if($fastagVechNo != "0"){

                            $txnResponse = $this->insertTranscationData($input,$barcode,$vehicleType,$fastagVechNo,$shiftId,$inType,$inTypeId,$gate->gate_id,$userId,$inPaymentMode,$inMasterPaymentMode,$dayTypeEntry,$tariffCode,$area->area_id,$laneId,$fastags,$fastagDetail,$anprVehicleNumber);
                            $response['transaction'] = $txnResponse;
                        }else{
                            throw new \Exception('Invalid FASTag IDs 1');
                        }

                    } else {
                        throw new \Exception('FASTag IDs not found');
                    }

                    if (is_null($fastagId)) {
                        throw new \Exception('Invalid FASTag IDs 2');
                    }
                } catch (Exception $e) {
                    $exception = $e->getMessage();
                }

            });

            //if  $entryStatus is null then transaction is inserted successfully
            if (is_null($entryStatus) && strlen($exception) == 0) {
                $this->createLog(true, $this->logPath, "FASTag Entry ", $request->all(), $this->sendFastageResponse($transaction, 'Successfully'));
                return $this->sendFastageResponse($response, 'Welcome To SecureParking!');
            } else {
                throw new Exception($exception);
            }

        } catch (\Exception $e) {
            //$this->createLog(false, $this->logPath, "FASTag Entry Error", $request->all(), $this->sendFastageError('Error: ' . $e->getMessage(), [], 422));
            return $this->sendFastageError('Error: ' . $e->getMessage(), [], 422);
        }

    }


    public function checkFastagVehicleNo($fastagVehicleNo,$anprVehicleNumber){
        $checkIfVehicleExist = Transaction::where('vehicle_number',$fastagVehicleNo)->where('out_time', '=', '0000-00-00 00:00:00')->count();
        if ($checkIfVehicleExist > 0) {
            return false;
        }

        if($anprVehicleNumber == "0"){
            if(strlen($fastagVehicleNo) > 12){
                return false;
            }
        }

       return true;

    }


    public function insertTranscationData($input,$barcode,$vehicleType,$vehicleNumber,$shiftId,$inType,$inTypeId,$gate_id,$userId,$inPaymentMode,$inMasterPaymentMode,$dayTypeEntry,$tariffCode,$area_id,$laneId,$fastags,$fastagDetail,$anprVehicleNumber){

        $fastagVechNo = $vehicleNumber;


        if($this->checkFastagVehicleNo($fastagVechNo,$anprVehicleNumber)){

            $txnVehicleNumber = $anprVehicleNumber == "0" ? $fastagVechNo : $anprVehicleNumber;


            $vehicle = [];
            $vehicle['vehicleNumber'] = $txnVehicleNumber;
            $vehicle['fastagId'] = $fastagDetail['TAGID'];



            if($txnVehicleNumber != "0"){
                //If FASTag has Sticker membership.
                $membership = $this->StickerMembership->getStickerMembershipByVehicleNo($vehicle);
                if ($membership) {
                    $inType = 5;
                    $inTypeId = $membership[0]->membership_id;
                    $inPaymentMode = 0;
                    $inMasterPaymentMode = 3;
                }else{
                    $inType = 1;
                    $inTypeId = 0;
                    $inPaymentMode = 0; //8
                    $inMasterPaymentMode = 0; //0
                }
            }


            // Setting data in transaction table
            $transaction = new Transaction();
            $transaction->barcode = $barcode;
            $transaction->ticket_no = rand(10000, 99999);
            $transaction->in_time = $input['InTime'];
            $transaction->vehicle_type = $vehicleType;
            $transaction->vehicle_number = $txnVehicleNumber;
            $transaction->in_shift_id = $shiftId;
            $transaction->in_type = $inType;
            $transaction->in_type_id = $inTypeId;
            $transaction->in_gate = $gate_id;//$gate->gate_id;
            $transaction->out_gate = NULL;
            $transaction->in_user_id = $userId;
            $transaction->in_payment_mode = $inPaymentMode;
            $transaction->in_master_payment_mode = $inMasterPaymentMode;
            $transaction->in_day_type = $dayTypeEntry;
            $transaction->in_tariff_code = 0; //$tariffCode;
            $transaction->in_foc_difference = 0;
            $transaction->in_membership_payment_amount = 0;
            $transaction->in_payment_referance_number = 0;
            $transaction->in_payment_amount = 0;
            $transaction->in_standard_parking_amount = 0;
            $transaction->in_foc = 0;
            $transaction->in_foc_reason = 0;
            $transaction->in_foc_approval = 0;
            $transaction->is_nested = 0;
            $transaction->location_id = env('LOCATION_ID');
            $transaction->area_id = $area_id;//$area->area_id;
            $transaction->is_cps = 0;
            $transaction->in_foc_note = 0; // if having sent from binary
            $transaction->total_payment_amount = 0; //$PaymentEntryAmount + $inMembershipPaymentAmountEntry;
            $transaction->vip_membership_slot = ''; // if membership is existed then check sps_socket_server file live no 858
            $transaction->sync_at = "0000-00-00 00:00:00"; // if entry through cps then add date("Y-m-d H:i:s")
            $transaction->offline_ticket = NULL; // if entry through cps then value is 1
            $transaction->entry_process_time = date("Y-m-d H:i:s"); // current time
            $transaction->entry_type = 'FASTag';
            $transaction->fastag_vehicle_no = $fastagDetail['fastag_vehicle_no'];
            $transaction->fastag_exec_code = $fastagDetail['fastag_exec_code'];
            $transaction->fastag_exec_message = $fastagDetail['fastag_exec_message'];
            $transaction->fastag_tag_signature = $fastagDetail['tag_signature_data_hex'];
            $transaction->fastag_id = $fastagDetail['TAGID'];
            $transaction->fastag_epc = $fastagDetail['TID'];
            $transaction->fastag_lane = '';
            $transaction->fastag_exec_message = $fastagDetail['fastagMessage'];


            $transaction->in_type = $inType;
            $transaction->in_type_id = $inTypeId;
            $transaction->in_payment_mode = $inPaymentMode;
            $transaction->in_master_payment_mode = $inMasterPaymentMode;
            $transaction->save();

            $this->storeEntryVehImages($input, $transaction->id);


            
            foreach ($fastags as $fastag) {

                $validator = Validator::make($fastag, [
                    "epc_id" => "required|string|min:24",
                    "t_id" => "required|string|min:24",
                    "tag_signature_data_hex" => "required|string",
                ]);

                if (strlen($validator->errors()->first()) == 0) {
                    $fastagEntry = new FastagEntry();
                    $fastagEntry->txn_id = $transaction->id;
                    $fastagEntry->vehicle_no = 0;
                    $fastagEntry->fastag_id = $fastag['tag_id'];
                    $fastagEntry->fastag_no = $fastag['tag_id'];
                    $fastagEntry->tag_signature_data_hex = $fastag['tag_signature_data_hex'];
                    $fastagEntry->tag_vrn = $fastag['tag_vrn'];
                    $fastagEntry->issuer_bank_id = $fastag['issuer_bank_id'];
                    $fastagEntry->tag_v_class = $fastag['tag_v_class'];
                    $fastagEntry->rfu = $fastag['rfu'];
                    $fastagEntry->epc_id = $fastag['epc_id'];
                    $fastagEntry->user_memory = $fastag['user_memory'];
                    $fastagEntry->created_at = date('Y-m-d H:i:s');
                    $fastagEntry->save();
                }
            }

            $responseTxn = Transaction::where('id', $transaction->id)->first();

            return $responseTxn;

        }else{
            throw new \Exception('FASTag ERROR: DUPLICATE Vehicle OR CHESIS NO found - '.$fastagVechNo);
        }

        //Checking Gate has payment at entry or not
        // if ($gate->is_full == '1') {
        //     $paymentEntryParam = [
        //         'request' => $request,
        //         'shiftId' => $shiftId,
        //         'userId' => $userId,
        //         'inType' => $inType,
        //         'inTypeId' => $inTypeId,
        //         'inPaymentMode' => $inPaymentMode,
        //         'inMasterPaymentMode' => $inMasterPaymentMode,
        //         'gate' => $gate,
        //         'area' => $area,
        //         'location' => $location,
        //         'transaction' => $transaction,
        //         'membership' => $membership,
        //         'isFastagPayment' => $isFastagPayment,
        //         'laneId' => $laneId,
        //     ];
        //     $paymentAtEntryResponse = $this->requestPaymentAtEntry($paymentEntryParam);

        //     if (isset($paymentAtEntryResponse['status']) && !$paymentAtEntryResponse['status']) {
        //         throw new Exception($paymentAtEntryResponse['message']);
        //     }

        //     $response['payment_at_entry'] = $paymentAtEntryResponse;
        // }



    }



    /**
     * Validate location code and area code.
     *
     * @param $locationCode
     * @param $areaCode
     *
     * @return boolean
     */
    public function validateLocationAreaCode($locationCode, $areaCode)
    {
        if (config('sps.area_id') == $areaCode) {
            //check if location code is valid against location table
            $locationData = Location::where('location_code', $locationCode)->get()->toArray();
            if ($locationData) {
                return true;
            } else {
                return false;
            }
        }

        return false;
    }



    public function transactionFastag(FASTagRequest $request)
    {
        $response = '';
        $updateTransactionForFastagTagDetailForPayment = "";
      

        try {

            $statusTransaction = DB::transaction(function () use (&$request, &$response, &$updateTransactionForFastagTagDetailForPayment) {
                //Get input request parameters
                $input = $request->all();
                $checkShiftManagement = $this->checkShiftManagementValidation($input);
                if (!is_array($checkShiftManagement)) {
                    throw new Exception($checkShiftManagement);
                }

                $area = $checkShiftManagement['area'];
                $location = $checkShiftManagement['location'];
                $gate = $checkShiftManagement['gate'];
                $userId = $checkShiftManagement['userId'];
                $shiftId = $checkShiftManagement['shiftId'];
                $laneId = $input['laneId'];
                $txnBarCode = $input['barCode'];
                $vehicleNumber = !empty($input['vehicleNumber']) ? $input['vehicleNumber'] : "0";
                $tariff = !empty($input['tariff']) ? $input['tariff'] : "";
                $fastagExcutionType = $input['fastagExcutionType'];

                $isF8Txn = false;
                $f8TxnData = [];


                $sql = 'Select * from sps_transactions WHERE barcode= "'.$txnBarCode.'" AND deleted_at IS NULL';
                $results = DB::select(DB::raw($sql));


                //print_r(DB::getQueryLog());
                if (isset($results[0])) {
                    $f8TxnData = $results[0];
                    if($results[0]->f_eight == 1){
                        $isF8Txn = true;
                    }else{
                        $isF8Txn = false;
                    }
                } else {
                    $isF8Txn = false;
                }


                
                if($fastagExcutionType == "direct"){

                    //$this->directTransactionFastag($request);
                    $fastagExcutionType = $input['fastagExcutionType'];
        
                    $mixvehicleNumberArray = explode("-",  $vehicleNumber);
            
                    $transactionVehicleNumber =  $mixvehicleNumberArray[0];
                    $fastagVehicleNumber =  $mixvehicleNumberArray[1];
            

                }

                
                if (!$this->validateLocationAreaCode($location->location_code, $area->area_code)) {
                    throw new Exception('Invalid Location or Area Code');
                }


                if($input['Fastags']['Fastag']){
                    if ($this->FastagEntry->getBlockVehicleDetails($input)) { //check blocked vehicle on exit
                        throw new \Exception('RFID Member Blocked Vehicle');
                    }
                    $fastags = $input['Fastags']['Fastag'];
                    
                }else{
                    $fastags = [];
                    throw new Exception('FasTag data not found in request');
    
    
                }



                
               
                $fastagType = "";


               
                //if (!empty($fastags)) {


                    if ($vehicleNumber != "0") {
                        
                        if($isF8Txn){
                            $response = $f8TxnData;
                        }else{
                            if($fastagExcutionType == "direct"){
                                $response = $this->FastagEntry->getTransactionDetailByVehicleNo($transactionVehicleNumber, $fastags);
                                $response->vehicle_number = $fastagVehicleNumber;
                            }else{
                                $response = $this->FastagEntry->getTransactionDetailByVehicleNo($vehicleNumber, $fastags);

                            }
                        }
                        //$response = $this->FastagEntry->getTransactionDetail($fastags);
                        $fastagType = "exit";
                    } else {

                        if($isF8Txn){
                            $response = $f8TxnData;
                        }else{

                            $response = $this->FastagEntry->getTransactionDetail($fastags);
                        }
                        $fastagType = "txn";


                    }


                    $fastagType = "exit";

                    

                    if (!empty($response)) {
                        // Checking transaction ID , data is saved properly or not.
                        $transaction = $response;

                        $vehicleNumber = $transaction->vehicle_number;
                        if (!empty($transaction->id)) {
                            if (!empty($fastags && is_array($fastags))) {
                                foreach ($fastags as $fastag) {

                                    $validator = Validator::make($fastag, [
                                        "epc_id" => "required|string|min:24",
                                        "t_id" => "required|string|min:24",
                                        "tag_signature_data_hex" => "required|string",
                                    ]);

                                    $fastagEntry = new FastagEntry();
                                    $fastagEntry->txn_id = $transaction->id;
                                    $fastagEntry->vehicle_no = $transaction->vehicle_number;
                                    $fastagEntry->fastag_id = $fastag['tag_id'];
                                    $fastagEntry->fastag_no = $fastag['tag_id'];
                                    $fastagEntry->tag_signature_data_hex = $fastag['tag_signature_data_hex'];
                                    $fastagEntry->tag_vrn = $fastag['tag_vrn'];
                                    $fastagEntry->issuer_bank_id = $fastag['issuer_bank_id'];
                                    $fastagEntry->tag_v_class = $fastag['tag_v_class'];
                                    $fastagEntry->rfu = $fastag['rfu'];
                                    $fastagEntry->epc_id = $fastag['epc_id'];
                                    $fastagEntry->user_memory = $fastag['user_memory'];
                                    $fastagEntry->used_for_payment = "1";
                                    $fastagEntry->created_at = date('Y-m-d H:i:s');
                                    $fastagEntry->save();

                                    //print_r(DB::getQueryLog());

                                }
                            }
                        }

                    }else {
                        throw new Exception('Vehicle not found');
                    }
                    //print_r($response);
                    //die("dfdfdfdf");
                    // if (!$response) {
                    //     throw new Exception('Transaction is not found');
                    // }
                //} else {
                //    throw new Exception('FASTag IDs are not found');
                //}

                //print_r($response);

                // call FASTag Engine for updating FASTag tag details e.g. vehicle no, tag status
                //$updateTransactionForFastagTagDetailForPayment = $this->updateTransactionForFastagTagDetailForPayment($response, $laneId, $fastagType, $fastags);
                $fastagDetailsArr = $this->validateFastagUpdateDetails($vehicleNumber,$fastags,$laneId);
                if(isset($fastagDetailsArr) && !empty($fastagDetailsArr) && $fastagDetailsArr['status'] == true){
                    if($response->is_cps == 1){
                        Transaction::where('id', $response->id)
                        ->update([
                            'fastag_vehicle_no' => $fastagDetailsArr['fastag_vehicle_no'],
                            'fastag_epc' => $fastagDetailsArr['fastag_epc'],
                            'fastag_id' => strtolower($fastagDetailsArr['fastag_id']),
                            'fastag_exec_code' => $fastagDetailsArr['fastag_exec_code'],
                            'fastag_exec_message' => $fastagDetailsArr['fastag_exec_message'],
                        ]);
    
                    }else{
                        Transaction::where('id', $response->id)
                        ->update([
                            'fastag_vehicle_no' => $fastagDetailsArr['fastag_vehicle_no'],
                            'fastag_epc' => $fastagDetailsArr['fastag_epc'],
                            'fastag_id' => strtolower($fastagDetailsArr['fastag_id']),
                            'fastag_exec_code' => $fastagDetailsArr['fastag_exec_code'],
                            'fastag_exec_message' => $fastagDetailsArr['fastag_exec_message'],
                            'fastag_lane' => $fastagDetailsArr['fastag_lane'],
                        ]);
    
                    }
                }else{
                    throw new Exception($fastagDetailsArr['message']);
                }

            });


            /*if ($updateTransactionForFastagTagDetailForPayment != "00") {
                //throw new Exception($updateTransactionForFastagTagDetailForPayment);
                //$responseMessage = $this->getFastagErrorMessage($updateTransactionForFastagTagDetailForPayment);

                $statusCode = $updateTransactionForFastagTagDetailForPayment['status'];
                $fastagMessageDetail = $updateTransactionForFastagTagDetailForPayment['message'];
                if($statusCode == "450"){
                    return $this->sendFastageError($fastagMessageDetail. ". Please switch payment mode.", [], 422);
                }elseif($statusCode == "451"  && str_contains($fastagMessageDetail, '#423#')){
                    return $this->sendFastageError("Vehicle number mismatch.", [], 423);
                }elseif($statusCode == "452"){
                    return $this->sendFastageError($fastagMessageDetail. ". Please switch payment mode.", [], 422);
                }else{
                    $responseMessage_final = $this->getFastagErrorMessage($updateTransactionForFastagTagDetailForPayment);
                    $fastagMessageDetail = isset($responseMessage_final) ? $responseMessage_final : "Fastag message not found";
                    return $this->sendFastageError($fastagMessageDetail. ". Please switch payment mode.", [], 422);
                }

            } else {

                if (is_null($statusTransaction)) {
                    $this->createLog(true, $this->logPath, "Get FASTag Information Transaction ", $request->all(), $this->sendFastageResponse($response, 'Successfully'));
                    return $this->sendFastageResponse($response, 'Successfully');

                } else {

                    throw new Exception('Transaction is not found');
                }

            }*/
            if (is_null($statusTransaction)) {
                $this->createLog(true, $this->logPath, "Get FASTag Information Transaction ", $request->all(), $this->sendFastageResponse($response, 'Successfully'));
                return $this->sendFastageResponse($response, 'Successfully');

            } else {

                throw new Exception('Transaction is not found');
            }


        } catch (\Exception $e) {

            //print_r($e->getMessage());
            $this->createLog(false, $this->logPath, "FASTag info Transaction ", $request->all(), $this->sendFastageError(' Error: ' . $e->getMessage(), [], 422));

            $responseMessage = "";
            if (is_numeric($e->getMessage())) {
                $responseMessage = $this->getFastagErrorMessage($e->getMessage());
            } else {
                //print_r($e->getMessage());
                $responseMessage = $e->getMessage()." ";
            }

            $responseMessage = $responseMessage . ". Please switch payment mode.";

            //$responseMessage = $e->getMessage();

            if($e->getMessage() == "Vehicle not found"){
                $responseMessage = "Vehicle not found. Please enter vehicle number manually.";
                return $this->sendFastageError($responseMessage, [], 421);
            }else{

                if (str_contains($responseMessage, '#423#')) { 
                    return $this->sendFastageError("Vehicle number mismatch.", [], 423);
                }else{
                    return $this->sendFastageError($responseMessage, [], 422);
                }
            }
        }
    }

    /*public function transactionFastagPayOnEntry(FASTagRequest $request)
    {
        $response = '';
        $updateTransactionForFastagTagDetailForPayment = "";
        $entryGateSuccess = "207";
        $vehicleAlreadyInsideError = "104";
        $fastagFailedUpdate = "0";
        //dd($request->all());
        try {
            $log = "-----------Log start for fastag " . date('Y-m-d H:i:s') . " pay on entry--------------" . PHP_EOL;
            $start = microtime(true);
            $conn_start = microtime(true);
            $inTimeEntry                     = $request->input('inTime');
            $vehicleTypeEntry               = $request->input('vehicle_type');
            $inGateIdEntry                  = $request->input('in_gate');
            $inUserIdEntry                  = $request->input('in_user_id');
            $vhNumberEntry                  = $request->input('vehicle_number');
            $barcodeEntry                   = $request->input('in_barcode');
            $transactionTypeInEntryGate     = $request->input('in_type');
            $cardNoEntry                    = $request->input('rfid_card_number');
            $PaymentEntryAmount             = $request->input('in_payment_amount');
            $inPaymentModeEntry             = $request->input('in_payment_mode');
            $inPaymentDiscountAmountEntry  = $request->input('discount_amount');
            $inPaymentDiscountTypeEntry    = $request->input('discount_type');
            $inPaymentDiscountTypeIDEntry  = $request->input('discount_type_id');
            $inPaymentDiscountValueEntry   = $request->input('discount_value');
            $inPaymentDiscountValueTypeEntry = $request->input('discount_value_type');
            $isCpsGateEntry                 = $request->input('is_cps_gate');
            $focReasonNameEntrys            = $request->input('foc_reason_name');
            $focnotesEntry                  = $request->input('foc_notes');
            $focApproversNameEntrys        = $request->input('foc_approver_name');
            $additionalChargesEntry        = $request->input('additional_charges');
            $ticketNoEntry                  = $request->input('ticket_no');
            $tariffCodeEntry                = $request->input('tariff_code');
            $focDifferenceEntry             = $request->input('foc_difference');
            $paymentReferenceNumberEntry   = $request->input('payment_reference_number');
            $inMembershipPaymentAmountEntry = $request->input('membership_payment_amount');
            $dayTypeEntry                   = $request->input('in_day_type');
            $isNestedEntrys                 = $request->input('is_nested');
            $taxDataEntry                   = $request->input('in_tax_entry');
            $vipBitEntrys                   = $request->input('vip_bit');
            $balanceRemainingRfidCardEntry = $request->input('rfid_balance_remaining');
            $standardAmountEntry            = $request->input('in_standard_parking_amount');
            $voucherPlanEntry               = $request->input('voucher_plan');
            $entryFirstImage                = $request->input('driver_face_image');
            $entrySecondImage               = $request->input('vehicle_number_image');
            $offineBitEntry                 = $request->input('offline_bit');
            $inShiftIdEntry                 = $request->input('in_shift_id');
            $entryThirdImage                = $request->input('vehicle_number_cropped_image');
            $unmannedBit                    = $request->input('unmanned_bit');
            $anprJsonStringEntry            = $request->input('anpr_json_string');

            $vhNumberEntryFastag = $vhNumberEntry;

            $createdAt = Carbon::now()->format('Y-m-d H:i:s');
            $entryProcessTime = Carbon::now()->format('Y-m-d H:i:s');

            $createdAtOfflineEntryBit = ($offineBitEntry == "1") ? $createdAt : null;
            $inFocReasonIdEntry = null;
            $inFocApproverIdEntry = null;
            $inFocEntryBit = null;

            if ($focReasonNameEntrys === "0") {
                $log .= "FOC Reason Entry is zero" . PHP_EOL;
                $inFocReasonIdEntry = 0;
                $inFocApproverIdEntry = 0;
                $inFocEntryBit = 0;
            } else {
                $inFocEntryBit = 1;

                // Query to fetch foc reason id
                $focReason = DB::table('sps_foc_reasons')
                    ->where('reason', $focReasonNameEntrys)
                    ->whereNull('deleted_at')
                    ->first();

                $focReasonIDEntry = $focReason ? $focReason->id : 0;
                $log .= "FOC Reason Id: $focReasonIDEntry" . PHP_EOL;

                $inFocReasonIdEntry = $focReasonIDEntry > 0 ? $focReasonIDEntry : 0;
                $log .= "FOC Reason Id after check: $inFocReasonIdEntry" . PHP_EOL;

                // Query to fetch foc approval id
                $focApproval = DB::table('sps_foc_approvers as a')
                    ->join('sps_users as b', 'a.user_id', '=', 'b.user_id')
                    ->where('b.user_name', $focApproversNameEntrys)
                    ->whereNull('a.deleted_at')
                    ->where('b.status', '1')
                    ->whereNull('b.deleted_at')
                    ->select('a.id')
                    ->first();

                $focApprovalIDEntry = $focApproval ? $focApproval->id : 0;
                $log .= "FOC Approval Id: $focApprovalIDEntry" . PHP_EOL;

                $inFocApproverIdEntry = $focApprovalIDEntry > 0 ? $focApprovalIDEntry : 0;
                $log .= "FOC Approval Id after check: $inFocApproverIdEntry" . PHP_EOL;
            }

            // Total payment amount
            $totalPaymentAmountEntry = $PaymentEntryAmount + $inMembershipPaymentAmountEntry;
            $log .= "Total Payment Amount: $totalPaymentAmountEntry" . PHP_EOL;
            $log .= "Transaction Type In Entry Gate: $transactionTypeInEntryGate" . PHP_EOL;

            $statusForVipEntry = 0;
            if ($transactionTypeInEntryGate == 2) {
                // RFID
                $statusForVipEntry = null;
                $log .= "Checking RFID Membership with card: $cardNoEntry" . PHP_EOL;

                $membership = Membership::whereRaw("CONCAT(card_no_prefix, card_no) = ?", [$cardNoEntry])
                    ->where('status', 1)
                    ->whereNull('deleted_at')
                    ->first();

                if ($membership) {
                    $memberIdEntry = $membership->member_id;
                    $log .= "RFID Member ID: $memberIdEntry" . PHP_EOL;

                    $corporate = Corporate::query()
                        ->select('sps_corporates.*')
                        ->leftJoin('sps_members', 'sps_corporates.corporate_id', '=', 'sps_members.corporate_id')
                        ->where('sps_members.member_id', $memberIdEntry)
                        ->where('sps_members.status', 1)
                        ->whereNull('sps_members.deleted_at')
                        ->whereNull('sps_corporates.deleted_at')
                        ->first();

                    if ($corporate) {
                        if ($vipBitEntrys == "1" && $corporate->vip_resv_left < $corporate->vip_resv_total) {
                            $corporate->increment('vip_resv_left');
                            $statusForVipEntry = 1;
                            $log .= "VIP Reservation incremented. New value: {$corporate->vip_resv_left}" . PHP_EOL;
                        } elseif ($corporate->member_resv_left < $corporate->member_resv_total) {
                            $corporate->increment('member_resv_left');
                            $statusForVipEntry = 0;
                            $log .= "Member Reservation incremented. New value: {$corporate->member_resv_left}" . PHP_EOL;
                        }

                        $inTypeIdEntryGate = $cardNoEntry;
                        $inTypeEntryGate = 2;
                    }
                }
            } elseif ($transactionTypeInEntryGate == 3) {
                // Registered voucher
                $log .= "Processing Registered Voucher\n";
                $inTypeIdEntryGate = $voucherPlanEntry == "1" ? $cardNoEntry : 0;
                $inTypeEntryGate = $voucherPlanEntry == "1" ? 3 : 1;
            } elseif ($transactionTypeInEntryGate == 4) {
                // Unregistered voucher
                $log .= "Processing Unregistered Voucher\n";
                $inTypeIdEntryGate = 0;
                $inTypeEntryGate = 1;
            } elseif ($transactionTypeInEntryGate == 5) {
                // Sticker
                $log .= "Checking Sticker Vehicle with number: $vhNumberEntry" . PHP_EOL;

                $vehicle = MemberVehicles::where('vehicle_no', $vhNumberEntry)
                    ->where('membership_type', 'STICKER')
                    ->where('status', 1)
                    ->whereNull('deleted_at')
                    ->first();

                if ($vehicle) {
                    $inTypeIdEntryGate = $vehicle->membership_id;
                    $inTypeEntryGate = 5;
                    $log .= "Sticker Vehicle found. Membership ID: $inTypeIdEntryGate" . PHP_EOL;

                    $corporate = Corporate::query()
                        ->leftJoin('sps_members', 'sps_corporates.corporate_id', '=', 'sps_members.corporate_id')
                        ->where('sps_members.member_id', $vehicle->member_id)
                        ->where('sps_members.status', 1)
                        ->whereNull('sps_members.deleted_at')
                        ->whereNull('sps_corporates.deleted_at')
                        ->select('sps_corporates.*')
                        ->first();

                    if ($corporate && $corporate->member_resv_left < $corporate->member_resv_total) {
                        $corporate->increment('member_resv_left');
                        $log .= "Corporate reservation incremented for sticker. New value: {$corporate->member_resv_left}" . PHP_EOL;
                    }
                } else {
                    $log .= "Sticker Vehicle not found." . PHP_EOL;
                    $inTypeIdEntryGate = 0;
                    $inTypeEntryGate = 5;
                }
            } else {
                // Casual
                $log .= "Default to Casual Entry\n";
                $inTypeIdEntryGate = 0;
                $inTypeEntryGate = 1;
            }

            $log .= "Fetching Payment Mode: $inPaymentModeEntry" . PHP_EOL;

            $paymentMode = PaymentModes::where('payment_mode', $inPaymentModeEntry)
                ->whereNull('deleted_at')
                ->first();

            if ($inPaymentModeEntry === "Dynamic QR") {
                $inPaymentModeIdEntry = 5;
                $inMasterPaymentModeEntry = 4;
                $log .= "Dynamic QR payment mode detected. Set paymentModeId=5, masterPaymentModeId=4" . PHP_EOL;
            } elseif ($paymentMode) {
                $inPaymentModeIdEntry = $paymentMode->id;
                $inMasterPaymentModeEntry = $paymentMode->master_id;
                $log .= "Payment Mode ID: $inPaymentModeIdEntry, Master ID: $inMasterPaymentModeEntry" . PHP_EOL;
            } else {
                $log .= "Payment mode '$inPaymentModeEntry' not found in DB." . PHP_EOL;
                $inPaymentModeIdEntry = null;
                $inMasterPaymentModeEntry = null;
            }

            // Optional: Double-check if master payment mode exists (if required)

            // Fetch location_id and area_id from sps_settings
            $setting = Settings::whereNull('deleted_at')->first();

            if ($setting) {
                $areaIdEntry = $setting->area_id;
                $locationIdEntry = $setting->location_id;
                $log .= "Fetched Area ID: $areaIdEntry, Location ID: $locationIdEntry" . PHP_EOL;
            } else {
                $areaIdEntry = null;
                $locationIdEntry = null;
                $log .= "Settings record not found." . PHP_EOL;
            }

            // Initialize default variables
            $spsTransactionId = null;
            $finalEnfImageName = null;
            $finalImageName = null;
            $offlineTicketAlreadyEntry = 0;

            // Log transaction packet initiation
            $log .= "---- Transaction Entry packet(4444) ----" . PHP_EOL;

            // Log query execution time
            $queryStartTimeForEntryBarcode = microtime(true) - $conn_start;
            $queryStartTimePrintForEntryBarcode = "Query start time for check offline ticket exit in barcode";
            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : $queryStartTimeForEntryBarcode : $queryStartTimePrintForEntryBarcode" . PHP_EOL;

            $log .= "Searching transaction with barcode: $barcodeEntry" . PHP_EOL;

            // Query with binary comparison for barcode, ignoring deleted records
            $transaction = Transaction::whereRaw('BINARY barcode = ?', [$barcodeEntry])
                ->whereNull('deleted_at')
                ->first();

            if ($transaction) {
                $spsTransactionId = $transaction->id;
                $offlineTicketAlreadyEntry = $transaction->offline_ticket;
                $outGateAlreadyEntry = $transaction->out_gate;
                $inShiftIdAlreadyInsideEntry = $transaction->in_shift_id;
                $inGateAlreadyEntry = $transaction->in_gate;
                $isCpsBitFromTransactionTable = $transaction->is_cps;
                $isFastagIdAvailable = $transaction->fastag_id;
                $isFastagIdEntry = 1;

                $log .= "Record found: transaction ID: $spsTransactionId" . PHP_EOL;
                $log .= "Offline Ticket: $offlineTicketAlreadyEntry" . PHP_EOL;
                $log .= "Out Gate: $outGateAlreadyEntry" . PHP_EOL;
                $log .= "In Shift ID: $inShiftIdAlreadyInsideEntry" . PHP_EOL;
                $log .= "In Gate: $inGateAlreadyEntry" . PHP_EOL;
                $log .= "Is CPS bit: $isCpsBitFromTransactionTable" . PHP_EOL;
                $log .= "Fastag ID available: $isFastagIdAvailable" . PHP_EOL;
            } else {
                $spsTransactionId = null;
                $offlineTicketAlreadyEntry = null;
                $outGateAlreadyEntry = null;
                $inShiftIdAlreadyInsideEntry = null;
                $inGateAlreadyEntry = null;
                $isCpsBitFromTransactionTable = null;
                $isFastagIdAvailable = null;
                $isFastagIdEntry = 0;

                $log .= "No transaction record found for barcode: $barcodeEntry" . PHP_EOL;
            }

            // Calculate and log query elapsed time
            $timeElapsed = microtime(true) - $start;
            $queryEndTimePrintForBarcode = "Query end time for check offline ticket exit in barcode";
            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : $timeElapsed : $queryEndTimePrintForBarcode" . PHP_EOL;

            
            $log .= "Checking sync_at for barcode transaction..." . PHP_EOL;

            $syncAtEntry = isset($transaction) ? $transaction->sync_at : null;
            $createdAtOfflineEntryBit = $syncAtEntry;

            if ($transaction == 0) {
                $log .= "No transaction found using barcode. Trying vehicle number: $vhNumberEntry" . PHP_EOL;

                // Start timing
                $vehicleQueryStart = microtime(true);

                $transactionAgainstVehicleNumber = DB::table('sps_transactions')
                    ->select('id', 'barcode', 'in_time', 'out_time', 'offline_ticket', 'in_shift_id', 'in_gate', 'out_gate', 'vehicle_number', 'sync_at', 'is_cps', 'fastag_id')
                    ->where('vehicle_number', $vhNumberEntry)
                    ->where('offline_ticket', 99)
                    ->whereNull('deleted_at')
                    ->whereNull('in_shift_id')
                    ->orderBy('id', 'asc')
                    ->limit(1)
                    ->first();

                if ($transactionAgainstVehicleNumber) {
                    $spsTransactionId = $transactionAgainstVehicleNumber->id;
                    $log .= "Transaction ID found for vehicle number: $spsTransactionId" . PHP_EOL;

                    $spsTransactionBarcodeAlreadyEntry = $transactionAgainstVehicleNumber->barcode;
                    $log .= "Barcode already entered: $spsTransactionBarcodeAlreadyEntry" . PHP_EOL;

                    $outTimeAlreadyEntry = $transactionAgainstVehicleNumber->out_time;
                    $log .= "Out time: $outTimeAlreadyEntry" . PHP_EOL;

                    $offlineTicketAlreadyEntry = $transactionAgainstVehicleNumber->offline_ticket;
                    $outGateAlreadyEntry = $transactionAgainstVehicleNumber->out_gate;
                    $inGateAlreadyEntry = $transactionAgainstVehicleNumber->in_gate;
                    $inShiftIdAlreadyInsideEntry = $transactionAgainstVehicleNumber->in_shift_id;
                    $vehicleNumberAlreadyEntry = $transactionAgainstVehicleNumber->vehicle_number;
                    $isCpsBitFromTransactionTable = $transactionAgainstVehicleNumber->is_cps;
                    $log .= "Is CPS bit: $isCpsBitFromTransactionTable" . PHP_EOL;

                    $isFastagIdAvailable = $transactionAgainstVehicleNumber->fastag_id;
                    $isFastagIdEntry = 0;

                    $syncAtEntry = $transactionAgainstVehicleNumber->sync_at;

                    // End timing and log it
                    $vehicleQueryEnd = microtime(true);
                    $elapsed = $vehicleQueryEnd - $vehicleQueryStart;
                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : $elapsed : Query end time for offline ticket using vehicle number" . PHP_EOL;
                } else {
                    $log .= Carbon::now()->format('Y-m-d H:i:s'). "No offline ticket found with vehicle number: $vhNumberEntry" . PHP_EOL;
                }
            }



            $log .= "Checking for CPS record using receipt barcode: $barcodeEntry" . PHP_EOL;

            // Fetch latest CPS entry matching the barcode
            $queryForCpsEntryBefore = DB::table('sps_cps')
                ->select('cps_id')
                ->where('receipt_barcode', $barcodeEntry)
                ->whereNull('deleted_at')
                ->orderBy('cps_id', 'desc')
                ->first();

            if ($offineBitEntry === "1") {
                $createdAtOfflineEntryBit = date("Y-m-d H:i:s");
                $log .= "Entry bit is offline" . PHP_EOL;

                if ($spsTransactionId > 0) {
                    if ($isCpsBitFromTransactionTable === "1") {
                        $log .= "Inside CPS bit = 1 for offline condition" . PHP_EOL;

                        if (!is_null($offlineTicketAlreadyEntry)) {
                            switch ($offlineTicketAlreadyEntry) {
                                case "12":
                                    $offlineTicketAlreadyEntryBit = "13";
                                    break;
                                case "15":
                                    $offlineTicketAlreadyEntryBit = "16";
                                    break;
                                case "17":
                                    $offlineTicketAlreadyEntryBit = "18";
                                    break;
                                case "3":
                                    $offlineTicketAlreadyEntryBit = "4";
                                    break;
                                default:
                                    $offlineTicketAlreadyEntryBit = "1";
                            }
                        } else {
                            $offlineTicketAlreadyEntryBit = "1";
                        }
                    } else {
                        if (in_array($offlineTicketAlreadyEntry, ["3", "99"])) {
                            $offlineTicketAlreadyEntryBit = "4";
                        } else {
                            $offlineTicketAlreadyEntryBit = "1";
                        }
                    }
                } else {
                    $offlineTicketAlreadyEntryBit = "1";
                }
            } else {
                $offlineTicketAlreadyEntryBit = "DEFAULT";
                $log .= "Record is online, default ticket bit assigned: $offlineTicketAlreadyEntryBit" . PHP_EOL;
            }


            // check already entry then update record (duplicate entry avoid)
            if ($transaction > 0 && empty($inShiftIdAlreadyInsideEntry)) {
                $log .= "Inside empty Shift Id condition:" . PHP_EOL;
                $entryGateInsertError = "104";
                //---- check for card no or barcode 
                if ($cardNoEntry > 0) {
                    $updateData = [
                        'in_type'            => $inTypeEntryGate,
                        'in_type_id'         => $inTypeIdEntryGate,
                        'in_shift_id'        => $inShiftIdEntry,
                        'in_user_id'         => $inUserIdEntry,
                        'ticket_no'          => $ticketNoEntry,
                        'in_gate'            => $inGateIdEntry,
                        'updated_at'         => DB::raw('NOW()'),
                        'offline_ticket'     => $offlineTicketAlreadyEntryBit,
                        'in_day_type'        => $dayTypeEntry,
                        'sync_at'            => $createdAtOfflineEntryBit,
                        'barcode'            => $barcodeEntry,
                        'entry_process_time' => $entryProcessTime,
                    ];

                    $log .= "Offline Entry update query 1 for transaction ID: $spsTransactionId" . PHP_EOL;

                    try {
                        $affected = DB::table('sps_transactions')
                            ->where('id', $spsTransactionId)
                            ->update($updateData);

                        if ($affected) {
                            $successTransactionIdAtEntry = DB::getPdo()->lastInsertId(); // Note: lastInsertId might not apply to update, so handle accordingly
                            
                            // Mark success bit and clear user and shift ids
                            $entryBitSuccess = "1";
                            $inUserIdEntry = null;
                            $inShiftIdEntry = null;

                            $transaction_details = DB::table('sps_transactions')
                                ->where('id', $successTransactionIdAtEntry)
                                ->where('out_time', '0000-00-00 00:00:00')
                                ->whereNull('deleted_at')
                                ->first();
                            $transactionArray = $transaction_details ? (array) $transaction_details : [];
                            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Entry offline updated succes 1 : $successTransactionIdAtEntry" . PHP_EOL;

                            return response()->json([
                                'status' => "success",
                                'message' => 'Entry offline updated success',
                                'transaction_details' => $transactionArray
                            ]);

                            // Optional: API request / fundle API logic remains same but change echo to Log::info()

                        } else {
                            // Handle no rows affected scenario (optional)
                            $log .= "Update query executed but no rows affected for ID: $spsTransactionId" . PHP_EOL;
                        }
                    } catch (\Exception $ex) {
                        // Duplicate entry error handling
                        if ($ex->getCode() == 1062) {
                            $log .= "Duplicate error code: " . $ex->getCode(). PHP_EOL;
                            $entryGateInsertError = "104";
                        }

                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Error in updating record for entry gate of unman offline in card number! : $entryGateInsertError" . PHP_EOL;

                        return response()->json([
                            'status' => 'error',
                            'code' => $entryGateInsertError,
                            'message' => 'Error in updating record for entry gate of unman offline in card number!',
                        ], 500);
                    }
                } else {
                    if ($barcodeEntry != "0") {
                        $updateData = [
                            'in_type'            => $inTypeEntryGate,
                            'in_type_id'         => $inTypeIdEntryGate,
                            'in_shift_id'        => $inShiftIdEntry,
                            'in_user_id'         => $inUserIdEntry,
                            'ticket_no'          => $ticketNoEntry,
                            'in_gate'            => $inGateIdEntry,
                            'updated_at'         => DB::raw('NOW()'),
                            'offline_ticket'     => $offlineTicketAlreadyEntryBit,
                            'in_day_type'        => $dayTypeEntry,
                            'sync_at'            => $createdAtOfflineEntryBit,
                            'barcode'            => $barcodeEntry,
                            'entry_process_time' => $entryProcessTime,
                        ];

                        $log .= "Offline Entry update query 2 for transaction ID: $spsTransactionId" . PHP_EOL;

                        try {
                            $affected = DB::table('sps_transactions')
                                ->where('id', $spsTransactionId)
                                ->update($updateData);

                            if ($affected) {
                                $successTransactionIdAtEntry = DB::getPdo()->lastInsertId(); // same note as above

                                $entryBitSuccess = "1";
                                $inUserIdEntry = null;
                                $inShiftIdEntry = null;

                                $transaction_details = DB::table('sps_transactions')
                                    ->where('id', $successTransactionIdAtEntry)
                                    ->where('out_time', '0000-00-00 00:00:00')
                                    ->whereNull('deleted_at')
                                    ->first();
                                $transactionArray = $transaction_details ? (array) $transaction_details : [];
                                $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Offline Entry update query 2 for transaction ID : $successTransactionIdAtEntry" . PHP_EOL;

                                return response()->json([
                                    'status' => "success",
                                    'message' => 'Offline Entry update query 2 for transaction ID',
                                    'transaction_details' => $transactionArray
                                ]);

                                // Optional: API request / fundle API logic remains same but change echo to Log::info()
                            } else {
                                $log .= "Update query executed but no rows affected for ID: $spsTransactionId" . PHP_EOL;
                            }
                        } catch (\Exception $ex) {
                            if ($ex->getCode() == 1062) {
                                $log .= "Duplicate error code: " . $ex->getCode() . PHP_EOL;
                                $entryGateInsertError = "104";
                            }

                            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Error in updating record for Offline Entry update query 2 for transaction : $entryGateInsertError" . PHP_EOL;
                            return response()->json([
                                'status' => 'error',
                                'code' => $entryGateInsertError,
                                'message' => 'Error in updating record for Offline Entry update query 2 for transaction',
                            ], 500);

                            
                        }
                    } else {
                        $successCodeEntry = "Transaction Entry Error : $entryGateInsertError";
                        //$finalPacket = now() . " :  " . $successCodeEntry . " " . $inGateNameEntryLog . " " . $inUserNameLog . " " . $vehicleNumberLog . " " . $barcodeInEntryLog . " " . $transactiontypeLog . " " . $cardNumberLog . " " . $successTransactionIdAtEntry . " " . $finalImageName . "\n" . $finalEnfImageName . "\n" . $inUserIdLog . "  " . $inShiftIdEntryLog . " " . $offlineBitLog;
                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Entry error : $successCodeEntry" . PHP_EOL;

                        return response()->json([
                            'status' => 'error',
                            'code' => $entryGateInsertError,
                            'message' => 'Transaction Entry Error',
                        ], 500);
                    }
                }
            }elseif ($offlineTicketAlreadyEntry == "99" && empty($inShiftIdAlreadyInsideEntry) && $vehicleNumberAlreadyEntry == $vhNumberEntry && strtotime($outTimeAlreadyEntry) >= strtotime($inTimeEntry)){
                if (
                    $inPaymentModeEntry == 0 &&
                    $transactionTypeInEntryGate == 5 &&
                    $PaymentEntryAmount == 0
                ) {
                    $inPaymentModeIdEntry = "0";
                    $inMasterPaymentModeEntry = "3";
                }

                // Calculate total time in minutes
                $diffMinuteOfflineEntry = abs(strtotime($outTimeAlreadyEntry) - strtotime($inTimeEntry));
                $totalTime = ceil($diffMinuteOfflineEntry / 60);

                try {
                    DB::table('sps_transactions')
                        ->where('id', $spsTransactionId)
                        ->update([
                            'in_time' => $inTimeEntry,
                            'total_time' => $totalTime,
                            'in_type' => $inTypeEntryGate,
                            'in_type_id' => $inTypeIdEntryGate,
                            'in_shift_id' => $inShiftIdEntry,
                            'in_user_id' => $inUserIdEntry,
                            'ticket_no' => $ticketNoEntry,
                            'in_gate' => $inGateIdEntry,
                            'updated_at' => Carbon::now()->format('Y-m-d H:i:s'),
                            'offline_ticket' => $offlineTicketAlreadyEntryBit,
                            'in_day_type' => $dayTypeEntry,
                            'in_payment_mode' => $inPaymentModeIdEntry,
                            'in_master_payment_mode' => $inMasterPaymentModeEntry,
                            'sync_at' => $createdAtOfflineEntryBit,
                            'barcode' => $barcodeEntry,
                            'entry_process_time' => $entryProcessTime,
                        ]);

                    $entryBitSuccess = "1";
                    $inUserIdEntry = "NULL";
                    $inShiftIdEntry = "NULL";

                    $transaction_details = DB::table('sps_transactions')
                        ->where('id', $spsTransactionId)
                        ->where('out_time', '0000-00-00 00:00:00')
                        ->whereNull('deleted_at')
                        ->first();
                    $transactionArray = $transaction_details ? (array) $transaction_details : [];
                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Offline Entry update query for transaction offline entry is 99 : $spsTransactionId" . PHP_EOL;
                    // JSON response instead of socket
                    return response()->json([
                        'status' => "success",
                        'message' => 'Offline Entry update query for transaction offline entry is 99',
                        'transaction_details' => $transactionArray
                    ]);

                    // Optional: API request / fundle API logic remains same but change echo to Log::info()

                } catch (\Exception $ex) {
                    if ($ex->getCode() == 1062) {
                        $entryGateInsertError = "104"; // Duplicate entry
                    }
                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Error in updating record for transaction offline entry is 99: $spsTransactionId and entry gate : $entryGateInsertError error message ". $ex->getMessage() . PHP_EOL;

                    return response()->json([
                        'status' => 'error',
                        'code' => $entryGateInsertError,
                        'message' => 'Error in updating record for entry gate offlineTicketAlreadyEntry is 99',
                    ], 500);
                }
            }else {
                if ( 
                    $inPaymentModeEntry == 0 &&
                    $transactionTypeInEntryGate == 5 &&
                    $PaymentEntryAmount == 0
                ) {
                    $inPaymentModeIdEntry = "0";
                    $inMasterPaymentModeEntry = "3";
                }

                // For manned entry
                if ($vhNumberEntry != "0" && $unmannedBit == "0") {

                    // Log start time
                    $queryStartTimeForAlreadyInsideCheck = microtime(true) - $conn_start;
                    $queryStartTimePrintForAlreadyInsideCheck = "query start time check already inside vehicle or not in database";
                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : " . $queryStartTimeForAlreadyInsideCheck . " : " . $queryStartTimePrintForAlreadyInsideCheck . PHP_EOL;

                    // Check if vehicle already inside
                    $alreadyInsideVehicle = DB::table('sps_transactions')
                        ->where('vehicle_number', $vhNumberEntry)
                        ->where('in_gate', '!=', '0')
                        ->whereNull('out_gate')
                        ->whereNull('deleted_at')
                        ->exists();

                    $time_elapsed_secsForAlreadyInsideCheck = microtime(true) - $start;
                    $queryEndTimePrintForAlreadyInsideCheck = "query end time check already inside vehicle or not in database";
                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : " . $time_elapsed_secsForAlreadyInsideCheck . " : " . $queryEndTimePrintForAlreadyInsideCheck . PHP_EOL;

                    if (
                        $alreadyInsideVehicle ||
                        ($transaction > 0 &&
                            $outGateAlreadyEntry == null &&
                            $inGateAlreadyEntry != "0")
                    ) {

                        // Instead of socket_write, return JSON response
                        $vehicleAlreadyInsideErrorLogEntry = "Vehicle is already inside";
                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : $vehicleAlreadyInsideErrorLogEntry : $vhNumberEntry" . PHP_EOL;
                        return response()->json([
                            'status' => 'error',
                            'code' => $vehicleAlreadyInsideError,
                            'message' => 'Vehicle is already inside.',
                        ], 500);
                    } else {

                        // Fallback values for RFID
                        if (
                            $inPaymentModeEntry == 0 &&
                            ($transactionTypeInEntryGate == 2 || $transactionTypeInEntryGate == 22) &&
                            $PaymentEntryAmount == 0
                        ) {
                            $inPaymentModeIdEntry = "1111";
                            $inMasterPaymentModeEntry = "3";
                        }

                        // Insert new transaction
                        $transactionData = [
                            'barcode' => $barcodeEntry,
                            'ticket_no' => $ticketNoEntry,
                            'in_time' => $inTimeEntry,
                            'vehicle_type' => $vehicleTypeEntry,
                            'vehicle_number' => $vhNumberEntry,
                            'in_shift_id' => $inShiftIdEntry,
                            'in_type' => $inTypeEntryGate,
                            'in_type_id' => $inTypeIdEntryGate,
                            'in_gate' => $inGateIdEntry,
                            'out_gate' => null,
                            'in_user_id' => $inUserIdEntry,
                            'in_payment_mode' => $inPaymentModeIdEntry,
                            'in_master_payment_mode' => $inMasterPaymentModeEntry,
                            'in_day_type' => $dayTypeEntry,
                            'in_tariff_code' => $tariffCodeEntry,
                            'in_foc_difference' => $focDifferenceEntry,
                            'in_membership_payment_amount' => $inMembershipPaymentAmountEntry,
                            'in_payment_referance_number' => $paymentReferenceNumberEntry,
                            'in_payment_amount' => $PaymentEntryAmount,
                            'in_standard_parking_amount' => $standardAmountEntry,
                            'in_foc' => $inFocEntryBit,
                            'in_foc_reason' => $inFocReasonIdEntry,
                            'in_foc_approval' => $inFocApproverIdEntry,
                            'is_nested' => $isNestedEntrys,
                            'location_id' => $locationIdEntry,
                            'area_id' => $areaIdEntry,
                            'is_cps' => $isCpsGateEntry,
                            'in_foc_note' => $focnotesEntry,
                            'total_payment_amount' => $totalPaymentAmountEntry,
                            'vip_membership_slot' => $statusForVipEntry,
                            'sync_at' => $createdAtOfflineEntryBit,
                            'offline_ticket' => $offlineTicketAlreadyEntryBit,
                            'entry_process_time' => $entryProcessTime,
                        ];

                        DB::table('sps_transactions')->insert($transactionData);
                        $successTransactionIdAtEntry = DB::getPdo()->lastInsertId();
                        $entryBitSuccess = "1";
                        $entrySuccessCodeCheckBits = "2";

                        $inUserIdEntry = null;
                        $inShiftIdEntry = null;

                        $transaction_details = DB::table('sps_transactions')
                            ->where('id', $successTransactionIdAtEntry)
                            ->where('out_time', '0000-00-00 00:00:00')
                            ->whereNull('deleted_at')
                            ->first();
                        $transactionArray = $transaction_details ? (array) $transaction_details : [];
                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Inserted transaction with ID: $successTransactionIdAtEntry" . PHP_EOL;
                        return response()->json([
                            'status' => "success",
                            'message' => 'Vehicle entry success 1',
                            'transaction_details' => $transactionArray
                        ]);

                        

                        // Check for RFID card used and update flags
                        if (($transactionTypeInEntryGate == 2 || $transactionTypeInEntryGate == 22) && $cardNoEntry > 0) {

                            DB::table('sps_membership_log')
                                ->where(DB::raw("CONCAT(card_no_prefix, card_no)"), '=', $cardNoEntry)
                                ->where('status', '1')
                                ->whereNull('deleted_at')
                                ->update(['is_card_used' => '1', 'updated_at' => Carbon::now()->format('Y-m-d H:i:s')]);

                            if ($tariffCodeEntry > 0) {
                                DB::table('sps_membership')
                                    ->where(DB::raw("CONCAT(card_no_prefix, card_no)"), '=', $cardNoEntry)
                                    ->where('status', '1')
                                    ->whereNull('deleted_at')
                                    ->update(['balance' => $balanceRemainingRfidCardEntry, 'updated_at' => Carbon::now()->format('Y-m-d H:i:s')]);

                                DB::table('sps_membership_bal_noti')->insert([
                                    'transaction_id' => $successTransactionIdAtEntry,
                                    'cps_id' => null,
                                    'card_no' => $cardNoEntry,
                                    'transaction_at' => 'ENTRY',
                                    'is_notify' => 1,
                                ]);

                                $log .= Carbon::now()->format('Y-m-d H:i:s') . " : RFID balance and log updated for card $cardNoEntry" . PHP_EOL;
                            }
                        }
                    }
                }elseif ($vhNumberEntry != "0" && $unmannedBit == "1") {

                    if (
                        $inPaymentModeEntry == 0 &&
                        ($transactionTypeInEntryGate == 2 || $transactionTypeInEntryGate == 22) &&
                        $PaymentEntryAmount == 0
                    ) {
                        $inPaymentModeIdEntry = "1111";
                        $inMasterPaymentModeEntry = "3";
                    }

                    try {
                        $successTransactionIdAtEntry = DB::table('sps_transactions')->insertGetId([
                            'barcode'                     => $barcodeEntry,
                            'ticket_no'                  => $ticketNoEntry,
                            'in_time'                    => $inTimeEntry,
                            'vehicle_type'               => $vehicleTypeEntry,
                            'vehicle_number'             => $vhNumberEntry,
                            'in_shift_id'                => $inShiftIdEntry,
                            'in_type'                    => $inTypeEntryGate,
                            'in_type_id'                 => $inTypeIdEntryGate,
                            'in_gate'                    => $inGateIdEntry,
                            'out_gate'                   => null,
                            'in_user_id'                 => $inUserIdEntry,
                            'in_payment_mode'            => $inPaymentModeIdEntry,
                            'in_master_payment_mode'     => $inMasterPaymentModeEntry,
                            'in_day_type'                => $dayTypeEntry,
                            'in_tariff_code'             => $tariffCodeEntry,
                            'in_foc_difference'          => $focDifferenceEntry,
                            'in_membership_payment_amount' => $inMembershipPaymentAmountEntry,
                            'in_payment_referance_number' => $paymentReferenceNumberEntry,
                            'in_payment_amount'          => $PaymentEntryAmount,
                            'in_standard_parking_amount' => $standardAmountEntry,
                            'in_foc'                     => $inFocEntryBit,
                            'in_foc_reason'              => $inFocReasonIdEntry,
                            'in_foc_approval'            => $inFocApproverIdEntry,
                            'is_nested'                  => $isNestedEntrys,
                            'location_id'                => $locationIdEntry,
                            'area_id'                    => $areaIdEntry,
                            'is_cps'                     => $isCpsGateEntry,
                            'in_foc_note'                => $focnotesEntry,
                            'total_payment_amount'       => $totalPaymentAmountEntry,
                            'vip_membership_slot'        => $statusForVipEntry,
                            'sync_at'                    => $createdAtOfflineEntryBit,
                            'offline_ticket'             => $offlineTicketAlreadyEntryBit,
                            'entry_process_time'         => $entryProcessTime,
                        ]);

                        $entryBitSuccess = "1";
                        $entrySuccessCodeCheckBits = "2";

                        $inUserIdEntry = null;
                        $inShiftIdEntry = null;

                        $transaction_details = DB::table('sps_transactions')
                            ->where('id', $successTransactionIdAtEntry)
                            ->where('out_time', '0000-00-00 00:00:00')
                            ->whereNull('deleted_at')
                            ->first();
                        $transactionArray = $transaction_details ? (array) $transaction_details : [];
                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Entry Success transaction id Sent : $successTransactionIdAtEntry" . PHP_EOL;

                        // Instead of socket_write(), return JSON
                        return response()->json([
                            'status' => "success",
                            'message' => 'Vehicle entry success 2',
                            'transaction_details' => $transactionArray
                        ]);

                    } catch (\Exception $e) {
                        if ($e->getCode() == 1062) {
                            $entryGateInsertError = "104"; // Duplicate
                            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Duplicate Entry Detected : " . $e->getMessage() . PHP_EOL;
                        } else {
                            $entryGateInsertError = "107"; // General insert failure
                            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Insert Error : " . $e->getMessage() . PHP_EOL;
                        }

                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Entry error : $entryGateInsertError" . PHP_EOL;
                        return response()->json([
                            'status' => 'error',
                            'code' => $entryGateInsertError,
                            'message' => 'Error in updating record for entry gate! 2',
                        ], 500);
                    }

                    // ---- RFID processing (keep inside try block or separate logic block) ----

                    if (
                        ($transactionTypeInEntryGate == 2 || $transactionTypeInEntryGate == 22) &&
                        $cardNoEntry > 0
                    ) {
                        DB::table('sps_membership_log')
                            ->whereRaw("CONCAT(card_no_prefix, card_no) = ?", [$cardNoEntry])
                            ->whereNull('deleted_at')
                            ->where('status', 1)
                            ->update(['is_card_used' => 1, 'updated_at' => Carbon::now()->format('Y-m-d H:i:s')]);

                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : RFID marked as used for card : $cardNoEntry" . PHP_EOL;

                        if ($tariffCodeEntry > 0) {
                            DB::table('sps_membership')
                                ->whereRaw("CONCAT(card_no_prefix, card_no) = ?", [$cardNoEntry])
                                ->whereNull('deleted_at')
                                ->where('status', 1)
                                ->update(['balance' => $balanceRemainingRfidCardEntry, 'updated_at' => Carbon::now()->format('Y-m-d H:i:s')]);

                            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : RFID balance updated for card : $cardNoEntry" . PHP_EOL;

                            $balanceNotiId = DB::table('sps_membership_bal_noti')->insertGetId([
                                'transaction_id' => $successTransactionIdAtEntry,
                                'cps_id' => null,
                                'card_no' => $cardNoEntry,
                                'transaction_at' => 'ENTRY',
                                'is_notify' => '1',
                            ]);

                            //balance_deduction($balanceNotiId, $baseUrl);
                            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Balance notification inserted and deduction triggered" . PHP_EOL;
                        } else {
                            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : RFID tariff not set. Balance update skipped" . PHP_EOL;
                        }
                    }

                    // ---- Optional Fundle API Call Logging ----
                }else {
                    // for unmanned entry

                    //avoid duplicate entry of card number with offline and online    
                    if ($cardNoEntry > 0) {
                        // Line added on 07-09-2018 to put payment mode and master payment mode in transaction table incase of RFID ----
                        if (
                            $inPaymentModeEntry == 0 &&
                            ($transactionTypeInEntryGate == 2 ||
                                $transactionTypeInEntryGate == 22) &&
                            $PaymentEntryAmount == 0
                        ) {
                            $inPaymentModeIdEntry = "1111";
                            $inMasterPaymentModeEntry = "3";
                        }

                        //---- query start time----
                        $queryStartTimeForAlreadyInsideCheck1 = microtime(true) - $conn_start;
                        $queryStartTimePrintForAlreadyInsideCheck1 = "query start time check already inside vehicle or not in database(avoid duplicate entry in card no)";
                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : " . $queryStartTimeForAlreadyInsideCheck1 . " : " . $queryStartTimePrintForAlreadyInsideCheck1 . PHP_EOL;

                        //---- query end time ----
                        $time_elapsed_secsForAlreadyInsideCheck1 = microtime(true) - $start;
                        $queryEndTimePrintForAlreadyInsideCheck1 = "query end time check already inside vehicle or not in database(avoid duplicat entry1 in card no)";
                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : " . $time_elapsed_secsForAlreadyInsideCheck1 . " : " . $queryEndTimePrintForAlreadyInsideCheck1 . PHP_EOL;

                        //---- check for vehicle already inside or not ----
                        //---- insert data at sps_transactions table ----
                        try{
                            $successTransactionIdAtEntry = DB::table('sps_transactions')->insertGetId([
                                'barcode' => $barcodeEntry,
                                'ticket_no' => $ticketNoEntry,
                                'in_time' => $inTimeEntry,
                                'vehicle_type' => $vehicleTypeEntry,
                                'vehicle_number' => $vhNumberEntry,
                                'in_shift_id' => $inShiftIdEntry,
                                'in_type' => $inTypeEntryGate,
                                'in_type_id' => $inTypeIdEntryGate,
                                'in_gate' => $inGateIdEntry,
                                'out_gate' => null,
                                'in_user_id' => $inUserIdEntry,
                                'in_payment_mode' => $inPaymentModeIdEntry,
                                'in_master_payment_mode' => $inMasterPaymentModeEntry,
                                'in_day_type' => $dayTypeEntry,
                                'in_tariff_code' => $tariffCodeEntry,
                                'in_foc_difference' => $focDifferenceEntry,
                                'in_membership_payment_amount' => $inMembershipPaymentAmountEntry,
                                'in_payment_referance_number' => $paymentReferenceNumberEntry,
                                'in_payment_amount' => $PaymentEntryAmount,
                                'in_standard_parking_amount' => $standardAmountEntry,
                                'in_foc' => $inFocEntryBit,
                                'in_foc_reason' => $inFocReasonIdEntry,
                                'in_foc_approval' => $inFocApproverIdEntry,
                                'is_nested' => $isNestedEntrys,
                                'location_id' => $locationIdEntry,
                                'area_id' => $areaIdEntry,
                                'is_cps' => $isCpsGateEntry,
                                'in_foc_note' => $focnotesEntry,
                                'total_payment_amount' => $totalPaymentAmountEntry,
                                'vip_membership_slot' => $statusForVipEntry,
                                'sync_at' => $createdAtOfflineEntryBit,
                                'offline_ticket' => $offlineTicketAlreadyEntryBit,
                                'entry_process_time' => $entryProcessTime
                            ]);

                            $transaction_details = DB::table('sps_transactions')
                                ->where('id', $successTransactionIdAtEntry)
                                ->where('out_time', '0000-00-00 00:00:00')
                                ->whereNull('deleted_at')
                                ->first();
                            $transactionArray = $transaction_details ? (array) $transaction_details : [];
                            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Insert Transaction 1 : Success ID: " . $successTransactionIdAtEntry . PHP_EOL;
                            $vehicleTypeEntry = null;
                            $inUserIdEntry = null;
                            $inShiftIdEntry = null;
                            
                            //---- packet sent successfully ----
                            return response()->json([
                                'status' => "success",
                                'message' => 'Vehicle entry success 3',
                                'transaction_details' => $transactionArray
                            ]);

                            //---- check bit for success ----
                            $entryBitSuccess = "1";
                            $entrySuccessCodeCheckBits = "2";
                            
                            //---- remaining data update for rfid card into database ----
                            if (
                                ($transactionTypeInEntryGate == 2 ||
                                    $transactionTypeInEntryGate == 22) &&
                                $cardNoEntry > 0
                            ) {
                                $affectedRows = DB::table('sps_membership_log')
                                    ->where(DB::raw("CONCAT(card_no_prefix,card_no)"), $cardNoEntry)
                                    ->where('status', '1')
                                    ->whereNull('deleted_at')
                                    ->update([
                                        'is_card_used' => '1',
                                        'updated_at' => DB::raw('now()')
                                    ]);

                                $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Record updated for RFID used. Affected rows: " . $affectedRows . PHP_EOL;

                                if ($balanceRemainingRfidCardEntry != "-1") {
                                    $affectedRows = DB::table('sps_membership')
                                        ->where(DB::raw("CONCAT(card_no_prefix,card_no)"), $cardNoEntry)
                                        ->where('status', '1')
                                        ->whereNull('deleted_at')
                                        ->update([
                                            'balance' => $balanceRemainingRfidCardEntry,
                                            'updated_at' => DB::raw('Now()')
                                        ]);

                                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Record updated for RFID balance. Affected rows: " . $affectedRows . PHP_EOL;

                                    // entry for balance noti table
                                    $lastInsertId = DB::table('sps_membership_bal_noti')->insertGetId([
                                        'transaction_id' => $successTransactionIdAtEntry,
                                        'cps_id' => null,
                                        'card_no' => $cardNoEntry,
                                        'transaction_at' => 'ENTRY',
                                        'is_notify' => '1'
                                    ]);

                                    if ($lastInsertId) {
                                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Record inserted in Balance Noti table. ID: " . $lastInsertId . PHP_EOL;
                                        //balance_deduction($lastInsertId, $baseUrl);
                                    } else {
                                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Error in inserting record for Rfid in balance Noti Table" . PHP_EOL;
                                    }
                                }
                            }
                        } catch (\Exception $e) {
                            //---- already inside vehicle to solved issued on 27/09/18 ----
                            if ($e->getCode() == 1062) {
                                $log .= Carbon::now()->format('Y-m-d H:i:s') . " : duplicate error code: 1062" . PHP_EOL;
                                $entryGateInsertError = "104";
                            }
                            $entryGateSuccess = null;
                            
                            return response()->json([
                                'status' => 'error',
                                'code' => $entryGateInsertError,
                                'message' => 'Error in updating record for entry gate 3!',
                            ], 500);
                            
                            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Error in inserting record for entry gate 3!" . PHP_EOL;
                        }
                    } else {
                        //---- check for same barcode already inside or not in database ----
                        if($isFastagIdEntry == 1) {
                            $affectedRows = DB::table('sps_transactions')
                                ->where('barcode', $barcodeEntry)
                                ->whereNull('deleted_at')
                                ->update([
                                    'ticket_no' => $ticketNoEntry,
                                    'in_time' => $inTimeEntry,
                                    'vehicle_type' => $vehicleTypeEntry,
                                    'vehicle_number' => $vhNumberEntryFastag,
                                    'in_shift_id' => $inShiftIdEntry,
                                    'in_type' => $inTypeEntryGate,
                                    'in_type_id' => $inTypeIdEntryGate,
                                    'in_gate' => $inGateIdEntry,
                                    'out_gate' => null,
                                    'in_user_id' => $inUserIdEntry,
                                    'in_payment_mode' => $inPaymentModeIdEntry,
                                    'in_master_payment_mode' => $inMasterPaymentModeEntry,
                                    'in_day_type' => $dayTypeEntry,
                                    'in_tariff_code' => $tariffCodeEntry,
                                    'in_foc_difference' => $focDifferenceEntry,
                                    'in_membership_payment_amount' => $inMembershipPaymentAmountEntry,
                                    'in_payment_referance_number' => $paymentReferenceNumberEntry,
                                    'in_payment_amount' => $PaymentEntryAmount,
                                    'in_standard_parking_amount' => $standardAmountEntry,
                                    'in_foc' => $inFocEntryBit,
                                    'in_foc_reason' => $inFocReasonIdEntry,
                                    'in_foc_approval' => $inFocApproverIdEntry,
                                    'is_nested' => $isNestedEntrys,
                                    'location_id' => $locationIdEntry,
                                    'area_id' => $areaIdEntry,
                                    'is_cps' => $isCpsGateEntry,
                                    'in_foc_note' => $focnotesEntry,
                                    'total_payment_amount' => $totalPaymentAmountEntry,
                                    'vip_membership_slot' => $statusForVipEntry,
                                    'sync_at' => $createdAtOfflineEntryBit,
                                    'offline_ticket' => $offlineTicketAlreadyEntryBit,
                                    'entry_process_time' => $entryProcessTime
                                ]);

                            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Update Transaction query for failed fastag. Affected rows: " . $affectedRows . PHP_EOL;

                            if ($affectedRows !== false) {
                                if ($affectedRows > 0) {
                                    $beforeData = DB::table('sps_transactions')
                                        ->where('barcode', $barcodeEntry)
                                        ->whereNull('deleted_at')
                                        ->first(['id']);
                                    
                                    $upsuccessTranasactionId = $beforeData->id;
                                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Record updated successfully of failed transaction of fastag " . $upsuccessTranasactionId . PHP_EOL;
                                } else {
                                    $beforeData = DB::table('sps_transactions')
                                        ->where('barcode', $barcodeEntry)
                                        ->whereNull('deleted_at')
                                        ->first(['id']);
                                    
                                    $upsuccessTranasactionId = $beforeData->id;
                                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Record updated successfully of failed transaction of fastag but no changes " . $upsuccessTranasactionId . PHP_EOL;
                                }
                                $transaction_details = DB::table('sps_transactions')
                                    ->where('id', $upsuccessTranasactionId)
                                    ->where('out_time', '0000-00-00 00:00:00')
                                    ->whereNull('deleted_at')
                                    ->first();
                                $transactionArray = $transaction_details ? (array) $transaction_details : [];
                                return response()->json([
                                    'status' => "success",
                                    'message' => 'Vehicle entry success 4',
                                    'transaction_details' => $transactionArray
                                ]);
                                
                                $fastagFailedUpdate = 1;
                            } else {
                                $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Error in updating record failed transaction of fastag" . PHP_EOL;
                                $fastagFailedUpdate = 0;
                                $entryGateInsertError = "104";
                                return response()->json([
                                    'status' => 'error',
                                    'code' => $entryGateInsertError,
                                    'message' => 'Error in updating record for entry gate 3!',
                                ], 500);
                                
                                $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Error in updating record" . PHP_EOL;
                            }
                        }

                        if (
                            $transaction > 0 &&
                            $outGateAlreadyEntry == null &&
                            $inGateAlreadyEntry != "0"
                        ) {
                            if($fastagFailedUpdate == "1") {
                                $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Record updated successfully of failed transaction of fastag for pay at entry" . PHP_EOL;
                            } else {
                                $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Vehicle is already inside:" . $barcodeEntry . PHP_EOL;

                                return response()->json([
                                    'status' => 'error',
                                    'code' => $vehicleAlreadyInsideError,
                                    'message' => 'Vehicle is already inside:',
                                ], 500);
                            }
                        } else {
                            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : inside insert for unmaned" . PHP_EOL;
                            
                            try{
                                $successTransactionIdAtEntry = DB::table('sps_transactions')->insertGetId([
                                    'barcode' => $barcodeEntry,
                                    'ticket_no' => $ticketNoEntry,
                                    'in_time' => $inTimeEntry,
                                    'vehicle_type' => $vehicleTypeEntry,
                                    'vehicle_number' => $vhNumberEntry,
                                    'in_shift_id' => $inShiftIdEntry,
                                    'in_type' => $inTypeEntryGate,
                                    'in_type_id' => $inTypeIdEntryGate,
                                    'in_gate' => $inGateIdEntry,
                                    'out_gate' => null,
                                    'in_user_id' => $inUserIdEntry,
                                    'in_payment_mode' => $inPaymentModeIdEntry,
                                    'in_master_payment_mode' => $inMasterPaymentModeEntry,
                                    'in_day_type' => $dayTypeEntry,
                                    'in_tariff_code' => $tariffCodeEntry,
                                    'in_foc_difference' => $focDifferenceEntry,
                                    'in_membership_payment_amount' => $inMembershipPaymentAmountEntry,
                                    'in_payment_referance_number' => $paymentReferenceNumberEntry,
                                    'in_payment_amount' => $PaymentEntryAmount,
                                    'in_standard_parking_amount' => $standardAmountEntry,
                                    'in_foc' => $inFocEntryBit,
                                    'in_foc_reason' => $inFocReasonIdEntry,
                                    'in_foc_approval' => $inFocApproverIdEntry,
                                    'is_nested' => $isNestedEntrys,
                                    'location_id' => $locationIdEntry,
                                    'area_id' => $areaIdEntry,
                                    'is_cps' => $isCpsGateEntry,
                                    'in_foc_note' => $focnotesEntry,
                                    'total_payment_amount' => $totalPaymentAmountEntry,
                                    'vip_membership_slot' => $statusForVipEntry,
                                    'sync_at' => $createdAtOfflineEntryBit,
                                    'offline_ticket' => $offlineTicketAlreadyEntryBit,
                                    'entry_process_time' => $entryProcessTime
                                ]);

                                $transaction_details = DB::table('sps_transactions')
                                    ->where('id', $successTransactionIdAtEntry)
                                    ->where('out_time', '0000-00-00 00:00:00')
                                    ->whereNull('deleted_at')
                                    ->first();
                                $transactionArray = $transaction_details ? (array) $transaction_details : [];
                                $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Insert Transaction query for unmaned. Success ID: " . $successTransactionIdAtEntry . PHP_EOL;

                                
                                $vehicleTypeEntry = null;
                                $inUserIdEntry = null;
                                $inShiftIdEntry = null;
                                return response()->json([
                                    'status' => "success",
                                    'message' => 'Vehicle entry success unmanned 5',
                                    'transaction_details' => $transactionArray
                                ]);
                                
                                $entryBitSuccess = "1";
                                $entrySuccessCodeCheckBits = "2";

                                if (
                                    $transactionTypeInEntryGate == 2 &&
                                    $cardNoEntry > 0
                                ) {
                                    $affectedRows = DB::table('sps_membership_log')
                                        ->where(DB::raw("CONCAT(card_no_prefix,card_no)"), $cardNoEntry)
                                        ->where('status', '1')
                                        ->whereNull('deleted_at')
                                        ->update([
                                            'is_card_used' => '1',
                                            'updated_at' => DB::raw('now()')
                                        ]);

                                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Record updated for RFID used. Affected rows: " . $affectedRows . PHP_EOL;

                                    if ($balanceRemainingRfidCardEntry != "-1") {
                                        $affectedRows = DB::table('sps_membership')
                                            ->where(DB::raw("CONCAT(card_no_prefix,card_no)"), $cardNoEntry)
                                            ->where('status', '1')
                                            ->whereNull('deleted_at')
                                            ->update([
                                                'balance' => $balanceRemainingRfidCardEntry,
                                                'updated_at' => DB::raw('Now()')
                                            ]);

                                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Record updated for RFID balance. Affected rows: " . $affectedRows . PHP_EOL;

                                        $lastInsertId = DB::table('sps_membership_bal_noti')->insertGetId([
                                            'transaction_id' => $successTransactionIdAtEntry,
                                            'cps_id' => null,
                                            'card_no' => $cardNoEntry,
                                            'transaction_at' => 'ENTRY',
                                            'is_notify' => '1'
                                        ]);

                                        if ($lastInsertId) {
                                            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Record inserted in Balance Noti table. ID: " . $lastInsertId . PHP_EOL;
                                            //balance_deduction($lastInsertId, $baseUrl);
                                        } else {
                                            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Error in inserting record for Rfid in balance Noti Table" . PHP_EOL;
                                        }
                                    }
                                }
                            }catch (\Exception $e) {
                                if ($e->getCode() == 1062) {
                                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : duplicate error code: 1062" . PHP_EOL;
                                    $entryGateInsertError = "104";
                                }
                                $entryGateSuccess = null;
                                $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Error in inserting record for entry gate!" . PHP_EOL;
                                return response()->json([
                                    'status' => 'error',
                                    'code' => $entryGateInsertError,
                                    'message' => 'Error in inserting record for entry gate',
                                ], 500);
                                
                                
                            }
                        }
                    }
                }
            }
            
            // $statusTransaction = DB::transaction(function () use (&$request, &$response, &$updateTransactionForFastagTagDetailForPayment) {
            //     //Get input request parameters
            //     $input = $request->all();
            //     $checkShiftManagement = $this->checkShiftManagementValidation($input);
            //     if (!is_array($checkShiftManagement)) {
            //         throw new Exception($checkShiftManagement);
            //     }

            //     $area = $checkShiftManagement['area'];
            //     $location = $checkShiftManagement['location'];
            //     $gate = $checkShiftManagement['gate'];
            //     $userId = $checkShiftManagement['userId'];
            //     $shiftId = $checkShiftManagement['shiftId'];
            //     $laneId = $input['laneId'];
            //     $txnBarCode = $input['barCode'];
            //     $vehicleNumber = !empty($input['vehicleNumber']) ? $input['vehicleNumber'] : "0";
            //     $tariff = !empty($input['tariff']) ? $input['tariff'] : "";
            //     $fastagExcutionType = $input['fastagExcutionType'];

            //     $isF8Txn = false;
            //     $f8TxnData = [];


            //     $sql = 'Select * from sps_transactions WHERE barcode= "'.$txnBarCode.'" AND deleted_at IS NULL';
            //     $results = DB::select(DB::raw($sql));


            //     //print_r(DB::getQueryLog());
            //     if (isset($results[0])) {
            //         $f8TxnData = $results[0];
            //         if($results[0]->f_eight == 1){
            //             $isF8Txn = true;
            //         }else{
            //             $isF8Txn = false;
            //         }
            //     } else {
            //         $isF8Txn = false;
            //     }


                
            //     if($fastagExcutionType == "direct"){

            //         //$this->directTransactionFastag($request);
            //         $fastagExcutionType = $input['fastagExcutionType'];
        
            //         $mixvehicleNumberArray = explode("-",  $vehicleNumber);
            
            //         $transactionVehicleNumber =  $mixvehicleNumberArray[0];
            //         $fastagVehicleNumber =  $mixvehicleNumberArray[1];
            

            //     }

                
            //     if (!$this->validateLocationAreaCode($location->location_code, $area->area_code)) {
            //         throw new Exception('Invalid Location or Area Code');
            //     }


            //     if($input['Fastags']['Fastag']){
            //         if ($this->FastagEntry->getBlockVehicleDetails($input)) { //check blocked vehicle on exit
            //             throw new \Exception('RFID Member Vehicle');
            //         }
            //         $fastags = $input['Fastags']['Fastag'];
                    
            //     }else{
            //         $fastags = [];
            //         throw new Exception('FasTag Not Found');
    
    
            //     }



                
               
            //     $fastagType = "";


               
            //     //if (!empty($fastags)) {


            //         if ($vehicleNumber != "0") {
                        
            //             if($isF8Txn){
            //                 $response = $f8TxnData;
            //             }else{
            //                 if($fastagExcutionType == "direct"){
            //                     $response = $this->FastagEntry->getTransactionDetailByVehicleNo($transactionVehicleNumber, $fastags);
            //                     $response->vehicle_number = $fastagVehicleNumber;
            //                 }else{
            //                     $response = $this->FastagEntry->getTransactionDetailByVehicleNo($vehicleNumber, $fastags);

            //                 }
            //             }
            //             //$response = $this->FastagEntry->getTransactionDetail($fastags);
            //             $fastagType = "exit";
            //         } else {

            //             if($isF8Txn){
            //                 $response = $f8TxnData;
            //             }else{

            //                 $response = $this->FastagEntry->getTransactionDetail($fastags);
            //             }
            //             $fastagType = "txn";


            //         }


            //         $fastagType = "exit";

                    

            //         if (!empty($response)) {
            //             // Checking transaction ID , data is saved properly or not.
            //             $transaction = $response;

            //             $vehicleNumber = $transaction->vehicle_number;
            //             if (!empty($transaction->id)) {
            //                 if (!empty($fastags && is_array($fastags))) {
            //                     foreach ($fastags as $fastag) {

            //                         $validator = Validator::make($fastag, [
            //                             "epc_id" => "required|string|min:24",
            //                             "t_id" => "required|string|min:24",
            //                             "tag_signature_data_hex" => "required|string",
            //                         ]);

            //                         $fastagEntry = new FastagEntry();
            //                         $fastagEntry->txn_id = $transaction->id;
            //                         $fastagEntry->vehicle_no = $transaction->vehicle_number;
            //                         $fastagEntry->fastag_id = $fastag['tag_id'];
            //                         $fastagEntry->fastag_no = $fastag['tag_id'];
            //                         $fastagEntry->tag_signature_data_hex = $fastag['tag_signature_data_hex'];
            //                         $fastagEntry->tag_vrn = $fastag['tag_vrn'];
            //                         $fastagEntry->issuer_bank_id = $fastag['issuer_bank_id'];
            //                         $fastagEntry->tag_v_class = $fastag['tag_v_class'];
            //                         $fastagEntry->rfu = $fastag['rfu'];
            //                         $fastagEntry->epc_id = $fastag['epc_id'];
            //                         $fastagEntry->user_memory = $fastag['user_memory'];
            //                         $fastagEntry->used_for_payment = "1";
            //                         $fastagEntry->created_at = date('Y-m-d H:i:s');
            //                         $fastagEntry->save();

            //                         //print_r(DB::getQueryLog());

            //                     }
            //                 }
            //             }

            //         }else {
            //             throw new Exception('Vehicle not found');
            //         }
            //         //print_r($response);
            //         //die("dfdfdfdf");
            //         // if (!$response) {
            //         //     throw new Exception('Transaction is not found');
            //         // }
            //     //} else {
            //     //    throw new Exception('FASTag IDs are not found');
            //     //}

            //     //print_r($response);

            //     // call FASTag Engine for updating FASTag tag details e.g. vehicle no, tag status
            //     $updateTransactionForFastagTagDetailForPayment = $this->updateTransactionForFastagTagDetailForPayment($response, $laneId, $fastagType, $fastags);

            // });


            // if ($updateTransactionForFastagTagDetailForPayment != "00") {
            //     //throw new Exception($updateTransactionForFastagTagDetailForPayment);
            //     //$responseMessage = $this->getFastagErrorMessage($updateTransactionForFastagTagDetailForPayment);

            //     $fastagExecMessage = $response->fastag_exec_message;
            //     $fastagTagId = $response->fastag_id;
            //     //die("here");
            //     //print_r($updateTransactionForFastagTagDetailForPayment);

            //     $responseMessage_final = $this->getFastagErrorMessage($updateTransactionForFastagTagDetailForPayment);
            //     $responseMessage = "TAG Id: " . $fastagTagId . ", Error: ".$updateTransactionForFastagTagDetailForPayment."-". $responseMessage_final . " - " . $fastagExecMessage . ". Please Manually exit vehicle.";


            //     if (str_contains($responseMessage, '#423#')) { 
            //         return $this->sendFastageError(' Error: ' . $responseMessage, [], 423);
            //     }else{
            //         return $this->sendFastageError(' Error: ' . $responseMessage, [], 422);
            //     }

            //     //print_r($response);
            //     //return $this->sendFastageResponse($response, $responseMessage, 422);
                

            // } else {

            //     if (is_null($statusTransaction)) {
            //         $this->createLog(true, $this->logPath, "Get FASTag Information Transaction ", $request->all(), $this->sendFastageResponse($response, 'Successfully'));
            //         return $this->sendFastageResponse($response, 'Successfully');

            //     } else {

            //         throw new Exception('Transaction is not found');
            //     }

            // }


        } catch (\Exception $e) {

            //print_r($e->getMessage());
            $this->createLog(false, $this->logPath, "FASTag info Transaction ", $request->all(), $this->sendFastageError(' Error: ' . $e->getMessage(), [], 422));

            $responseMessage = "";
            if (is_numeric($e->getMessage())) {
                $responseMessage = $this->getFastagErrorMessage($e->getMessage());
            } else {
                //print_r($e->getMessage());
                $responseMessage = $e->getMessage()." ";
            }

            $responseMessage = $responseMessage . ". Please use F8 for exit vehicle.";

            //$responseMessage = $e->getMessage();

            if($e->getMessage() == "Vehicle not found"){
                return $this->sendFastageError(' Error: ' . $responseMessage, [], 421);
            }else{

                if (str_contains($responseMessage, '#423#')) { 
                    return $this->sendFastageError(' Error: ' . $responseMessage, [], 423);
                }else{
                    return $this->sendFastageError(' Error: ' . $responseMessage, [], 422);
                }
            }
        }
    }*/

    public function transactionPayOnEntryFastag(FASTagRequest $request){
        $response = '';
        $updateTransactionForFastagTagDetailForPayment = "";
        $entryGateSuccess = "207";
        $vehicleAlreadyInsideError = "104";
        $fastagFailedUpdate = "0";
        DB::beginTransaction();
        try{
            //dd($request->all());
            $input = $request->all();
            $log = "-----------Log start for fastag " . date('Y-m-d H:i:s') . " pay on entry--------------" . PHP_EOL;
            $start = microtime(true);
            $conn_start = microtime(true);
            $inTimeEntry                     = $request->input('inTime');
            $gate_IP                     = $request->input('gateIP');
            $camera_port                     = env('CAMERA_IMAGE_PORT',8123);
            $vehicleTypeEntry               = $request->input('vehicle_type');
            $inGateIdEntry                  = $request->input('in_gate');
            $inUserIdEntry                  = $request->input('in_user_id');
            $vhNumberEntry                  = $request->input('vehicle_number');
            $barcodeEntry                   = $request->input('in_barcode');
            $transactionTypeInEntryGate     = $request->input('in_type');
            $cardNoEntry                    = $request->input('rfid_card_number');
            $PaymentEntryAmount             = $request->input('in_payment_amount');
            $inPaymentModeEntry             = $request->input('in_payment_mode');
            $inPaymentDiscountAmountEntry  = $request->input('discount_amount');
            $inPaymentDiscountTypeEntry    = $request->input('discount_type');
            $inPaymentDiscountTypeIDEntry  = $request->input('discount_type_id');
            $inPaymentDiscountValueEntry   = $request->input('discount_value');
            $inPaymentDiscountValueTypeEntry = $request->input('discount_value_type');
            $isCpsGateEntry                 = $request->input('is_cps_gate');
            $focReasonNameEntrys            = $request->input('foc_reason_name');
            $focnotesEntry                  = $request->input('foc_notes');
            $focApproversNameEntrys        = $request->input('foc_approver_name');
            $additionalChargesEntry        = $request->input('additional_charges');
            $ticketNoEntry                  = $request->input('ticket_no');
            $tariffCodeEntry                = $request->input('tariff_code');
            $focDifferenceEntry             = $request->input('foc_difference');
            $paymentReferenceNumberEntry   = $request->input('payment_reference_number');
            $inMembershipPaymentAmountEntry = $request->input('membership_payment_amount');
            $dayTypeEntry                   = $request->input('in_day_type');
            $isNestedEntrys                 = $request->input('is_nested');
            $taxDataEntry                   = $request->input('in_tax_entry');
            $vipBitEntrys                   = $request->input('vip_bit');
            $balanceRemainingRfidCardEntry = $request->input('rfid_balance_remaining');
            $standardAmountEntry            = $request->input('in_standard_parking_amount');
            $voucherPlanEntry               = $request->input('voucher_plan');
            $entryFirstImage                = "http://".$gate_IP.":".$camera_port."/ipcamera/camera1/temp.jpg";
            $entrySecondImage               = "http://".$gate_IP.":".$camera_port."/ipcamera/camera2/temp.jpg";
            $offineBitEntry                 = $request->input('offline_bit');
            $inShiftIdEntry                 = $request->input('in_shift_id');
            $entryThirdImage                = "http://".$gate_IP.":".$camera_port."/ipcamera/camera2/temp.bmp";
            $unmannedBit                    = $request->input('unmanned_bit');
            $anprJsonStringEntry            = $request->input('anpr_json_string');

            $vhNumberEntryFastag = $vhNumberEntry;

            $transaction_details = DB::table('sps_transactions')
                ->where('vehicle_number', $vhNumberEntry)
                ->where('out_time', '0000-00-00 00:00:00')
                ->whereNull('deleted_at')
                ->first();
            
            if($transaction_details){
                throw new Exception('Vehicle already inside');
            }

            $createdAt = Carbon::now()->format('Y-m-d H:i:s');
            $entryProcessTime = Carbon::now()->format('Y-m-d H:i:s');

            // Total payment amount
            $totalPaymentAmountEntry = $PaymentEntryAmount + $inMembershipPaymentAmountEntry;
            $log .= "Total Payment Amount: $totalPaymentAmountEntry" . PHP_EOL;
            $log .= "Transaction Type In Entry Gate: $transactionTypeInEntryGate" . PHP_EOL;

            $log .= "Default to Casual Entry\n";
            $inTypeIdEntryGate = 0;
            $inTypeEntryGate = 1;

            $log .= "Fetching Payment Mode: $inPaymentModeEntry" . PHP_EOL;

            $paymentMode = PaymentModes::where('payment_mode', $inPaymentModeEntry)
                ->whereNull('deleted_at')
                ->first();

            if ($inPaymentModeEntry === "Dynamic QR") {
                $inPaymentModeIdEntry = 5;
                $inMasterPaymentModeEntry = 4;
                $log .= "Dynamic QR payment mode detected. Set paymentModeId=5, masterPaymentModeId=4" . PHP_EOL;
            } elseif ($paymentMode) {
                $inPaymentModeIdEntry = $paymentMode->id;
                $inMasterPaymentModeEntry = $paymentMode->master_id;
                $log .= "Payment Mode ID: $inPaymentModeIdEntry, Master ID: $inMasterPaymentModeEntry" . PHP_EOL;
            } else {
                $log .= "Payment mode '$inPaymentModeEntry' not found in DB." . PHP_EOL;
                $inPaymentModeIdEntry = null;
                $inMasterPaymentModeEntry = null;
            }

            $setting = Settings::whereNull('deleted_at')->first();

            if ($setting) {
                $areaIdEntry = $setting->area_id;
                $locationIdEntry = $setting->location_id;
                $log .= "Fetched Area ID: $areaIdEntry, Location ID: $locationIdEntry" . PHP_EOL;
            } else {
                $areaIdEntry = null;
                $locationIdEntry = null;
                $log .= "Settings record not found." . PHP_EOL;
            }

            // Initialize default variables
            $spsTransactionId = null;
            $finalEnfImageName = null;
            $finalImageName = null;
            $offlineTicketAlreadyEntry = 0;

            // Log transaction packet initiation
            $log .= "---- Transaction Entry packet(4444) ----" . PHP_EOL;

            // Log query execution time
            $queryStartTimeForEntryBarcode = microtime(true) - $conn_start;
            $queryStartTimePrintForEntryBarcode = "Query start time for check offline ticket exit in barcode";
            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : $queryStartTimeForEntryBarcode : $queryStartTimePrintForEntryBarcode" . PHP_EOL;

            $log .= "Searching transaction with barcode: $barcodeEntry" . PHP_EOL;

            // Query with binary comparison for barcode, ignoring deleted records
            $transaction = Transaction::whereRaw('BINARY barcode = ?', [$barcodeEntry])
                ->whereNull('deleted_at')
                ->first();

            if ($transaction) {
                $spsTransactionId = $transaction->id;
                $offlineTicketAlreadyEntry = $transaction->offline_ticket;
                $outGateAlreadyEntry = $transaction->out_gate;
                $inShiftIdAlreadyInsideEntry = $transaction->in_shift_id;
                $inGateAlreadyEntry = $transaction->in_gate;
                $isCpsBitFromTransactionTable = $transaction->is_cps;
                $isFastagIdAvailable = $transaction->fastag_id;
                $isFastagIdEntry = 1;

                $log .= "Record found: transaction ID: $spsTransactionId" . PHP_EOL;
                $log .= "Offline Ticket: $offlineTicketAlreadyEntry" . PHP_EOL;
                $log .= "Out Gate: $outGateAlreadyEntry" . PHP_EOL;
                $log .= "In Shift ID: $inShiftIdAlreadyInsideEntry" . PHP_EOL;
                $log .= "In Gate: $inGateAlreadyEntry" . PHP_EOL;
                $log .= "Is CPS bit: $isCpsBitFromTransactionTable" . PHP_EOL;
                $log .= "Fastag ID available: $isFastagIdAvailable" . PHP_EOL;
            } else {
                $spsTransactionId = null;
                $offlineTicketAlreadyEntry = null;
                $outGateAlreadyEntry = null;
                $inShiftIdAlreadyInsideEntry = null;
                $inGateAlreadyEntry = null;
                $isCpsBitFromTransactionTable = null;
                $isFastagIdAvailable = null;
                $isFastagIdEntry = 0;

                $log .= "No transaction record found for barcode: $barcodeEntry" . PHP_EOL;
            }

            if ($offineBitEntry === "1") {
                $createdAtOfflineEntryBit = date("Y-m-d H:i:s");
                $log .= "Entry bit is offline" . PHP_EOL;

                if ($spsTransactionId > 0) {
                    if ($isCpsBitFromTransactionTable === "1") {
                        $log .= "Inside CPS bit = 1 for offline condition" . PHP_EOL;

                        if (!is_null($offlineTicketAlreadyEntry)) {
                            switch ($offlineTicketAlreadyEntry) {
                                case "12":
                                    $offlineTicketAlreadyEntryBit = "13";
                                    break;
                                case "15":
                                    $offlineTicketAlreadyEntryBit = "16";
                                    break;
                                case "17":
                                    $offlineTicketAlreadyEntryBit = "18";
                                    break;
                                case "3":
                                    $offlineTicketAlreadyEntryBit = "4";
                                    break;
                                default:
                                    $offlineTicketAlreadyEntryBit = "1";
                            }
                        } else {
                            $offlineTicketAlreadyEntryBit = "1";
                        }
                    } else {
                        if (in_array($offlineTicketAlreadyEntry, ["3", "99"])) {
                            $offlineTicketAlreadyEntryBit = "4";
                        } else {
                            $offlineTicketAlreadyEntryBit = "1";
                        }
                    }
                } else {
                    $offlineTicketAlreadyEntryBit = "1";
                }
            } else {
                $createdAtOfflineEntryBit = "";
                $offlineTicketAlreadyEntryBit = "DEFAULT";
                $log .= "Record is online, default ticket bit assigned: $offlineTicketAlreadyEntryBit" . PHP_EOL;
            }

            // Fallback values for RFID
            if (
                $inPaymentModeEntry == 0 &&
                ($transactionTypeInEntryGate == 2 || $transactionTypeInEntryGate == 22) &&
                $PaymentEntryAmount == 0
            ) {
                $inPaymentModeIdEntry = "1111";
                $inMasterPaymentModeEntry = "3";
            }

            // Insert new transaction
            $transactionData = [
                'barcode' => $barcodeEntry,
                'ticket_no' => $ticketNoEntry,
                'in_time' => $inTimeEntry,
                'vehicle_type' => $vehicleTypeEntry,
                'vehicle_number' => $vhNumberEntry,
                'in_shift_id' => $inShiftIdEntry,
                'in_type' => $inTypeEntryGate,
                'in_type_id' => $inTypeIdEntryGate,
                'in_gate' => $inGateIdEntry,
                'out_gate' => null,
                'in_user_id' => $inUserIdEntry,
                'in_payment_mode' => $inPaymentModeIdEntry,
                'in_master_payment_mode' => $inMasterPaymentModeEntry,
                'in_day_type' => $dayTypeEntry,
                'in_tariff_code' => $tariffCodeEntry,
                'in_foc_difference' => $focDifferenceEntry,
                'in_membership_payment_amount' => $inMembershipPaymentAmountEntry,
                'in_payment_referance_number' => $paymentReferenceNumberEntry,
                'in_payment_amount' => $PaymentEntryAmount,
                'in_standard_parking_amount' => $standardAmountEntry,
                'in_foc' => 0,
                'in_foc_reason' => 0,
                'in_foc_approval' => 0,
                'is_nested' => $isNestedEntrys,
                'location_id' => $locationIdEntry,
                'area_id' => $areaIdEntry,
                'is_cps' => $isCpsGateEntry,
                'in_foc_note' => $focnotesEntry,
                'total_payment_amount' => $totalPaymentAmountEntry,
                'vip_membership_slot' => 0,
                'sync_at' => $createdAtOfflineEntryBit,
                'offline_ticket' => $offlineTicketAlreadyEntryBit,
                'entry_process_time' => $entryProcessTime,
            ];

            //DB::table('sps_transactions')->insert($transactionData);
            //$successTransactionIdAtEntry = DB::getPdo()->lastInsertId();
            $successTransactionIdAtEntry = DB::table('sps_transactions')->insertGetId($transactionData);
            $entryBitSuccess = "1";
            $entrySuccessCodeCheckBits = "2";

            if($successTransactionIdAtEntry > 0){
                $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Inside image section" . PHP_EOL;
                $entryEnfImage = "enf";
                $entryEnvImage = "env";
                $entryEncImage = "enc";
                $imageTimestampName = date("YmdHis");
                $md5OfTransactionId = md5($successTransactionIdAtEntry);
                $created_at = date("Y-m-d H:i:s");

                /*if ($entryFirstImage != "NULL" && $entryFirstImage != "-1") {
                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : inside image enf" . PHP_EOL;
                    $fullImageNameEnf = $entryEnfImage . "_" . $imageTimestampName . "_" . $successTransactionIdAtEntry;
                    $fileName = "$fullImageNameEnf.jpg";
                    $storagePath = storage_path('images/transactions');

                    if (!file_exists($storagePath)) {
                        $oldmask = umask(0);
                        mkdir($storagePath, 0777, true);
                    }

                    file_put_contents("$storagePath/$fileName", base64_decode($entryFirstImage));
                    
                    DB::table('sps_images')->insert([
                        'module' => 'Entry',
                        'module_id' => $successTransactionIdAtEntry,
                        'file_name' => $fileName,
                        'created_at' => $created_at
                    ]);
                }

                if ($entrySecondImage != "NULL" && $entrySecondImage != "-1") {
                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : inside image env" . PHP_EOL;
                    $fullImageNameEnvEntry = $entryEnvImage . "_" . $imageTimestampName . "_" . $successTransactionIdAtEntry;
                    $fileName = "$fullImageNameEnvEntry.jpg";
                    $storagePath = storage_path('images/transactions');

                    if (!file_exists($storagePath)) {
                        $oldmask = umask(0);
                        mkdir($storagePath, 0777, true);
                    }
                    file_put_contents("$storagePath/$fileName", base64_decode($entrySecondImage));
                    
                    DB::table('sps_images')->insert([
                        'module' => 'Entry',
                        'module_id' => $successTransactionIdAtEntry,
                        'file_name' => $fileName,
                        'created_at' => $created_at
                    ]);
                }

                if ($entryThirdImage != "NULL" && $entryThirdImage != "-1" && $entryThirdImage != "#") {
                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : inside image enc" . PHP_EOL;
                    $fullImageNameEncEntry = $entryEncImage . "_" . $imageTimestampName . "_" . $successTransactionIdAtEntry;
                    $fileName = "$fullImageNameEncEntry.bmp";
                    $storagePath = storage_path('images/transactions');

                    if (!file_exists($storagePath)) {
                        $oldmask = umask(0);
                        mkdir($storagePath, 0777, true);
                    }
                    file_put_contents("$storagePath/$fileName", base64_decode($entryThirdImage));
                    
                    DB::table('sps_images')->insert([
                        'module' => 'Entry',
                        'module_id' => $successTransactionIdAtEntry,
                        'file_name' => $fileName,
                        'created_at' => $created_at
                    ]);
                }*/

                $storagePath = storage_path('images/transactions');

                // Ensure the directory exists
                if (!file_exists($storagePath)) {
                    $oldmask = umask(0);
                    mkdir($storagePath, 0777, true);
                    umask($oldmask);
                }

                // First Image
                if ($entryFirstImage != "NULL" && $entryFirstImage != "-1") {
                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : inside image enf" . PHP_EOL;
                    $fullImageNameEnf = $entryEnfImage . "_" . $imageTimestampName . "_" . $successTransactionIdAtEntry;
                    $fileName = "$fullImageNameEnf.jpg";
                    $fullPath = "$storagePath/$fileName";

                    if ($this->downloadImageFromMicropc($entryFirstImage, $fullPath)) {
                        DB::table('sps_images')->insert([
                            'module' => 'Entry',
                            'module_id' => $successTransactionIdAtEntry,
                            'file_name' => $fileName,
                            'created_at' => $created_at
                        ]);
                    } else {
                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : failed to download ENF image: $entryFirstImage" . PHP_EOL;
                    }
                }

                // Second Image
                if ($entrySecondImage != "NULL" && $entrySecondImage != "-1") {
                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : inside image env" . PHP_EOL;
                    $fullImageNameEnvEntry = $entryEnvImage . "_" . $imageTimestampName . "_" . $successTransactionIdAtEntry;
                    $fileName = "$fullImageNameEnvEntry.jpg";
                    $fullPath = "$storagePath/$fileName";

                    if ($this->downloadImageFromMicropc($entrySecondImage, $fullPath)) {
                        DB::table('sps_images')->insert([
                            'module' => 'Entry',
                            'module_id' => $successTransactionIdAtEntry,
                            'file_name' => $fileName,
                            'created_at' => $created_at
                        ]);
                    } else {
                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : failed to download ENV image: $entrySecondImage" . PHP_EOL;
                    }
                }

                // Third Image
                if ($entryThirdImage != "NULL" && $entryThirdImage != "-1" && $entryThirdImage != "#") {
                    $log .= Carbon::now()->format('Y-m-d H:i:s') . " : inside image enc" . PHP_EOL;
                    $fullImageNameEncEntry = $entryEncImage . "_" . $imageTimestampName . "_" . $successTransactionIdAtEntry;
                    $fileName = "$fullImageNameEncEntry.bmp";
                    $fullPath = "$storagePath/$fileName";

                    if ($this->downloadImageFromMicropc($entryThirdImage, $fullPath)) {
                        DB::table('sps_images')->insert([
                            'module' => 'Entry',
                            'module_id' => $successTransactionIdAtEntry,
                            'file_name' => $fileName,
                            'created_at' => $created_at
                        ]);
                    } else {
                        $log .= Carbon::now()->format('Y-m-d H:i:s') . " : failed to download ENC image: $entryThirdImage" . PHP_EOL;
                    }
                }

                /*if ($anprJsonStringEntry > 0) {
                    metadata_string($conn, $successTransactionIdAtEntry, $anprJsonStringEntry, $created_at);
                }*/

                $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Transaction Entry Success: $entryGateSuccess" . PHP_EOL;
            }

            $inUserIdEntry = null;
            $inShiftIdEntry = null;

            $transaction_details = DB::table('sps_transactions')
                ->where('id', $successTransactionIdAtEntry)
                ->where('out_time', '0000-00-00 00:00:00')
                ->whereNull('deleted_at')
                ->first();
            $transactionArray = $transaction_details ? (array) $transaction_details : [];
            $log .= Carbon::now()->format('Y-m-d H:i:s') . " : Inserted transaction with ID: $successTransactionIdAtEntry" . PHP_EOL;
            /*return response()->json([
                'status' => "success",
                'message' => 'Vehicle entry success 1',
                'transaction_details' => $transactionArray
            ]);*/
            $checkShiftManagement = $this->checkShiftManagementValidation($input);
            if (!is_array($checkShiftManagement)) {
                throw new Exception($checkShiftManagement);
            }

            $area = $checkShiftManagement['area'];
            $location = $checkShiftManagement['location'];
            $gate = $checkShiftManagement['gate'];
            $userId = $checkShiftManagement['userId'];
            $shiftId = $checkShiftManagement['shiftId'];
            $laneId = $input['laneId'];
            $txnBarCode = $input['barCode'];
            $vehicleNumber = !empty($input['vehicleNumber']) ? $input['vehicleNumber'] : "0";
            $tariff = !empty($input['tariff']) ? $input['tariff'] : "";
            $fastagExcutionType = $input['fastagExcutionType'];

            $isF8Txn = false;
            $f8TxnData = [];


            $sql = 'Select * from sps_transactions WHERE barcode= "'.$txnBarCode.'" AND deleted_at IS NULL';
            $results = DB::select(DB::raw($sql));


            //print_r(DB::getQueryLog());
            if (isset($results[0])) {
                $f8TxnData = $results[0];
                if($results[0]->f_eight == 1){
                    $isF8Txn = true;
                }else{
                    $isF8Txn = false;
                }
            } else {
                $isF8Txn = false;
            }


            
            if($fastagExcutionType == "direct"){

                //$this->directTransactionFastag($request);
                $fastagExcutionType = $input['fastagExcutionType'];
    
                $mixvehicleNumberArray = explode("-",  $vehicleNumber);
        
                $transactionVehicleNumber =  $mixvehicleNumberArray[0];
                $fastagVehicleNumber =  $mixvehicleNumberArray[1];
        

            }

            
            if (!$this->validateLocationAreaCode($location->location_code, $area->area_code)) {
                throw new Exception('Invalid Location or Area Code');
            }


            if($input['Fastags']['Fastag']){
                if ($this->FastagEntry->getBlockVehicleDetails($input)) { //check blocked vehicle on exit
                    throw new \Exception('RFID Member Blocked Vehicle');
                }
                $fastags = $input['Fastags']['Fastag'];
                
            }else{
                $fastags = [];
                throw new Exception('FasTag data not found in request');


            }

            $fastagType = "";
            if ($vehicleNumber != "0") {
                        
                if($isF8Txn){
                    $response = $f8TxnData;
                }else{
                    if($fastagExcutionType == "direct"){
                        $response = $this->FastagEntry->getTransactionDetailByVehicleNo($transactionVehicleNumber, $fastags);
                        $response->vehicle_number = $fastagVehicleNumber;
                    }else{
                        $response = $this->FastagEntry->getTransactionDetailByVehicleNo($vehicleNumber, $fastags);

                    }
                }
                //$response = $this->FastagEntry->getTransactionDetail($fastags);
                $fastagType = "exit";
            } else {

                if($isF8Txn){
                    $response = $f8TxnData;
                }else{

                    $response = $this->FastagEntry->getTransactionDetail($fastags);
                }
                $fastagType = "txn";


            }


            $fastagType = "exit";

            

            if (!empty($response)) {
                // Checking transaction ID , data is saved properly or not.
                $transaction = $response;

                $vehicleNumber = $transaction->vehicle_number;
                if (!empty($transaction->id)) {
                    if (!empty($fastags && is_array($fastags))) {
                        foreach ($fastags as $fastag) {

                            $validator = Validator::make($fastag, [
                                "epc_id" => "required|string|min:24",
                                "t_id" => "required|string|min:24",
                                "tag_signature_data_hex" => "required|string",
                            ]);

                            $fastagEntry = new FastagEntry();
                            $fastagEntry->txn_id = $transaction->id;
                            $fastagEntry->vehicle_no = $transaction->vehicle_number;
                            $fastagEntry->fastag_id = $fastag['tag_id'];
                            $fastagEntry->fastag_no = $fastag['tag_id'];
                            $fastagEntry->tag_signature_data_hex = $fastag['tag_signature_data_hex'];
                            $fastagEntry->tag_vrn = $fastag['tag_vrn'];
                            $fastagEntry->issuer_bank_id = $fastag['issuer_bank_id'];
                            $fastagEntry->tag_v_class = $fastag['tag_v_class'];
                            $fastagEntry->rfu = $fastag['rfu'];
                            $fastagEntry->epc_id = $fastag['epc_id'];
                            $fastagEntry->user_memory = $fastag['user_memory'];
                            $fastagEntry->used_for_payment = "1";
                            $fastagEntry->created_at = date('Y-m-d H:i:s');
                            $fastagEntry->save();

                            //print_r(DB::getQueryLog());

                        }
                    }
                }

            }else {
                throw new Exception('Vehicle not found');
            }
            //sleep(4);
            //$updateTransactionForFastagTagDetailForPayment = $this->updateTransactionForFastagTagDetailForPayment($response, $laneId, $fastagType, $fastags);
            $fastagDetailsArr = $this->validateFastagUpdateDetails($vehicleNumber,$fastags,$laneId);
            if(isset($fastagDetailsArr) && !empty($fastagDetailsArr) && $fastagDetailsArr['status'] == true){
                if($response->is_cps == 1){
                    Transaction::where('id', $response->id)
                    ->update([
                        'fastag_vehicle_no' => $fastagDetailsArr['fastag_vehicle_no'],
                        'fastag_epc' => $fastagDetailsArr['fastag_epc'],
                        'fastag_id' => strtolower($fastagDetailsArr['fastag_id']),
                        'fastag_exec_code' => $fastagDetailsArr['fastag_exec_code'],
                        'fastag_exec_message' => $fastagDetailsArr['fastag_exec_message'],
                    ]);

                }else{
                    Transaction::where('id', $response->id)
                    ->update([
                        'fastag_vehicle_no' => $fastagDetailsArr['fastag_vehicle_no'],
                        'fastag_epc' => $fastagDetailsArr['fastag_epc'],
                        'fastag_id' => strtolower($fastagDetailsArr['fastag_id']),
                        'fastag_exec_code' => $fastagDetailsArr['fastag_exec_code'],
                        'fastag_exec_message' => $fastagDetailsArr['fastag_exec_message'],
                        'fastag_lane' => $fastagDetailsArr['fastag_lane'],
                    ]);

                }
            }else{
                throw new Exception($fastagDetailsArr['message']);
            }
            //dd($updateTransactionForFastagTagDetailForPayment);
            /*if ($updateTransactionForFastagTagDetailForPayment != "00") {
                DB::rollback();
                //throw new Exception($updateTransactionForFastagTagDetailForPayment);
                //$responseMessage = $this->getFastagErrorMessage($updateTransactionForFastagTagDetailForPayment);

                $statusCode = $updateTransactionForFastagTagDetailForPayment['status'];
                $fastagMessageDetail = $updateTransactionForFastagTagDetailForPayment['message'];
                if($statusCode == "450"){
                    return $this->sendFastageError($fastagMessageDetail. ". Please switch payment mode.", [], 422);
                }elseif($statusCode == "451"  && str_contains($fastagMessageDetail, '#423#')){
                    return $this->sendFastageError("Vehicle number mismatch.", [], 423);
                }elseif($statusCode == "452"){
                    return $this->sendFastageError($fastagMessageDetail. ". Please switch payment mode.", [], 422);
                }else{
                    $responseMessage_final = $this->getFastagErrorMessage($updateTransactionForFastagTagDetailForPayment);
                    $fastagMessageDetail = isset($responseMessage_final) ? $responseMessage_final : "Fastag message not found";
                    return $this->sendFastageError($fastagMessageDetail. ". Please switch payment mode.", [], 422);
                }
            } else {

                if ($response) {
                    $this->createLog(true, $this->logPath, "Get FASTag Information Transaction ", $request->all(), $this->sendFastageResponse($response, 'Successfully'));
                    DB::commit();
                    return $this->sendFastageResponse($response, 'Successfully');

                } else {

                    throw new Exception('Transaction is not found');
                }

            }*/
            if ($response) {
                DB::commit();
                $this->createLog(true, $this->logPath, "Get FASTag Information Transaction ", $request->all(), $this->sendFastageResponse($response, 'Successfully'));
                return $this->sendFastageResponse($response, 'Successfully');

            } else {

                throw new Exception('Transaction is not found');
            }

            //return $this->sendFastageResponse($transactionArray, 'Successfully');
        }catch(\Exception $e){
            DB::rollback();
            //print_r($e->getMessage());
            $this->createLog(false, $this->logPath, "FASTag info Transaction ", $request->all(), $this->sendFastageError(' Error: ' . $e->getMessage(), [], 422));

            $responseMessage = "";
            if (is_numeric($e->getMessage())) {
                $responseMessage = $this->getFastagErrorMessage($e->getMessage());
            } else {
                //print_r($e->getMessage());
                $responseMessage = $e->getMessage()." ";
            }

            $responseMessage = $responseMessage . ". Please switch payment mode.";

            //$responseMessage = $e->getMessage();

            if($e->getMessage() == "Vehicle not found"){
                //DB::rollback();
                $responseMessage = "Vehicle not found. Please enter vehicle number manually.";
                return $this->sendFastageError($responseMessage, [], 421);
            }else{

                if (str_contains($responseMessage, '#423#')) {
                    //DB::rollback(); 
                    return $this->sendFastageError("Vehicle number mismatch.", [], 423);
                }else{
                    //DB::rollback();
                    return $this->sendFastageError($responseMessage, [], 422);
                }
            }
        }
    }

    function downloadImageFromMicropc($url, $savePath)
    {
        // Add timeout context (optional but recommended)
        $context = stream_context_create([
            'http' => [
                'timeout' => 5  // 5 seconds timeout
            ]
        ]);

        $imageData = @file_get_contents($url, false, $context);
        if ($imageData === false) {
            return false;
        }

        return file_put_contents($savePath, $imageData) !== false;
    }

    public function transactionFastag_ollddd(FASTagRequest $request)
    {
        $response = '';
        $updateTransactionForFastagTagDetailForPayment = "";
      

        try {

            $statusTransaction = DB::transaction(function () use (&$request, &$response, &$updateTransactionForFastagTagDetailForPayment) {
                //Get input request parameters
                $input = $request->all();
                $checkShiftManagement = $this->checkShiftManagementValidation($input);
                if (!is_array($checkShiftManagement)) {
                    throw new Exception($checkShiftManagement);
                }

                $area = $checkShiftManagement['area'];
                $location = $checkShiftManagement['location'];
                $gate = $checkShiftManagement['gate'];
                $userId = $checkShiftManagement['userId'];
                $shiftId = $checkShiftManagement['shiftId'];
                $laneId = $input['laneId'];
                $vehicleNumber = !empty($input['vehicleNumber']) ? $input['vehicleNumber'] : "0";
                $tariff = !empty($input['tariff']) ? $input['tariff'] : "";

                $fastagExcutionType = $input['fastagExcutionType'];
                
                if($fastagExcutionType == "direct"){

                    //$this->directTransactionFastag($request);
                    $fastagExcutionType = $input['fastagExcutionType'];
        
                    $mixvehicleNumberArray = explode("-",  $vehicleNumber);
            
                    $transactionVehicleNumber =  $mixvehicleNumberArray[0];
                    $fastagVehicleNumber =  $mixvehicleNumberArray[1];
            

                }

                
                if (!$this->validateLocationAreaCode($location->location_code, $area->area_code)) {
                    throw new Exception('Invalid Location or Area Code');
                }


                if($input['Fastags']['Fastag']){
                    if ($this->FastagEntry->getBlockVehicleDetails($input)) { //check blocked vehicle on exit
                        throw new \Exception('RFID Member Vehicle');
                    }
    
                    $fastags = $input['Fastags']['Fastag'];

                }else{
                    $fastags = [];
                }



                
               
                $fastagType = "";


               
                //if (!empty($fastags)) {


                    if ($vehicleNumber != "0") {

                        if($fastagExcutionType == "direct"){
                            $response = $this->FastagEntry->getTransactionDetailByVehicleNo($transactionVehicleNumber, $fastags);
                            $response->vehicle_number = $fastagVehicleNumber;
                        }else{
                            $response = $this->FastagEntry->getTransactionDetailByVehicleNo($vehicleNumber, $fastags);

                        }
                        //$response = $this->FastagEntry->getTransactionDetail($fastags);
                        $fastagType = "exit";
                    } else {

                        $response = $this->FastagEntry->getTransactionDetail($fastags);
                        $fastagType = "txn";

                    }


                    $fastagType = "exit";

                    

                    if (!empty($response)) {
                        // Checking transaction ID , data is saved properly or not.
                        $transaction = $response;

                        $vehicleNumber = $transaction->vehicle_number;
                        if (!empty($transaction->id)) {
                            if (!empty($fastags && is_array($fastags))) {
                                foreach ($fastags as $fastag) {

                                    $validator = Validator::make($fastag, [
                                        "epc_id" => "required|string|min:24",
                                        "t_id" => "required|string|min:24",
                                        "tag_signature_data_hex" => "required|string",
                                    ]);

                                    $fastagEntry = new FastagEntry();
                                    $fastagEntry->txn_id = $transaction->id;
                                    $fastagEntry->vehicle_no = $transaction->vehicle_number;
                                    $fastagEntry->fastag_id = $fastag['tag_id'];
                                    $fastagEntry->fastag_no = $fastag['tag_id'];
                                    $fastagEntry->tag_signature_data_hex = $fastag['tag_signature_data_hex'];
                                    $fastagEntry->tag_vrn = $fastag['tag_vrn'];
                                    $fastagEntry->issuer_bank_id = $fastag['issuer_bank_id'];
                                    $fastagEntry->tag_v_class = $fastag['tag_v_class'];
                                    $fastagEntry->rfu = $fastag['rfu'];
                                    $fastagEntry->epc_id = $fastag['epc_id'];
                                    $fastagEntry->user_memory = $fastag['user_memory'];
                                    $fastagEntry->used_for_payment = "1";
                                    $fastagEntry->created_at = date('Y-m-d H:i:s');
                                    $fastagEntry->save();

                                    //print_r(DB::getQueryLog());

                                }
                            }
                        }

                    }else {
                        throw new Exception('Vehicle not found');
                    }
                    //print_r($response);
                    //die("dfdfdfdf");
                    // if (!$response) {
                    //     throw new Exception('Transaction is not found');
                    // }
                //} else {
                //    throw new Exception('FASTag IDs are not found');
                //}

                //print_r($response);

                // call FASTag Engine for updating FASTag tag details e.g. vehicle no, tag status
                $updateTransactionForFastagTagDetailForPayment = $this->updateTransactionForFastagTagDetailForPayment($response, $laneId, $fastagType, $fastags);

            });


            if ($updateTransactionForFastagTagDetailForPayment != "00") {
                //throw new Exception($updateTransactionForFastagTagDetailForPayment);
                //$responseMessage = $this->getFastagErrorMessage($updateTransactionForFastagTagDetailForPayment);

                $fastagExecMessage = $response->fastag_exec_message;
                $fastagTagId = $response->fastag_id;
                //die("here");
                //print_r($updateTransactionForFastagTagDetailForPayment);

                $responseMessage_final = $this->getFastagErrorMessage($updateTransactionForFastagTagDetailForPayment);
                $responseMessage = "TAG Id: " . $fastagTagId . ", Error: ".$updateTransactionForFastagTagDetailForPayment."-". $responseMessage_final . " - " . $fastagExecMessage . ". Please Manually exit vehicle.";


                if (str_contains($responseMessage, '#423#')) { 
                    return $this->sendFastageError(' Error: ' . $responseMessage, [], 423);
                }else{
                    return $this->sendFastageError(' Error: ' . $responseMessage, [], 422);
                }

                //print_r($response);
                //return $this->sendFastageResponse($response, $responseMessage, 422);
                

            } else {

                if (is_null($statusTransaction)) {
                    $this->createLog(true, $this->logPath, "Get FASTag Information Transaction ", $request->all(), $this->sendFastageResponse($response, 'Successfully'));
                    return $this->sendFastageResponse($response, 'Successfully');

                } else {

                    throw new Exception('Transaction is not found');
                }

            }


        } catch (\Exception $e) {

            //print_r($e->getMessage());
            $this->createLog(false, $this->logPath, "FASTag info Transaction ", $request->all(), $this->sendFastageError(' Error: ' . $e->getMessage(), [], 422));

            $responseMessage = "";
            if (is_numeric($e->getMessage())) {
                $responseMessage = $this->getFastagErrorMessage($e->getMessage());
            } else {
                //print_r($e->getMessage());
                $responseMessage = $e->getMessage()." ";
            }

            $responseMessage = $responseMessage . ". Please use F8 for exit vehicle.";

            //$responseMessage = $e->getMessage();

            if($e->getMessage() == "Vehicle not found"){
                return $this->sendFastageError(' Error: ' . $responseMessage, [], 421);
            }else{

                if (str_contains($responseMessage, '#423#')) { 
                    return $this->sendFastageError(' Error: ' . $responseMessage, [], 423);
                }else{
                    return $this->sendFastageError(' Error: ' . $responseMessage, [], 422);
                }
            }
        }
    }




    public function directTransactionFastag($request){


        $input = $request->all();
        $checkShiftManagement = $this->checkShiftManagementValidation($input);
        if (!is_array($checkShiftManagement)) {
            throw new Exception($checkShiftManagement);
        }

        $area = $checkShiftManagement['area'];
        $location = $checkShiftManagement['location'];
        $gate = $checkShiftManagement['gate'];
        $userId = $checkShiftManagement['userId'];
        $shiftId = $checkShiftManagement['shiftId'];
        $laneId = $input['laneId'];
        $vehicleNumber = !empty($input['vehicleNumber']) ? $input['vehicleNumber'] : "0";
        $tariff = !empty($input['tariff']) ? $input['tariff'] : "";

        $fastagExcutionType = $input['fastagExcutionType'];
        
        $mixvehicleNumberArray = explode("-",  $vehicleNumber);

        $transactionVehicleNumber =  $mixvehicleNumberArray[0];
        $fastagVehicleNumber =  $mixvehicleNumberArray[1];

        


        if (!$this->validateLocationAreaCode($location->location_code, $area->area_code)) {
            throw new Exception('Invalid Location or Area Code');
        }

        if ($this->FastagEntry->getBlockVehicleDetails($input)) { //check blocked vehicle on exit
            throw new \Exception('RFID Member Vehicle');
        }


        //$fastags = $input['Fastags']['Fastag'];

        if($input['Fastags']['Fastag']){
            // if ($this->FastagEntry->getBlockVehicleDetails($input)) { //check blocked vehicle on exit
            //     throw new \Exception('RFID Member Vehicle');
            // }

            $fastags = $input['Fastags']['Fastag'];

        }else{
            $fastags = [];
        }




        $fastagType = "";



        if (!empty($fastags)) {


            if ($vehicleNumber != "0") {
                $response = $this->FastagEntry->getTransactionDetailByVehicleNo($transactionVehicleNumber, $fastags);
                //$response = $this->FastagEntry->getTransactionDetail($fastags);
                $fastagType = "exit";
            } else {

                $response = $this->FastagEntry->getTransactionDetail($fastags);
                $fastagType = "txn";

            }

            $response->vehicle_number = $fastagVehicleNumber;



            $fastagType = "exit";

            if (!empty($response)) {
                // Checking transaction ID , data is saved properly or not.
                $transaction = $response;

                $vehicleNumber = $fastagVehicleNumber;
                if (!empty($transaction->id)) {
                    if (!empty($fastags && is_array($fastags))) {
                        foreach ($fastags as $fastag) {

                            $validator = Validator::make($fastag, [
                                "epc_id" => "required|string|min:24",
                                "t_id" => "required|string|min:24",
                                "tag_signature_data_hex" => "required|string",
                            ]);


                            $fastagEntry = new FastagEntry();
                            $fastagEntry->txn_id = $transaction->id;
                            $fastagEntry->vehicle_no = $fastagVehicleNumber;
                            $fastagEntry->fastag_id = $fastag['tag_id'];
                            $fastagEntry->fastag_no = $fastag['tag_id'];
                            $fastagEntry->tag_signature_data_hex = $fastag['tag_signature_data_hex'];
                            $fastagEntry->tag_vrn = $fastag['tag_vrn'];
                            $fastagEntry->issuer_bank_id = $fastag['issuer_bank_id'];
                            $fastagEntry->tag_v_class = $fastag['tag_v_class'];
                            $fastagEntry->rfu = $fastag['rfu'];
                            $fastagEntry->epc_id = $fastag['epc_id'];
                            $fastagEntry->user_memory = $fastag['user_memory'];
                            $fastagEntry->used_for_payment = "1";
                            $fastagEntry->created_at = date('Y-m-d H:i:s');
                            $fastagEntry->save();

                        }
                    }
                }

            }else {
                throw new Exception('Vehicle not found');
            }
            //print_r($response);
            //die("dfdfdfdf");
            // if (!$response) {
            //     throw new Exception('Transaction is not found');
            // }
        } else {
            throw new Exception('FASTag IDs are not found');
        }

        //print_r($response);

        // call FASTag Engine for updating FASTag tag details e.g. vehicle no, tag status
        $updateTransactionForFastagTagDetailForPayment = $this->updateTransactionForFastagTagDetailForPayment($response, $laneId, $fastagType, $fastags);

    }


    
    public function requestPayFastag(FASTagRequest $request)
    {
        $response = [];
        $responseMsg = '';
        $transactionDetails = '';
        try {

            $statusExitTransaction = DB::transaction(function () use (&$request, &$response, &$responseMsg, &$transactionDetails) {
                //Get input request parameters
                $input = $request->all();
                $isFastagPayment = $input['isFastagPayment'];
                $barcode = $input['Barcode'];
                $laneId = $input['laneId'];
                $setting = $this->settings;
                $checkShiftManagement = $this->checkShiftManagementValidation($input, "Exit");

                if (!is_array($checkShiftManagement)) {
                    throw new Exception($checkShiftManagement);
                }

                $area = $checkShiftManagement['area'];
                $location = $checkShiftManagement['location'];
                $gate = $checkShiftManagement['gate'];
                $userId = $checkShiftManagement['userId'];
                $shiftId = $checkShiftManagement['shiftId'];

                $fastags = "";
                $transactionId = '';
                $response = [];


                $isF8Txn = false;
                $isCPSTxn = false;
                $f8TxnData = [];


                $sql = 'Select * from sps_transactions WHERE barcode= "'.$barcode.'" AND deleted_at IS NULL';
                $results = DB::select(DB::raw($sql));


                //print_r(DB::getQueryLog());
                if (isset($results[0])) {
                    $f8TxnData = $results[0];
                    if($results[0]->f_eight == 1){
                        $isF8Txn = true;
                    }else{
                        $isF8Txn = false;
                    }

                    if($results[0]->is_cps == 1){
                        $isCPSTxn = true;
                    }else{
                        $isCPSTxn = false;
                    }

                } else {
                    $isF8Txn = false;
                }




                if($isF8Txn){
                    $transaction = $f8TxnData;
                }else{
                    $transaction = $this->FastagEntry->getTransactionDetailByBarcode($barcode);

                }

                

                if (!$transaction) {
                    throw new Exception('Vehicle Not Present. Use F8 for exit Vehicle');
                }
                $transactionId = $transaction->id;


                // $checkIfVehicleExist = Transaction::where('vehicle_number',$vehicleNo)->where('out_time', '=', '0000-00-00 00:00:00')->count();
                // //dd(DB::getQueryLog());
                // if ($checkIfVehicleExist > 1) {
                //     Transaction::where('id', $txnid)-> ();
                //     throw new \Exception('There are some error with fastag, Please choose other payment method.');
                // }



                if($isF8Txn){
                    $checkExitTransaction = (array)$f8TxnData;
                }else{
                    // Checking exit vehicle
                    $checkExitTransaction = $this->FastagEntry->checkVehicleExitTransaction($transaction->id);

                    if ($checkExitTransaction === true) {
                        throw new Exception('Vehicle Already Exited.');
                    }
                }



                $dayTypeExit = $this->getDaytype($area->area_id, $location->location_id, $input['OutTime']);

                //Getting FASTag Payment Modes
                $paymentMode = $this->PaymentMode->getpaymentModeList(["keyword" => "FASTag", "perpage" => false]);
                $paymentMode = $paymentMode->toArray();

                //Out Gate ID
                $outPaymentModeId = isset($paymentMode['data'][0]['id']) ? $paymentMode['data'][0]['id'] : 8;

                $transactionDetails = $checkExitTransaction;
                $inGateId = $transactionDetails['in_gate'];
                $inTimeEntry = $transactionDetails['in_time'];
                $vehicleType = $transactionDetails['vehicle_type'];
                $transactionData = [];
                $transactionData['vehicle_info'] = $transactionDetails;
                $transactionData['id'] = $transactionId;
                $transactionData['barcode'] = $transactionDetails['barcode'];
                $transactionData['vehicle_type'] = $vehicleType;
                $transactionData['vehicle_number'] = $transactionDetails['vehicle_number'];

                $transactionData['in_time'] = $inTimeEntry;
                $transactionData['out_time'] = $input['OutTime'];
                $transactionData['in_gate'] = $inGateId;
                $transactionData['out_gate'] = $gate->gate_id;
                $transactionData['location'] = $location;
                $transactionData['area'] = $area;
                $outGateId = $gate->gate_id;
                $outGateType=$gate->gate_type;
                $payAmount = $input['tariff'];
                $paymentOrderId = '';
                






                $outMasterPaymentMode = isset($paymentMode['data'][0]['master_id']) ? $paymentMode['data'][0]['master_id'] : 4;
                $outTypeId = 0;
                $outTypeEntryGate = 1;
                $payMembershipAmount = 0;
                $transactionType = "";
                $input['fastagId'] = $transactionDetails['fastag_id'];
                //If FASTag has Sticker membership.
                $membership = $this->StickerMembership->getStickerMembershipByVehicleNo($input);


                if ($membership) {
                    $outTypeEntryGate = 5;
                    $outTypeId = $membership[0]->membership_id;
                    $outPaymentModeId = 0;
                    $outMasterPaymentMode = 3;
                    $payMembershipAmount = $payAmount;
                    $transactionType = "Sticker Membership";
                }else{
                    if(!$isCPSTxn){
                        if(floatval($payAmount) < 1){
                            throw new Exception('There is some issue. Please manually exit vehicle.');
                        }
    
                    }

                }

                $totalTimeSpent = $this->getTotalTimeSpent($inTimeEntry, $input['OutTime']);

                $tariff['total_time'] = $totalTimeSpent;
                $tariff['vehicle_type'] = $vehicleType;
                $tariff['day_type'] = $dayTypeExit;
                $tariff['status'] = 1;

                $tariffCodeDetails = $this->Tariff->getTariffList($tariff);
                $tariffCode = 0;
                if (!empty($tariffCodeDetails)) {
                    $tariffCode = $tariffCodeDetails->first()->tariff_code;
                }

                $this->storeExitVehImages($input, $transaction->id);
                //Start - Update sps_transaction  using transction id
                if($tariffCodeDetails->first()->payment_at_entry == 1){
                   
                        $paymentData = [
                            'exit_type' => 'FASTag',
                            'entry_type' => 'FASTag',
                            'fastag_pay' => 'pending'];
                    
    
                    $updateTransaction = Transaction::where('id', $transactionId)
                        ->update($paymentData);
    

                }else{
                    $fastag_f_eight_in_gate = $setting->fastag_f_eight_in_gate;

                    if($isF8Txn){

                        
                        $updateTransactionData = [
                            'in_gate' => $fastag_f_eight_in_gate,
                            'out_payment_mode' => $outPaymentModeId,
                            'out_master_payment_mode' => $outMasterPaymentMode,
                        ];
            
                        if ($isFastagPayment && $outTypeEntryGate != 5) {
                            $paymentData = [
                                'exit_type' => 'FASTag',
                                'fastag_pay' => 'pending'];
                            $updateTransactionData = array_merge($paymentData, $updateTransactionData);
                        }
        
                        $updateTransaction = Transaction::where('id', $transactionId)->update($updateTransactionData);

                    }else if($isCPSTxn){

                        if($payAmount == "0"){
                            $outMasterPaymentMode = 4;
                            $outPaymentModeId = 8;
                        }
                        $updateTransactionData =[
                            'out_payment_mode' => $outPaymentModeId,
                            'out_master_payment_mode' => $outMasterPaymentMode,
                            'fastag_lane'=>$gate->fastag_gate_id
                        ];

                        if($outGateType!=5){

                            $updateTransactionData = [
                                'out_time' => $input['OutTime'],
                                'total_time' => round($totalTimeSpent['minutes']),
                                'out_shift_id' => $shiftId,
                                'out_type' => $outTypeEntryGate, //  1for normal entry, 2 for membership entry
                                'out_type_id' => $outTypeId,
                                'out_gate' => $outGateId,
                                'out_user_id' => $userId,
                                'out_payment_mode' => $outPaymentModeId,
                                'out_master_payment_mode' => $outMasterPaymentMode,
                                'out_day_type' => $dayTypeExit,
                                'out_tariff_code' => $tariffCode,
                                'out_membership_payment_amount' => $payMembershipAmount,
                                'out_payment_amount' => $payAmount,
                                'out_standard_parking_amount' => $payAmount,
                                'total_payment_amount' => $payAmount,
                                'penalty_charge' => 0, // no penalty here
                                'overnight_charges' => 0,
                                'additional_charges' => 0,
                                'exit_process_time' => date("Y-m-d H:i:s"),
                                'in_gate' => $fastag_f_eight_in_gate
                            ];

                        }
                        

            
                        if ($isFastagPayment && $outTypeEntryGate != 5 && $payAmount != "0") {
                            $paymentData = [

                                'exit_type' => 'FASTag',
                                'fastag_pay' => 'pending'];
                            $updateTransactionData = array_merge($paymentData, $updateTransactionData);
                        }
        
                        $updateTransaction = Transaction::where('id', $transactionId)->update($updateTransactionData);


                    }else{

                        $updateTransactionData = [
                            'out_time' => $input['OutTime'],
                            'total_time' => round($totalTimeSpent['minutes']),
                            'out_shift_id' => $shiftId,
                            'out_type' => $outTypeEntryGate, //  1for normal entry, 2 for membership entry
                            'out_type_id' => $outTypeId,
                            'out_gate' => $outGateId,
                            'out_user_id' => $userId,
                            'out_payment_mode' => $outPaymentModeId,
                            'out_master_payment_mode' => $outMasterPaymentMode,
                            'out_day_type' => $dayTypeExit,
                            'out_tariff_code' => $tariffCode,
                            'out_membership_payment_amount' => $payMembershipAmount,
                            'out_payment_amount' => $payAmount,
                            'out_standard_parking_amount' => $payAmount,
                            'total_payment_amount' => $payAmount,
                            'penalty_charge' => 0, // no penalty here
                            'overnight_charges' => 0,
                            'additional_charges' => 0,
                            'exit_process_time' => date("Y-m-d H:i:s"),
                        ];
            
                        if ($isFastagPayment && $outTypeEntryGate != 5) {
                            $paymentData = [
                                'exit_type' => 'FASTag',
                                'fastag_pay' => 'pending'];
                            $updateTransactionData = array_merge($paymentData, $updateTransactionData);
                        }
        
                        $updateTransaction = Transaction::where('id', $transactionId)->update($updateTransactionData);
                    }
    

                }
                
                if($isCPSTxn){
                    $updatedTxn = $this->FastagEntry->getCPSFastagTransaction($transactionId);
                }else{
                    $updatedTxn = $this->FastagEntry->getFastagTransaction($transactionId);
                }



                $response['transaction_details'] = $updatedTxn;
                //End - Update sps_transaction  using transction id
                $responseMsg = 'Vehicle Successfully Detail Fetched';

               
                if (!$updateTransaction) {
                    throw new \Exception('Error While Updating Transaction');
                }
            });

            if (is_null($statusExitTransaction)) {
                //$responseMsg = "Transaction Details";
                //$response['transaction_info'] = $transactionDetails;
                $this->createLog(true, $this->logPath, "FASTag Exit ", $request->all(), $this->sendFastageResponse($response, $responseMsg));
                
                return $this->sendFastageResponse($response, $responseMsg);
            }
            $this->createLog(true, $this->logPath, "FASTag Exit ", $request->all(), "Error While Processing Transaction");
            throw new \Exception("Error While Processing Transaction");

        } catch (\Exception $e) {
            $this->createLog(false, $this->logPath, "FASTag  Exit ", $request->all(), $this->sendFastageError(' Error : ' . $e->getMessage(), [], 422));
            return $this->sendFastageError(' Error : ' . $e->getMessage(), [], 422);
        }
    }


    public function whitelistedFastag(Request $request)
    {
        try {
            $input = $request->all();

            //Validate request parameters
            $validator = Validator::make($input, [
                'Fastag' => 'required',
            ]);

            if ($validator->fails()) {
                throw new Exception('Validation Error4.' . $validator->errors()->first());
            }

            return $this->reqQueryExceptionList($input['Fastag']);

        } catch (Exception $e) {
            $this->createLog(false, $this->logPath, "FASTag Exit ", $request->all(), $e->getMessage());

            return $this->sendFastageError('Validation Error5.' . $e->getMessage(), 422);
        }

    }


    public function validateVehicleFASTag(FASTagRequest $request){

        $response = [];
        $input = $request->all();
        $vehNo = $input["vehicleNumber"];
        $tagId = $input['Fastags']['Fastag'];
        $tagStatus  = $this->validateFastagVehicleNumber($vehNo,$tagId);
        $response['tagStatus'] = $tagStatus;
        return $this->sendFastageResponse($response, 'Successfully'); 
        //die("here");
    }

    public function fastagConfiguration()
    {
        try {
            $monitoringData = [];
            $html = \View::make('admin.fastag_configuration', array('monitoringData' => $monitoringData))->render();
            return \Response::json(array('html' => $html));
        } catch (\Exception $e) {
            return $e->getMessage();
            exit;
        }
    }

    public function requestPaymentAtEntry($paymentEntryParam)
    {
        $response = [];
        $request = $paymentEntryParam['request'];
        try {
            $exitTransactionDBStatus = DB::transaction(function () use (&$response, &$request, &$paymentEntryParam) {

                $shiftId = $paymentEntryParam['shiftId'];
                $userId = $paymentEntryParam['userId'];
                $inType = $paymentEntryParam['inType'];
                $inTypeId = $paymentEntryParam['inTypeId'];
                $inPaymentMode = $paymentEntryParam['inPaymentMode'];
                $inMasterPaymentMode = $paymentEntryParam['inMasterPaymentMode'];
                $gate = $paymentEntryParam['gate'];
                $area = $paymentEntryParam['area'];
                $location = $paymentEntryParam['location'];
                $transaction = $paymentEntryParam['transaction'];
                $membership = $paymentEntryParam['membership'];
                $isFastagPayment = $paymentEntryParam['isFastagPayment'];
                $laneId = $paymentEntryParam['laneId'];

                $input = $request->all();
                $transaction = $transaction->toArray();
                $transactionId = $transaction['id'];
                $inTimeEntry = $input['InTime'];
                $dayTypeEntry = $this->getDaytype($area->area_id, $location->location_id, $input['InTime']);

                $params = [
                    'id' => $transactionId,
                    'barcode' => $transaction['barcode'],
                    'location' => $location,
                    'area' => $area,
                    'in_time' => $inTimeEntry,
                    'out_time' => $inTimeEntry,
                    'in_gate' => $gate->gate_id,
                    'out_gate' => $gate->gate_id,
                    'vehicle_type' => $transaction['vehicle_type'],
                    'gate_id' => $gate->gate_id,
                    'day_type' => $dayTypeEntry,
                    'vehicle_number' => 0,
                ];

                $getTariff = $this->getTariff($params);

                if (isset($getTariff['status']) && !$getTariff['status']) {
                    $message = isset($getTariff['message']) ? $getTariff['message'] : "Something went wrong. Please try again";
                    throw new Exception($message);
                }

                $totalPaymentAmount = isset($getTariff['parking_tariff']['total_payable']) ? $getTariff['parking_tariff']['total_payable'] : 0;
                $additionalAmount = isset($getTariff['tariff_info']['additional_tariff']['tariff'][0]['additional_tariff']) ? $getTariff['tariff_info']['additional_tariff']['tariff'][0]['additional_tariff'] : 0;
                $overnightCharge = isset($getTariff['parking_tariff']['tariff']['overnight_charge']) ? $getTariff['parking_tariff']['tariff']['overnight_charge'] : 0;

                $inMembershipTotalPaymentAmount = 0;
                if ($membership) {
                    $inMembershipTotalPaymentAmount = $totalPaymentAmount;
                }

                $transactionData = [
                    'in_membership_payment_amount' => $inMembershipTotalPaymentAmount,
                    'in_payment_amount' => $totalPaymentAmount,
                    'in_standard_parking_amount' => $totalPaymentAmount,
                    'out_time' => $inTimeEntry,
                    'total_time' => $getTariff['vehicle_info']['parking_duration_in_min'],
                    'out_shift_id' => $shiftId,
                    'out_type' => $inType, //  1 for normal entry, 2 for membership entry
                    'out_type_id' => $inTypeId,
                    'out_gate' => $gate->gate_id,
                    'out_user_id' => $userId,
                    'out_payment_mode' => $inPaymentMode,
                    'out_master_payment_mode' => $inMasterPaymentMode,
                    'out_day_type' => $dayTypeEntry,
                    'out_tariff_code' => isset($getTariff['tariff_info']['casual_tariff']['casual_tariff_code']) ? $getTariff['tariff_info']['casual_tariff']['casual_tariff_code'] : 0,
                    'out_payment_amount' => $totalPaymentAmount,
                    'out_standard_parking_amount' => $totalPaymentAmount,
                    'total_payment_amount' => $totalPaymentAmount,
                    'penalty_charge' => 0, // no penalty here
                    'overnight_charges' => $overnightCharge,
                    'additional_charges' => $additionalAmount,
                    'exit_type' => 'FASTag',
                    'exit_process_time' => date("Y-m-d H:i:s"),
                ];
                //Start - Update sps_transaction  using transction id


                // If FASTag payment is true then it go for FASTag payment
                if ($isFastagPayment && $inType != 5) {
                    $transactionData = array_merge(['exit_type' => 'FASTag', 'fastag_pay' => 'pending'], $transactionData);
                }

                $updateTransaction = Transaction::where('id', $transactionId)
                    ->update($transactionData);
                //End - Update sps_transaction  using transction id

                if (!$updateTransaction) {
                    throw new Exception('Error While Updating Transaction');
                }
                $response['transaction_details'] = $updateTransaction;
            });

            if (is_null($exitTransactionDBStatus)) {
                return $response;
            } else {
                throw new Exception('Error While Entry Process');
            }
        } catch (Exception $e) {
            $this->createLog(false, $this->logPath, "FASTag Entry ", $request->all(), $e->getMessage());
            return ["status" => false, "message" => $e->getMessage()];
        }
    }

    private function checkShiftManagementValidation($input, $type = "Entry")
    {
        $data = [];
        try {
            $setting = $this->settings;
            $area = Area::where('area_id', $setting->area_id)->first();
            $location = Location::where('location_id', $setting->location_id)->first();

            //validate location code and area code
            if (!$this->validateLocationAreaCode($location->location_code, $area->area_code)) {
                throw new Exception('Invalid Location or Area Code');
            }

            $userName = $input['User'];
            $userId = $this->User->getUserIdWithUsername($userName); // getting user id

            if (!$userId) { // if user id is not found then send error
                throw new Exception('User has not been found');
            }

            $gate = $this->Gate->getGateDetailByIP($input['IP']); // get gate details

            if (!$gate) { // send error if gate id not found
                throw new Exception('Gate has not been found');
            }

            if ($gate->fastag != 1) { // send error if gate is not enable for fastag
                throw new Exception('FASTag is not enable for gate');
            }

            if ($input['IP'] != $gate->ip_address) { // verify gate IP
                throw new Exception('IP has not been match');
            }

            $shiftId = $this->ShiftManagment->getShiftIdByUserId($userId); // getting shift id

            if (!$shiftId) { // send error if shift id is not found
                throw new Exception('Shift ID has not been assign');
            }

            $data['area'] = $area;
            $data['location'] = $location;
            $data['userId'] = $userId;
            $data['gate'] = $gate;
            $data['shiftId'] = $shiftId;

            return $data;
        } catch (Exception $e) {
            return $e->getMessage();
        }

    }

    public function getFastagErrorMessage($checkFastagTagStatus)
    {
        if ($checkFastagTagStatus) {
            $errorMsg = FastagErrorList::where('error_code', $checkFastagTagStatus)->get()->first();
            if (!empty($errorMsg)) {
                return $errorMsg->description;
            }
            return '';
        }
        return '';
    }

    public function updateFastagTransaction(Request $request){
        //dd($request->all());
        try {
            $input = $request->all();
            $validator = Validator::make($input, [
                'barcode' => 'required',
                'fastag_details' => 'required',
                'mode' => 'required',
                'payment_method' => 'required',
            ]);

            if ($validator->fails()) {
                return \Response::json(array('success' => false,'errors' => $validator->errors()),403);
            }
            $barcode = $input['barcode'];
            $mode = $input['mode'];
            $fastag_id = $input['fastag_details']['fastag_id'];
            $fastag_pay = $input['fastag_details']['fastag_pay'];
            $fastag_messageId = $input['fastag_details']['message_id'];
            $fastag_lane = $input['fastag_details']['out_gate'];
            $fastag_exec_code = $input['fastag_details']['fastag_exec_code'];
            $fastag_exec_message = $input['fastag_details']['fastag_exec_message'];
            $fastag_epc = $input['fastag_details']['fastag_epc'];
            $fastag_transaction_code = $input['fastag_details']['fastag_transaction_code'];
            $fastag_comment = $input['fastag_details']['fastag_transaction_message'];
            $fastag_vehicle_no = $input['fastag_details']['fastag_vehicle_no'];
            $payment_method = $input['payment_method'];
            if($payment_method == 'entry'){
                $entry_type = "FASTag";
                $exit_type = "FASTag";
            }elseif($payment_method == 'exit'){
                $entry_type = "";
                $exit_type = "FASTag";
            }else{
                $entry_type = "";
                $exit_type = "FASTag";
            }

            $setting = Settings::whereNull('deleted_at')->first();
            if($setting){
                $feightInnGate = $setting->fastag_f_eight_in_gate ? $setting->fastag_f_eight_in_gate : "0";
            }else{
                $feightInnGate = "1";
            }
            
            $transaction = DB::table('sps_transactions')
                ->where('barcode', $barcode)
                ->first();
            
            if($transaction){
                if($transaction->fastag_pay == "ACCEPTED"){
                    return \Response::json(array(
                        'success' => false,
                        'message' => "Transaction is already accepted."
                    ),404);
                }else{
                    if($transaction->f_eight == "1"){
                        $transactionData = array(
                            "fastag_id" => $fastag_id,
                            "exit_type" => $exit_type ? $exit_type : null,
                            "entry_type" => $entry_type ? $entry_type : null,
                            "fastag_pay" => $fastag_pay,
                            "fastag_messageId" => $fastag_messageId,
                            "fastag_lane" => $fastag_lane,
                            "fastag_exec_code" => $fastag_exec_code,
                            "fastag_exec_message" => $fastag_exec_message,
                            "fastag_epc" => $fastag_epc,
                            "fastag_comment" => $fastag_transaction_code."|".$fastag_comment,
                            "fastag_vehicle_no" => $fastag_vehicle_no,
                            "in_gate" => $feightInnGate,
                        );
                        if($mode == 'update'){
                            $affectedRows = DB::table('sps_transactions')
                                ->where('barcode', $barcode)
                                ->update($transactionData);
            
                            if($affectedRows > 0){
                                return \Response::json(array(
                                    'success' => true,
                                    'message' => "Transaction updated successfully for f8."
                                ),200);
                            }else{
                                return \Response::json(array(
                                    'success' => false,
                                    'message' => "Transaction not updated."
                                ),404);
                            }
                        }
                    }else{
                        $transactionData = array(
                            "fastag_id" => $fastag_id,
                            "exit_type" => $exit_type ? $exit_type : null,
                            "entry_type" => $entry_type ? $entry_type : null,
                            "fastag_pay" => $fastag_pay,
                            "fastag_messageId" => $fastag_messageId,
                            "fastag_lane" => $fastag_lane,
                            "fastag_exec_code" => $fastag_exec_code,
                            "fastag_exec_message" => $fastag_exec_message,
                            "fastag_epc" => $fastag_epc,
                            "fastag_comment" => $fastag_transaction_code."|".$fastag_comment,
                            "fastag_vehicle_no" => $fastag_vehicle_no,
                        );
                        if($mode == 'update'){
                            $affectedRows = DB::table('sps_transactions')
                                ->where('barcode', $barcode)
                                ->update($transactionData);
            
                            if($affectedRows > 0){
                                return \Response::json(array(
                                    'success' => true,
                                    'message' => "Transaction updated successfully."
                                ),200);
                            }else{
                                return \Response::json(array(
                                    'success' => false,
                                    'message' => "Transaction not updated."
                                ),404);
                            }
                        }
                    }
                }
            }else{
                return \Response::json(array(
                    'success' => false,
                    'message' => "Transaction not found."
                ),404);
            }

            /*$transaction_details = DB::table('sps_transactions')
                ->where('barcode', $barcode)
                ->where('out_time', '0000-00-00 00:00:00')
                ->whereNull('deleted_at')
                ->first();
            
            if($transaction_details){
                throw new Exception('Vehicle already inside');
            }*/
        } catch (\Exception $e) {
            //throw $th;
            return \Response::json(array(
                'success' => false,
                'message' => $e->getMessage()
            ),500);
        }
    }

    public function updateVrnForTransaction(Request $request){
        //dd($request->all());
        try {
            $input = $request->all();
            $validator = Validator::make($input, [
                'car_number' => 'required',
                'old_sp_vrn' => 'required',
            ]);

            if ($validator->fails()) {
                return \Response::json(array('success' => false,'errors' => $validator->errors()),403);
            }
            $car_number = $input['car_number'];
            $old_sp_vrn = $input['old_sp_vrn'];

            $transactionData = array(
                "vehicle_number" => $car_number,
                "fastag_tag_signature" => $old_sp_vrn,
            );
            
            $transactionExists = DB::table('sps_transactions')
                ->where('vehicle_number', $old_sp_vrn)
                ->where('out_time', '0000-00-00 00:00:00')
                ->whereNull('deleted_at')
                ->exists();

            if ($transactionExists) {
                $affectedRows = DB::table('sps_transactions')
                    ->where('vehicle_number', $old_sp_vrn)
                    ->where('out_time', '0000-00-00 00:00:00')
                    ->whereNull('deleted_at')
                    ->update($transactionData);
    
                if($affectedRows > 0){
                    return \Response::json(array(
                        'success' => true,
                        'message' => "Transaction updated successfully."
                    ),200);
                }else{
                    return \Response::json(array(
                        'success' => false,
                        'message' => "Transaction not updated."
                    ),404);
                }
            }else{
                return \Response::json(array(
                    'success' => false,
                    'message' => "Transaction not found with given old_sp_vrn."
                ),404);
            }
            /*$transaction_details = DB::table('sps_transactions')
                ->where('barcode', $barcode)
                ->where('out_time', '0000-00-00 00:00:00')
                ->whereNull('deleted_at')
                ->first();
            
            if($transaction_details){
                throw new Exception('Vehicle already inside');
            }*/
        } catch (\Exception $e) {
            //throw $th;
            return \Response::json(array(
                'success' => false,
                'message' => $e->getMessage()
            ),500);
        }
    }


}
