<?php

namespace App\Traits;

// ini_set('display_errors', 1);
// ini_set('display_startup_errors', 1);
// error_reporting(E_ALL);
date_default_timezone_set("Asia/Kolkata");


use App\Models\Transaction;
use App\Models\UserVehicleContactDetail;
use Carbon\Carbon;
use DB;
use App\Models\User;
use App\Models\ParkingSite;
use App\Models\FastagEntry;
use App\Models\FastagErrorList;
use App\Models\GateConfiguration;
use App\Models\Settings;
use Illuminate\Support\Facades\Http;

trait FastagEngineCallAPI
{

    public function reqSyncTime_ooo($laneId = "SYNC")
    {

        return date("Y-m-d\TH:i:s");
        //return $this->getTime();
    }

    public function reqSyncTime($laneId = "SYNC")
    {
        $endpoint = config("fastag.fastag_url");
        $plazaId = config("fastag.plaza_id");
        $msgId = $this->getMsgId($plazaId, $laneId);
        $time = date("Y-m-d\TH:i:s");
        $serverTime = null;
        $param = '{
                        "Action":"ReqSyncTime",
                        "Server":"' . config("fastag.server") . '",
                        "PlazaId":"' . $plazaId . '",
                        "LaneId":"' . $laneId . '",
                        "dolphinTxnId":"",
                        "Bank":"' . config("fastag.bank") . '",
                        "Head":{
                            "ver":"' . config("fastag.version") . '",
                            "ts":"' . $time . '",
                            "orgId":"' . config("fastag.organization_id") . '",
                            "msgId":"' . $msgId . '"
                        }
                }';

        $reqSyncTime = $this->curlCall($endpoint, $param);

        if($reqSyncTime != false){

            $reqSyncTime = json_decode(json_encode($reqSyncTime), true);

            //$serverTime = $reqSyncTime['Resp']['Time']['@attributes']['serverTime'];

            if (isset($reqSyncTime['Resp']['Time']['@attributes']['serverTime'])) {
                $serverTime = $reqSyncTime['Resp']['Time']['@attributes']['serverTime'];
                $diff = $this->getTimeDiffBetweenTwoDates($serverTime);
                session()->put('Server_Time_Diff', $diff);
            } else {
                $serverTime = date("Y-m-d\TH:i:s");
            }

        }else{
            $serverTime = date("Y-m-d\TH:i:s");
        }
        $serverTime = date("Y-m-d\TH:i:s", strtotime($serverTime) - 5);
        return $serverTime;
    }

    public function getFastagApiTime($laneId)
    {

        return $this->reqSyncTime($laneId);



        // if (session()->get('Server_Time_Diff') > 0) {
        //     $this->reqSyncTime($laneId);
        //     $sec = session()->get('Server_Time_Diff');
        //     $sec = $sec - 5;
        //     return date("Y-m-d\TH:i:s", strtotime("+$sec sec"));
        // } else {
        //     return date("Y-m-d\TH:i:s");
        // }
    }


    public function getFastagGateDetail($ip)
    {
        //  [gate_id] => 2 [old_id] => 0 [superadmin] => 0 [sync_at] => 2022-12-20 06:55:03 [gate_name] => IN02 [gate_ip] => 2 [serial_no] => 0 [reset_serial_no] => 1 [gate_type] => 1 [is_aps] => 0 [aps_gate_type] => [payment_modes] => [standard_nested] => Standard [pass_through_gates] => null [time_duration] => [is_full] => 0 [discount_additional] => 0 [percentage_flat] => 0 [discount_additional_value] => 0.00 [grace_period] => 0 [status] => 1 [location_id] => 0 [area_id] => 1 [created_by] => 1 [updated_by] => 0 [created_at] => 2022-05-24 10:12:03 [updated_at] => 2023-06-21 10:10:13 [deleted_at] => [fastag] => 1 [fastag_gate_id] => N02 [fastag_floor_id] => 1 [fastag_direction] => N [fastage] => 1 [ip_address] => 192.168.1.102 ) [original:protected] => Array ( [gate_id] => 2 [old_id] => 0 [superadmin] => 0 [sync_at] => 2022-12-20 06:55:03 [gate_name] => IN02 [gate_ip] => 2 [serial_no] => 0 [reset_serial_no] => 1 [gate_type] => 1 [is_aps] => 0 [aps_gate_type] => [payment_modes] => [standard_nested] => Standard [pass_through_gates] => null [time_duration] => [is_full] => 0 [discount_additional] => 0 [percentage_flat] => 0 [discount_additional_value] => 0.00 [grace_period] => 0 [status] => 1 [location_id] => 0 [area_id] => 1 [created_by] => 1 [updated_by] => 0 [created_at] => 2022-05-24 10:12:03 [updated_at] => 2023-06-21 10:10:13 [deleted_at] => [fastag] => 1 [fastag_gate_id] => N02 [fastag_floor_id] => 1 [fastag_direction] => N [fastage] => 1 [ip_address] => 192.168.1.102


        $this->Gate = new GateConfiguration();
        $gateIP = $ip;
        $gateinfo = $this->Gate->getGateDetailByIP($gateIP);

        $gateName = $gateinfo['gate_name'];
        $gateId = $gateinfo['fastag_gate_id'];
        $floorId = $gateinfo['fastag_floor_id'];
        $direction = $gateinfo['fastag_direction'];

    }

    public function reqTagDetails($tid, $vehicleNo, $tagId, $laneId, $txnId = "", $entry)
    {


        $fastagServerTime = $this->getFastagApiTime($laneId);
        if (!empty($tagId)) {
            $vehicleNo = "";
            $tid = "";
            $tagId = strtoupper($tagId);
        }
        $endpoint = config("fastag.fastag_url");
        $plazaId = config("fastag.plaza_id");

        if ($entry["out_time"] == "0000-00-00 00:00:00") {
            $msgTime = date("Y-m-d\TH:i:s");
        } else if ($entry["out_time"] == "") {
            $msgTime = $entry["in_time"];
        } else {
            $msgTime = $entry["out_time"];
        }


        $msgId = $this->getMsgId($plazaId, $laneId, $msgTime);
        //$time = $this->getTime($msgTime);
        $time = $fastagServerTime;

        //$time = date()
        $param = '{
                        "Action":"ReqTagDetails",
                        "Server":"' . config("fastag.server") . '",
                        "PlazaId":"' . $plazaId . '",
                        "LaneId":"' . $laneId . '",
                        "dolphinTxnId":"' . $txnId . '",
                        "Bank":"' . config("fastag.bank") . '",
                        "Head": {
                                    "ver":"' . config("fastag.version") . '",
                                    "ts":"' . $time . '",
                                    "orgId":"' . config("fastag.organization_id") . '",
                                    "msgId":"' . $msgId . '"
                                },
                        "Txn": {
                                    "id":"' . $msgId . '",
                                    "note":"",
                                    "refId":"",
                                    "refUrl":"",
                                    "type":"FETCH",
                                    "orgTxnId":"",
                                    "ts":"' . $time . '",
                                    "Vehicle":{
                                        "TID":"' . $tid . '",
                                        "vehicleRegNo":"' . $vehicleNo . '",
                                        "tagId":"' . $tagId . '"

                                    }
                                }

                    }';


        //print_r($param);
        //die("here");
        $reqTagDetails = $this->curlCall($endpoint, $param);
        //print_r($reqTagDetails);
        //die("dfdfdf");

        if($reqTagDetails != false){
            return json_decode(json_encode($reqTagDetails), true);
        }else{
            return false;
        }



    }

    public function requestPay($payAmount, $paymentOrderId, $outLaneDetails,$inLaneDetails, $vehicleDetails, $geoCode,$entry){

        $inGateName = $inLaneDetails['gate_name'];
        $inGateId = $inLaneDetails['fastag_gate_id'];
        $inFloorId = $inLaneDetails['fastag_floor_id'];
        $inDirection = $inLaneDetails['fastag_direction'];

        $entryTime = $entry['in_time'];
        $entryTime = date("Y-m-d\TH:i:s", strtotime($entryTime));

        $total_entry_payment_amount = $entry['in_payment_amount'];

        $entryPaymentData = (int)$total_entry_payment_amount;   
        if (!empty($total_entry_payment_amount) && $entryPaymentData > 0) {
           
            $outGateName = config("fastag.virtual_gate_name");
            $outGateId = config("fastag.virtual_gate_id");
            $outFloorId = config("fastag.virtual_floor_id");
            $outDirection = config("fastag.virtual_direction");
            $entryTime = $entry['in_time'];
            $entryTime = date("Y-m-d\TH:i:s", strtotime($entryTime)-32);
            $new_exit_time=strtotime($entryTime);
            $txnExitTime= date('Y-m-d H:i:s', $new_exit_time);
            $exitTime = date("Y-m-d\TH:i:s", $new_exit_time);
        }else{
            $outGateName = $outLaneDetails['gate_name'];
            $outGateId = $outLaneDetails['fastag_gate_id'];
            $outFloorId = $outLaneDetails['fastag_floor_id'];
            $outDirection = $outLaneDetails['fastag_direction'];
            //$txnExitTime = $entry['out_time'];
            if($entry['is_cps'] == 1){
                $txnExitTime = $entry['cps_out_time'];
            }else{
                $txnExitTime = $entry['out_time'];
            }
            $exitTime = date("Y-m-d\TH:i:s", strtotime($txnExitTime));
        }

        $laneId = $outGateId;

        // Fastag server time diff is empty on session
        //$laneId = isset($laneDetails['fastag_lane']) ? $laneDetails['fastag_lane'] : $laneDetails['gate_name'];
        if (!session()->get('Server_Time_Diff')) {
            $this->reqSyncTime($laneId);
        }


        $dolphinTxnId = $entry['id'];

        $currTime = date("Y-m-d\TH:i:s");

        $endpoint = config("fastag.fastag_url");
        $plazaId = config("fastag.plaza_id");
        $msgId = $this->getMsgId($plazaId, $outGateId, $exitTime);
        $time = $exitTime;
        $bank = config("fastag.bank");
		if(strtoupper($bank) == "PAYTM"){
			$tagVrn = "XXXXXXXXX1";
			$lpNumber = "XXXXXXXXX1";
			$tagSignature = $vehicleDetails['fastag_tag_signature'];
		}else{
			$tagVrn = "XXXXXXXXXX";
			$lpNumber = "XXXXXXXXXX";
			$tagSignature =  $vehicleDetails['tagId'];
		}

        if(strtoupper($bank) == "KOTAK"){

            $entryId= $inGateId;
            $entryReaderId = $inGateId;
            $entryGate = $inGateId;
            $outId = $outGateId;
            $outReaderId = $outGateId;
            $outGate = $outGateId;
        }else{
            $entryId= $inGateName;
            $entryReaderId = $inGateId;
            $entryGate = $inGateId;
            $outId = $outGateName;
            $outReaderId = $outGateId;
            $outGate = $outGateId;

        }


        $param = '{
                    "Action":"ReqPay",
                    "Server":"' . config("fastag.server") . '",
                    "PlazaId":"' . $plazaId . '",
                    "LaneId":"' . $outGateId . '",
                    "dolphinTxnId":"' . $dolphinTxnId . '",
                    "Bank":"' . $bank . '",
                    "Head": {
                        "ver":"' . config("fastag.version") . '",
                        "ts":"' . $exitTime . '",
                        "orgId":"' . config("fastag.organization_id") . '",
                        "msgId":"' . $msgId . '"
                    },

                    "Txn": {
                            "id":"' . $msgId . '",
                            "note":"",
                            "refId":"",
                            "refUrl":"",
                            "type":"DEBIT",
                            "orgTxnId":"",
                            "ts":"' . $exitTime . '",
                            "EntryTxn":{
                                "id":"' . $msgId . '",
                                "tsRead":"' . $entryTime . '",
                                "ts":"' . $exitTime . '",
                                "type":"DEBIT"
                            }
                    },

                    "Plaza":{
                        "geoCode":"' . $geoCode . '",
                        "id": "' . config("fastag.plaza_id") . '",
                        "name":"' . config("fastag.plaza_name") . '",
                        "subtype":"' . config("fastag.plaza_sub_type") . '",
                        "type":"Parking",

                        "EntryPlaza":{
                            "geoCode":"' . config("fastag.geo_code") . '",
                            "id":"' . config("fastag.plaza_id") . '",
                            "name":"' . config("fastag.plaza_name") . '",
                            "subtype":"' . config("fastag.plaza_sub_type") . '",
                            "type":"Parking"
                            },

                        "Lane":{
                                "id":"' . $outId . '",
                                "direction":"' . $outDirection . '",
                                "Status":"OPEN",
                                "Mode":"NORMAL",
                                "laneType":"Hybrid",
                                "readerId":"' . $outReaderId . '",
                                "ExitGate":"' . $outGate . '",
                                "Floor":"' . $outFloorId . '"
                            },
                        "EntryLane":{
                                "id":"' . $entryId . '",
                                "direction":"' . $inDirection . '",
                                "Status":"OPEN",
                                "Mode":"NORMAL",
                                "laneType":"Hybrid",
                                "readerId":"' . $entryReaderId . '",
                                "EntryGate":"' . $entryGate . '",
                                "Floor":"' . $inFloorId . '"
                            },
                        "ReaderVerificationResult":{
                            "publicKeyCVV":"",
                            "procRestrictionResult":"ok",
                            "signAuth":"VALID",
                            "tagVerified":"NETC TAG",
                            "ts":"' . $exitTime . '",
                            "txnCounter":"1",
                            "txnStatus":"SUCCESS",
                            "vehicleAuth":"UNKNOWN",
                            "TagUserMemory":{
                                "Detail":[
                                    {
                                        "name":"TagSignature",
                                        "value":"' . $tagSignature . '"
                                    },
                                    {
                                        "name":"TagVRN",
                                        "value":"'.$tagVrn.'"
                                    },
                                    {
                                        "name":"TagVC",
                                        "value":"4"
                                    }
                                ]
                            }

                        }
                    },
                    "Vehicle":{
                        "TID":"' . $vehicleDetails['tId'] . '",
                        "vehicleRegNo":"' . $vehicleDetails['vehicleNumber'] . '",
                        "tagId":"' . $vehicleDetails['tagId'] . '",
                        "wim":"",
                        "staticweight":"",
                        "VehicleDetails":{
                            "Detail":[
                                     {
                                        "name":"AVC",
                                        "value":"4"
                                    },
                                    {
                                        "name":"LPNumber",
                                        "value":"'.$lpNumber.'"
                                    }
                                ]
                        }
                    },
                    "Payment":{
                        "Amount":{
                            "curr":"INR",
                            "value":"' . $payAmount . '",
                            "PriceMode":"CUSTOM",
                            "IsOverWeightCharged":"FALSE",
                            "PaymentMode":"Tag",
                            "OverwightAmount":{
                                "curr":"INR",
                                "value":"' . $payAmount . '",
                                "PaymentMode":"Tag"
                            }
                        }
                    }

                }';

                

        $reqPayDetails = $this->curlCall($endpoint, $param);

        if($reqPayDetails !== false){
            print_r($msgId);
            return $msgId;
        }else{
            return false;
        }
        //return json_decode(json_encode($reqTagDetails), true);

    }

    public function fastagPaymentStatus($transaction)
    {

        $messageId = $transaction['fastag_messageId'];
        $endpoint = config("fastag.fastag_url");
        $plazaId = config("fastag.plaza_id");
        $serverTime = null;
        $time = date("Y-m-d H:i:s");
        $param = '{
                    "Action":"fastagPaymentStatus",
                    "Server":"' . config("fastag.server") . '",
                    "PlazaId":"",
                    "LaneId":"",
                    "Bank":"' . config("fastag.bank") . '",
                    "Head":{
                            "ver":"",
                            "ts":"",
                            "orgId":"",
                            "msgId":"' . $messageId . '"
                        }
                }';



        $fastagPaymentStatus = $this->curlCall($endpoint, $param);

        if($fastagPaymentStatus != false){
            return $fastagPaymentStatus;
        }else{
            return false;
        }



    }

    public function fastagReqChkTxn($transaction)
    { 


        $endpoint = config("fastag.fastag_url");
        $plazaId = config("fastag.plaza_id");
        $msgTime = date("Y-m-d\TH:i:s");
        $txnId = $transaction['id'];
        $isCPS = $transaction['is_cps'];
        //$laneId = $transaction['fastag_lane'];
        //$this->Gate = new GateConfiguration();
        //$outgate = $this->Gate->getGateDetailById($transaction['out_gate']);



        //$laneId = $outgate['gate_name'];
        //$fastag_gate_id = $outgate['fastag_gate_id'];





        // $laneId = config("fastag.virtual_gate_name");
        // $fastag_gate_id = config("fastag.virtual_gate_id");
        // $outFloorId = config("fastag.virtual_floor_id");
        // $outDirection = config("fastag.virtual_direction");
        if($isCPS == 1){
            $laneId = $transaction['fastag_lane'];
            $this->Gate = new GateConfiguration();
            $outgate = $this->Gate->getGateDetailById($transaction['cps_gate']);
            $laneId = $outgate['gate_name'];
            $fastag_gate_id = $outgate['fastag_gate_id'];

            if($transaction['cps_out_time'] != NULL){
                $txnDate = date("Y-m-d", strtotime($transaction['cps_out_time']));
            }else{
                $txnDate = date("Y-m-d", strtotime($transaction['in_time']));
            }

        }else{
            if(config("fastag.virtual_gate_name")){
                $laneId = config("fastag.virtual_gate_name");
                $fastag_gate_id = config("fastag.virtual_gate_id");
                $outFloorId = config("fastag.virtual_floor_id");
                $outDirection = config("fastag.virtual_direction");
            }else{
                $laneId = $transaction['fastag_lane'];
                $this->Gate = new GateConfiguration();
                $outgate = $this->Gate->getGateDetailById($transaction['out_gate']);
                $laneId = $outgate['gate_name'];
                $fastag_gate_id = $outgate['fastag_gate_id'];
            }


            if($transaction['out_time'] != NULL){
                $txnDate = date("Y-m-d", strtotime($transaction['out_time']));
            }else{
                $txnDate = date("Y-m-d", strtotime($transaction['in_time']));
            }
        }
        


        $msgId = $this->getMsgId($plazaId, $fastag_gate_id, $msgTime);
        $time = $this->getTime($msgTime);
        $fastagTxnId = $transaction['fastag_messageId'];




        $param = '{
            "Action":"ReqChkTxn",
            "Server":"' . config("fastag.server") . '",
            "PlazaId":"' . $plazaId . '",
            "LaneId":"' . $fastag_gate_id . '",
            "dolphinTxnId":"' . $txnId . '",
            "Bank":"' . config("fastag.bank") . '",
            "Head": {
                        "ver":"' . config("fastag.version") . '",
                        "ts":"' . $time . '",
                        "orgId":"' . config("fastag.organization_id") . '",
                        "msgId":"' . $msgId . '"
                    },
            "Txn": {
                        "id":"' . $msgId . '",
                        "note":"",
                        "refId":"",
                        "refUrl":"",
                        "type":"ChkTxn",
                        "orgTxnId":"",
                        "ts":"' . $time . '",
                        "TxnStatusReqList":{
                            "Status":{
                                "txnId":"' . $fastagTxnId . '",
                                "txnDate":"' . $txnDate . '",
                                "plazaId":"' . $plazaId . '",
                                "laneId":"' . $laneId . '"
                            }
                        }

        }}';



        $ReqChkTxn = $this->curlCall($endpoint, $param);
        if($ReqChkTxn != false){
            return $ReqChkTxn;
        } else {
            return false;
        }


    }

    public function reqQueryExceptionList($laneId = "SYNC")
    {
        try {
            $endpoint = config("fastag.fastag_url");
            $plazaId = config("fastag.plaza_id");
            $msgId = $this->getMsgId($plazaId, $laneId);
            $time = $this->getTime();
            $serverTime = null;
            $param = '{
                            "Action":"ReqQueryExceptionList",
                            "Server":"' . config("fastag.server") . '",
                            "Bank":"' . config("fastag.bank") . '",
                            "Head": {
                                "ver":"' . config("fastag.version") . '",
                                "ts":"' . $time . '",
                                "orgId":"' . config("fastag.organization_id") . '",
                                "msgId":"' . $msgId . '"
                                },

                            "Txn": {
                                    "id":"' . $msgId . '",
                                    "note":"",
                                    "refId":"",
                                    "refUrl":"",
                                    "type":"Query",
                                    "orgTxnId":"",
                                    "ts":"' . $time . '",
                                        "ExceptionList":{
                                            "Exception":
                                                [
                                                    {
                                                        "excCode":"01",
                                                        "lastFetchTime":"' . $time . '"
                                                    },
                                                    {
                                                        "excCode":"02",
                                                        "lastFetchTime":"' . $time . '"
                                                    }
                                                ]
                                            }
                                    }
                        }';
            $reqQueryExceptionList = $this->curlCall($endpoint, $param);
            $reqQueryExceptionList = json_decode(json_encode($reqQueryExceptionList), true);
            return $reqQueryExceptionList;
        } catch (\Exception $e) {
            return false;
        }
    }

    public function getMsgId($plazaId, $laneId, $datetime = "")
    {
        $plazaId = $plazaId;
        $laneId = $laneId;
        if (empty($datetime)) {
            $dateTime = date("dmyHis");
        } else {
            $dateTime = date("dmyHis", strtotime($datetime));
        }

        $random = substr(str_shuffle("0123456789"), 0, 2);

        //die("here");
        return $plazaId . $laneId . $dateTime;
        //return date('Ymdhis') . substr(str_shuffle("0123456789"), 0, 2);
    }


    public function getRenMsgId($plazaId, $laneId, $datetime = "")
    {
        $plazaId = $plazaId;
        $laneId = $laneId;
        if (empty($datetime)) {
            $dateTime = date("dmyHis");
        } else {
            $dateTime = date("dmyHis", strtotime($datetime));
        }

        $random = substr(str_shuffle("0123456789"), 0, 3);

        //die("here");
        return $plazaId . $laneId . $dateTime .$random;
        //return date('Ymdhis') . substr(str_shuffle("0123456789"), 0, 2);
    }

    public function getTime($Mtime)
    {
        // if (session()->get('Server_Time_Diff') !== null) {
        //     $sec = session()->get('Server_Time_Diff');
        //     $sec = $sec - 5;
        //     return date("Y-m-d\TH:i:s", strtotime("+$sec sec"));
        // } else {
        //     return date("Y-m-d\TH:i:s");
        // }

        return date("Y-m-d\TH:i:s", strtotime($Mtime));

    }

    public function getTimeDiffBetweenTwoDates($serverDate)
    {
        $systemDate = Carbon::now();
        $serverDate = date('Y-m-d H:i:s', strtotime($serverDate));
        $systemDateFormatted = Carbon::parse($systemDate);
        $serverDateFormatted = Carbon::parse($serverDate);
        return $serverDateFormatted->diffInSeconds($systemDateFormatted);

    }

    //US812 payway functionality start
    function getHash($inputString)
    {
        //41220: Update in payway api documentation
        $hash = base64_encode(hash_hmac('sha512', $inputString, ABA_PAYWAY_API_KEY, true));
        return $hash;
    }

    function getApiUrl()
    {
        return ABA_PAYWAY_API_URL;
    }

    function curlCall($apiURL, $requestParamList)
    {


        //$apiURL = "https://fastag.nwaredev.com/fastag/v1/engine_uat";
        $responseParamList = array();
        $ch = curl_init($apiURL);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $requestParamList);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        //curl_setopt($ch, CURLOPT_HTTPHEADER, $customHeader);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ch, CURLOPT_TIMEOUT, 60);
        $jsonResponse = curl_exec($ch);
        $err = curl_error($ch);  //if you need
        $info = curl_getinfo($ch);


        if($info["http_code"] == 200){
            //if($jsonResponse != false){
                return json_decode($jsonResponse, true);
            //}else{
            //    return false;
            //}

        }else{
            return false;
        }



        //echo 'Took ' . $info['total_time'] . ' seconds to transfer a request to ' . $info['url'];
        //print_r($info["http_code"]);
        //die("here");
        /* To store APIs log */
        //$this->createLog(false, storage_path() . '/logs/fastag_engine/', "FASTag Exit ", json_encode(json_decode($requestParamList, true)),  !empty($err) ? $err : json_encode(json_decode($jsonResponse, true)) );
        /* To store APIs log */


    }

    function apiResponse($status, $code, $message, $data = array())
    {

        switch ($code) {
            case '401':
                $headerMsg = '401 Unauthorized';
                break;
            case '403':
                $headerMsg = '403 Forbidden';
                break;
            case '405':
                $headerMsg = '405 Method not allowed';
                break;
            case '422':
                $headerMsg = '422 Unprocessable entity';
                break;
            case '200':
                $headerMsg = '200 OK';
                break;
            default:
                $headerMsg = '400 Bad Request';
                break;
        }

        header('Content-Type: application/json;');
        header($_SERVER['SERVER_PROTOCOL'] . ' ' . $headerMsg, true);

        $arrResponse = array('status' => $status, 'code' => $code, 'message' => $message);

        if (!empty($data)) {
            $arrResponse['data'] = $data;
        }

        $response = json_encode($arrResponse, JSON_UNESCAPED_SLASHES);

        /* To store APIs log */
        $stringName = isset($data['transId']) ? $data['transId'] . "_" . time() : time();
        $this->storeApiLog('request_' . $stringName . '.json', file_get_contents('php://input'));
        $this->storeApiLog('response_' . $stringName . '.json', $response);
        /* To store APIs log */

        return $response;
        // exit;
    }

    function storeApiLog($fileName, $log)
    {
        $directory = date("Y") . '/' . date("m") . '/' . date("d");
        $directoryPath = './log/' . $directory;
        if (!is_dir($directoryPath)) {
            mkdir($directoryPath, 0777, true);
        }
        $filePath = $directoryPath . '/' . $fileName;
        file_put_contents($filePath, $log);
    }

    function isValidString($alphaNumeric)
    {
        if (preg_match('/^[a-zA-Z0-9]+$/', $alphaNumeric) && strlen($alphaNumeric) < 20) {
            return true;
        } else {
            return false;
        }
    }

    function validateKeys()
    {
        //41220: Update in payway api documentation
        if (empty(ABA_PAYWAY_MERCHANT_API_NAME) || empty(ABA_DOMAIN) || empty(ABA_API_VERSION) || empty(ABA_PAYWAY_API_URL) ||
            empty(ABA_PAYWAY_TRANS_STATUS_API_URL) || empty(ABA_PAYWAY_API_KEY) || empty(ABA_PAYWAY_MERCHANT_ID) || empty(ABA_PHONE_COUNTRY_CODE) || empty(ABA_PHONE) || empty(ABA_EMAIL) || empty(ABA_CURRENCY) || empty(ACCESS_TOKEN) || empty(REFERER)) {
            $this->apiResponse('FAILURE', 401, 'API keys may be missing or invalid. Please check INI file. Required keys in ini file are: ABA_DOMAIN, ABA_API_VERSION, ABA_PAYWAY_API_KEY, ABA_PAYWAY_MERCHANT_ID, ABA_MERCHANT_API_NAME, ABA_PHONE_COUNTRY_CODE, ABA_PHONE, ABA_EMAIL, ABA_CURRENCY, REFERER, ACCESS_TOKEN');
        }
        return true;
    }

    function siteURL()
    {
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $domainName = $_SERVER['HTTP_HOST'] . '/';
        return $protocol . $domainName;
    }

    function getHeaders()
    {
        $headers = [];
        foreach ($_SERVER as $name => $value) {
            if (substr($name, 0, 5) == 'HTTP_') {
                $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
            }
        }
        return $headers;
    }

    function isValid($request)
    {

        if (empty($request['transId'])) {
            $this->apiResponse('FAILURE', '400', 'Empty Transaction Id');
        } elseif (!$this->isValidString($request['transId'])) {
            $this->apiResponse('FAILURE', '422', 'Invalid Transaction Id. Only number and character are allowed upto 20');
        }

        if (empty($request['amount'])) {
            $this->apiResponse('FAILURE', '400', 'Empty Amount');
        } elseif (!$this->isValidAmount($request['amount'])) {
            $this->apiResponse('FAILURE', '422', 'Invalid Amount. Allowed up to two decimal places');
        }

        return true;
    }

    function isValidAmount($amount)
    {
        if (preg_match('/^\d{1,10}(\.\d{2})$/', $amount)) {
            return true;
        } else {
            return false;
        }
    }

    public function createLog($status, $path, $errorLogTitle, $request = null, $response = null)
    {
        $log = null;
        $statusTitle = '';

        // if (!is_dir($path)) {
        //     mkdir($path, 0777, true);
        // }

        // if ($status) {
        //     $statusTitle = "Success";
        // } else {
        //     $statusTitle = "Failed";
        // }

        // // Request
        // if (!empty($request)) {
        //     $log .= "-----------" . date('Y-m-d H:i:s') . "--------------" . PHP_EOL .
        //         $errorLogTitle . $statusTitle . " Request:" . PHP_EOL . json_encode($request) . PHP_EOL .
        //         "-------------------------" . PHP_EOL;
        // }
        // //$response
        // if (!empty($response)) {
        //     $log .= "-----------" . date('Y-m-d H:i:s') . "--------------" . PHP_EOL .
        //         $errorLogTitle . $statusTitle . " Response:" . PHP_EOL . $response . PHP_EOL .
        //         "-------------------------" . PHP_EOL;
        // }

        // if (!file_exists($path)) {
        //     mkdir($path, 0777, true);
        // }
        // $file_name = 'log_' . date("j.n.Y") . '.txt'; // added from date here

        // if (!is_null($log)) {
        //     file_put_contents($path . $file_name, $log, FILE_APPEND);
        // }
    }

    public function performFastagTagDetail($entry, $type)
    {

        //print_r($entry);

        $response = '';
        try {
            $txnId = $entry['txn_id'];
            $tid = "";
            $tagId = $entry['fastag_id'];
            $vehicleNo = $entry['vehicleNo'];
            $laneId = $entry['laneId'];


            $response = $this->reqTagDetails($tid, $vehicleNo, $tagId, $laneId, $txnId, $entry);

           //print_r($response);
           //print_r($response['Txn']['Resp']['Vehicle']['@attributes']['errCode']);
           //die("here");

            $vehicleNumber = "0";
            $comVehicle = "";
            $execCode = "";
            $tagStatus = "";
            $vehClass = "";
            $tagTid = "";
            $usedForPayment = 0;
            $isTagActiveforPayment = 0;
            $tagId = $tagId;
            $fastagStatusMessage = "";
            $fastagStatusCode = "";

            $statusCode = isset($response['Txn']['Resp']['Vehicle']['@attributes']['errCode']) ? $response['Txn']['Resp']['Vehicle']['@attributes']['errCode'] : "";
            
            if ($statusCode == "000") {
                $VehicleDetails = $response['Txn']['Resp']['Vehicle']['VehicleDetails']['Detail'];


                foreach ($VehicleDetails as $vehicleDetail) {
                    //print_r($vehicleDetail);

                    $value = $vehicleDetail['@attributes']['value'];
                    if ($vehicleDetail['@attributes']['name'] == "REGNUMBER") {
                        $vehicleNumber = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "COMVEHICLE") {
                        $comVehicle = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "EXCCODE") {
                        $execCode = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "TAGSTATUS") {
                        $tagStatus = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "VEHICLECLASS") {
                        $vehClass = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "TID") {
                        $tagTid = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "TAGID") {
                        $tagId = $value;
                    }
                }

                $searchForValue = ',';
                //print_r($code);
                if (strpos($execCode, $searchForValue) > 0) {
                    $fastagStatusCode = $execCode;
                    $codeArray = explode(",", $execCode);
                    $fastagStatusMessage = "";
                    foreach ($codeArray as $code) {
                        $fastagStatusMessage .= $this->getTagCodeMessage($code) . " | ";
                    }
                } else {
                    $fastagStatusCode = $execCode;
                    $fastagStatusMessage = $this->getTagCodeMessage($execCode);
                }

                $usedForPayment = 1;
                $isTagActiveforPayment = 1;
            } else {
                $fastagStatusCode = $statusCode;
                $fastagStatusMessage = $this->getFastagErrorMessage($statusCode);
            }


            // }

            // die("here");

            // if (isset($response['Txn']['Resp']['Vehicle']['VehicleDetails'][0]['Detail'][0]['@attributes']['value']) && $response['Txn']['Resp']['@attributes']['respCode']) {

            // $vehicleNumber = $response['Txn']['Resp']['Vehicle']['VehicleDetails']['Detail'][4]['@attributes']['value'];
            // $tagStatus = $response['Txn']['Resp']['Vehicle']['VehicleDetails'][0]['Detail'][4]['@attributes']['value'];
            // $comVehicle = $response['Txn']['Resp']['Vehicle']['VehicleDetails'][0]['Detail'][3]['@attributes']['value'];
            // $statusCode = $response['Txn']['Resp']['@attributes']['respCode'];

            if ($vehicleNumber == "0") {
                //$vehicleNumber = $tagId;
            }


            $fastag = FastagEntry::where('id', $entry['id'])
                ->update([
                    'vehicle_no' => $vehicleNumber,
                    'exccode' => $statusCode,
                    'comvehicle' => $comVehicle,
                    'tag_status' => $tagStatus,
                    'used_for_payment' => $usedForPayment,
                    'cron_status' => $usedForPayment,
                ]);


            if ($type == "entry") {

                //Update Transaction vehicle no
                Transaction::where('id', $txnId)
                    ->update([
                        'fastag_vehicle_no' => $vehicleNumber,
                        'vehicle_number' => $vehicleNo != "0" ? $vehicleNo : $vehicleNumber,
                        //'fastag_epc' => $tagTid,
                        //'fastag_id' => strtolower($tagId),
                        'fastag_exec_code' => $fastagStatusCode,
                        'fastag_exec_message' => $fastagStatusMessage,
                    ]);

            } else {
                Transaction::where('id', $txnId)
                    ->update([
                        'fastag_exec_code' => $statusCode
                    ]);

            }
            DB::commit();

            return $fastagStatusCode;

            // } else {
            //     DB::rollback();
            // }
        } catch (\Exception $e) {
            print_r($e->getMessage());
            $this->createLog(false, storage_path() . '/logs/fastag_engine/', "FASTag Entry --  " . $e->getMessage(), $entry, $response);
            return false;
        }

    }


    public function checkFastagTagDetail($entry, $type)
    {

        //print_r($entry);
        $isliveFastag = 0;  // 1 = is for if we want to fetch fastag vechile no from NPCI and 0 = not for npci call


        $fastagDetail = [];
        $response = '';
        try {
            $txnId = "";
            $tid = "";
            $tagId = $entry['fastag_id'];
            $vehicleNo = $entry['vehicleNo'];
            $laneId = $entry['laneId'];

            $anprVehicleNo = $vehicleNo;


            $vehicleNumber = "0";
            $comVehicle = "";
            $execCode = "";
            $tagStatus = "";
            $vehClass = "";
            $tagTid = "";
            $usedForPayment = 0;
            $isTagActiveforPayment = 0;
            $tagId = $tagId;
            $fastagStatusMessage = "";
            $fastagStatusCode = "";


            if ($isliveFastag == 1) {
                $response = $this->reqTagDetails("", $anprVehicleNo, $tagId, $laneId, $txnId, $entry);
                $statusCode = isset($response['Txn']['Resp']['Vehicle']['@attributes']['errCode']) ? $response['Txn']['Resp']['Vehicle']['@attributes']['errCode'] : "";
            } else {
                $response = "";
                $statusCode = "1112";
                $vehicleNumber = $anprVehicleNo;
            }


            if ($statusCode == "000") {
                $VehicleDetails = $response['Txn']['Resp']['Vehicle']['VehicleDetails']['Detail'];


                foreach ($VehicleDetails as $vehicleDetail) {

                    $value = $vehicleDetail['@attributes']['value'];
                    if ($vehicleDetail['@attributes']['name'] == "REGNUMBER") {
                        $vehicleNumber = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "COMVEHICLE") {
                        $comVehicle = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "EXCCODE") {
                        $execCode = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "TAGSTATUS") {
                        $tagStatus = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "VEHICLECLASS") {
                        $vehClass = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "TID") {
                        $tagTid = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "TAGID") {
                        $tagId = $value;
                    }
                }

                $searchForValue = ',';

                if (strpos($execCode, $searchForValue) > 0) {
                    $fastagStatusCode = $execCode;
                    $codeArray = explode(",", $execCode);
                    $fastagStatusMessage = "";
                    foreach ($codeArray as $code) {
                        $fastagStatusMessage .= $this->getTagCodeMessage($code) . " | ";
                    }
                } else {
                    $fastagStatusCode = $execCode;
                    $fastagStatusMessage = $this->getTagCodeMessage($execCode);
                }

                $usedForPayment = 1;
                $isTagActiveforPayment = 1;
            } else {
                $fastagStatusCode = $statusCode;
                $fastagStatusMessage = $this->getFastagErrorMessage($statusCode);
            }


            if ($vehicleNumber == "0") {
                //$vehicleNumber = $tagId;
            }


            $fastagDetail["vehicle_no"] = $anprVehicleNo != "0" ? $anprVehicleNo : $vehicleNumber;
            $fastagDetail["fastag_vehicle_no"] = $vehicleNumber;
            $fastagDetail["fastag_exec_code"] = $fastagStatusCode;
            $fastagDetail["fastag_exec_message"] = $fastagStatusMessage;
            $fastagDetail["fastagStatusCode"] = $fastagStatusCode;
            $fastagDetail["TAGID"] = $tagId;
            $fastagDetail["TID"] = $tagTid;
            return $fastagDetail;

        } catch (\Exception $e) {
            print_r($e->getMessage());
            $this->createLog(false, storage_path() . '/logs/fastag_engine/', "FASTag Entry --  " . $e->getMessage(), $entry, $response);
            return false;
        }

    }

    public function checkFastagTagDetailByVehicleNo_old_woring($entry, $type)
    {

        //print_r($entry);

        $response = '';
        try {
            $txnId = $entry['txn_id'];
            $tid = "";
            $tagId = "";
            $vehicleNo = $entry['vehicleNo'];
            $laneId = $entry['laneId'];

            $txnVehicleNumber = $vehicleNo;
            //print_r("txnVehicleNumber:"+$txnVehicleNumber);

            //nishant-fastag


            $fastagEntry = FastagEntry::where('txn_id', $txnId)->where('used_for_payment', "1")->get()->toArray();

            if (count($fastagEntry) > 0) {
                foreach ($fastagEntry as $fasEntry) {
                    $tid = $fasEntry['fastag_no']; //e2
                    $tagId = $fasEntry['fastag_id']; //34
                    $vehicleNo = $fasEntry['vehicle_no'];
                    $tagResponse = $this->reqTagDetails($tid, $vehicleNo, $tagId, $laneId, $txnId, $entry);
                    $tagStatusCode = isset($tagResponse['Txn']['Resp']['Vehicle']['@attributes']['errCode']) ? $tagResponse['Txn']['Resp']['Vehicle']['@attributes']['errCode'] : "";
                    $response = $tagResponse;
                    if ($tagStatusCode === "000") {
                        break;
                    }
                }
            }


            //$response = $this->reqTagDetails($tid, $vehicleNo, $tagId, $laneId, $txnId,$entry);


            $vehicleNumber = "0";
            $comVehicle = "";
            $execCode = "";
            $tagStatus = "";
            $vehClass = "";
            $tagTid = "";
            $usedForPayment = 0;
            $isTagActiveforPayment = 0;
            $tagId = $tagId;
            $fastagStatusMessage = "";
            $fastagStatusCode = "";


            $statusCode = isset($response['Txn']['Resp']['Vehicle']['@attributes']['errCode']) ? $response['Txn']['Resp']['Vehicle']['@attributes']['errCode'] : "";

            if ($statusCode == "000") {
                $VehicleDetailss = $response['Txn']['Resp']['Vehicle']['VehicleDetails'];

                foreach ($VehicleDetailss as $VehicleDetails1) {
                    if (isset($VehicleDetails1['Detail'])) {
                        $VehicleDetails = $VehicleDetails1['Detail'];
                    } else {
                        $VehicleDetails = $VehicleDetails1;
                    }

                    foreach ($VehicleDetails as $vehicleDetail) {
                        //print_r($vehicleDetail);

                        $value = $vehicleDetail['@attributes']['value'];
                        if ($vehicleDetail['@attributes']['name'] == "REGNUMBER") {
                            $vehicleNumber = $value;
                        } else if ($vehicleDetail['@attributes']['name'] == "COMVEHICLE") {
                            $comVehicle = $value;
                        } else if ($vehicleDetail['@attributes']['name'] == "EXCCODE") {
                            $execCode = $value;
                        } else if ($vehicleDetail['@attributes']['name'] == "TAGSTATUS") {
                            $tagStatus = $value;
                        } else if ($vehicleDetail['@attributes']['name'] == "VEHICLECLASS") {
                            $vehClass = $value;
                        } else if ($vehicleDetail['@attributes']['name'] == "TID") {
                            $tagTid = $value;
                        } else if ($vehicleDetail['@attributes']['name'] == "TAGID") {
                            $tagId = $value;
                        }
                    }

                    $searchForValue = ',';

                    if (strpos($execCode, $searchForValue) > 0) {
                        $fastagStatusCode = $execCode;
                        $codeArray = explode(",", $execCode);
                        $fastagStatusMessage = "";
                        foreach ($codeArray as $code) {
                            $fastagStatusMessage .= $this->getTagCodeMessage($code) . " | ";
                        }
                    } else {
                        $fastagStatusCode = $execCode;
                        $fastagStatusMessage = $this->getTagCodeMessage($execCode);
                    }

                    $usedForPayment = 1;
                    $isTagActiveforPayment = 1;
                    if ($fastagStatusCode == "00") {
                        if ($txnVehicleNumber != $vehicleNumber) {
                            return "Fastag vehicle not matched - " . $vehicleNumber . " -";
                        }

                        Transaction::where('id', $txnId)
                            ->update([
                                'fastag_vehicle_no' => $vehicleNumber,
                                'fastag_epc' => $tagTid,
                                'fastag_id' => strtolower($tagId),
                                'fastag_exec_code' => $fastagStatusCode,
                                'fastag_exec_message' => $fastagStatusMessage,
                                'fastag_lane' => $laneId,
                            ]);

                        break;
                    } else {
                        Transaction::where('id', $txnId)
                            ->update([
                                'fastag_vehicle_no' => $vehicleNumber,
                                'fastag_epc' => $tagTid,
                                'fastag_id' => strtolower($tagId),
                                'fastag_exec_code' => $fastagStatusCode,
                                'fastag_exec_message' => $fastagStatusMessage,
                                'fastag_lane' => $laneId,

                            ]);

                    }
                    DB::commit();
                }
            } else {
                $fastagStatusCode = $statusCode;
                $fastagStatusMessage = $this->getFastagErrorMessage($statusCode);
            }

            return $fastagStatusCode;

        } catch (\Exception $e) {
            print_r($e->getMessage());
            return false;
        }

    }

    public function checkFastagTagDetailByVehicleNo($entry, $type,$fastags)
    {

        //print_r($entry);
        //die("dddd222");
        $response = '';
        try {
            $txnId = $entry['txn_id'];
            $tid = "";
            $tagId = "";
            $vehicleNo = $entry['vehicleNo'];
            $laneId = $entry['laneId'];
            $isCPS = $entry['is_cps'];

            $txnVehicleNumber = $vehicleNo;


            $fastagStatusCode  = "1114";



            $fastagIdArray = [];
            $fastagEPCArray = [];
            foreach ($fastags as $fastag) {

                if($fastag['epc_id']){
                    $fastagEPCArray[] = $fastag['epc_id'];
                }
                if($fastag['tag_id']){

                    $fastagIdArray[] = strtolower($fastag['tag_id']);

                }
            }


            // if(count($fastagIdArray) <= 0){
            //     return 'FasTag Not Found';
            // }

            $fastagEntry = FastagEntry::where('txn_id', $txnId)->where('used_for_payment', "1")->groupBy('fastag_id')->orderBy('id','ASC')->get()->toArray();



            if($txnVehicleNumber != ""){

                $tid = "";
                $tagId = "";


                $tagResponse = $this->reqTagDetails($tid, $vehicleNo, $tagId, $laneId, $txnId, $entry);

                //print_r($tagResponse);
                //die("her");
                $tagStatusCode = isset($tagResponse['Txn']['Resp']['Vehicle']['@attributes']['errCode']) ? $tagResponse['Txn']['Resp']['Vehicle']['@attributes']['errCode'] : "";
                $response = $tagResponse;

                $statusCode = isset($response['Txn']['Resp']['Vehicle']['@attributes']['errCode']) ? $response['Txn']['Resp']['Vehicle']['@attributes']['errCode'] : "";
               
                if ($statusCode == "000") {
                    $VehicleDetailss = $response['Txn']['Resp']['Vehicle']['VehicleDetails'];


                    foreach ($VehicleDetailss as $VehicleDetails1) {
                        if (isset($VehicleDetails1['Detail'])) {
                            $VehicleDetails = $VehicleDetails1['Detail'];
                        } else {
                            $VehicleDetails = $VehicleDetails1;
                        }

                        foreach ($VehicleDetails as $vehicleDetail) {
                            //print_r($vehicleDetail);

                            $value = $vehicleDetail['@attributes']['value'];
                            if ($vehicleDetail['@attributes']['name'] == "REGNUMBER") {
                                $vehicleNumber = $value;
                            } else if ($vehicleDetail['@attributes']['name'] == "COMVEHICLE") {
                                $comVehicle = $value;
                            } else if ($vehicleDetail['@attributes']['name'] == "EXCCODE") {
                                $execCode = $value;
                            } else if ($vehicleDetail['@attributes']['name'] == "TAGSTATUS") {
                                $tagStatus = $value;
                            } else if ($vehicleDetail['@attributes']['name'] == "VEHICLECLASS") {
                                $vehClass = $value;
                            } else if ($vehicleDetail['@attributes']['name'] == "TID") {
                                $tagTid = $value;
                            } else if ($vehicleDetail['@attributes']['name'] == "TAGID") {
                                $tagId = $value;
                            }
                        }

                        $searchForValue = ',';

                    if (strpos($execCode, $searchForValue) > 0) {
                            $fastagStatusCode = $execCode;
                            $codeArray = explode(",", $execCode);
                            $fastagStatusMessage = "";
                            foreach ($codeArray as $code) {
                                $fastagStatusMessage .= $this->getTagCodeMessage($code) . " | ";
                            }

                        } else {
                            $fastagStatusCode = $execCode;
                            $fastagStatusMessage = $this->getTagCodeMessage($execCode);

                        }

                        $usedForPayment = 1;
                        $isTagActiveforPayment = 1;
                        if ($fastagStatusCode == "00") {
                            break;
                        }

                    }
                    
                    $setting = $this->settings;

                    $this->Settings = new Settings();
                    $setting = $this->Settings->getAllRecord();
                    $fastag_vehicle_validation = $setting['fastag_vehicle_validation'];
                    

                    if($fastag_vehicle_validation == 1){
                         //print_r($fastagIdArray);
                         //print_r( $tagId);
                         
                       if (!in_array( strtolower($tagId), $fastagIdArray)) {
                            return "FasTag ID not Matched";
                       }
 
                    }
                    
                   // die("ddd");
                   

                    if($fastagStatusCode == "00"){
                        // if($txnVehicleNumber != $vehicleNumber){
                        //     return "Fastag vehicle not matched#423#@".$txnVehicleNumber."@".$vehicleNumber."@#-";
                        // }

                        if($isCPS == 1){
                            Transaction::where('id', $txnId)
                            ->update([
                                'fastag_vehicle_no' => $vehicleNumber,
                                'fastag_epc' => $tagTid,
                                'fastag_id' => strtolower($tagId),
                                'fastag_exec_code' => $fastagStatusCode,
                                'fastag_exec_message' => $fastagStatusMessage,
                                
                            ]);

                        }else{
                            Transaction::where('id', $txnId)
                            ->update([
                                'fastag_vehicle_no' => $vehicleNumber,
                                'fastag_epc' => $tagTid,
                                'fastag_id' => strtolower($tagId),
                                'fastag_exec_code' => $fastagStatusCode,
                                'fastag_exec_message' => $fastagStatusMessage,
                                'fastag_lane' => $laneId,
                            ]);

                        }


                        DB::commit();
                        //break;
                    } else {
                        if($isCPS == 1){
                            Transaction::where('id', $txnId)
                            ->update([
                                'fastag_vehicle_no' => $vehicleNumber,
                                'fastag_epc' => $tagTid,
                                'fastag_id' => strtolower($tagId),
                                'fastag_exec_code' => $fastagStatusCode,
                                'fastag_exec_message' => $fastagStatusMessage,
                                
                            ]);

                        }else{
                            Transaction::where('id', $txnId)
                            ->update([
                                'fastag_vehicle_no' => $vehicleNumber,
                                'fastag_epc' => $tagTid,
                                'fastag_id' => strtolower($tagId),
                                'fastag_exec_code' => $fastagStatusCode,
                                'fastag_exec_message' => $fastagStatusMessage,
                                'fastag_lane' => $laneId,
                            ]);

                        }

                        DB::commit();
                    }

                }else{
                    $fastagStatusCode = $tagStatusCode;
                }

                return $fastagStatusCode;

            }else{
                if (count($fastagEntry) > 0) {
                    foreach ($fastagEntry as $fasEntry) {

                        $vehicleNumber = "0";
                        $comVehicle = "";
                        $execCode = "";
                        $tagStatus = "";
                        $vehClass = "";
                        $tagTid = "";
                        $usedForPayment = 0;
                        $isTagActiveforPayment = 0;
                        $tagId = $tagId;
                        $fastagStatusMessage = "";


                        $tid = $fasEntry['fastag_no']; //e2
                        $tagId = $fasEntry['fastag_id']; //34
                        $vehicleNo = $fasEntry['vehicle_no'];

                        $tagResponse = $this->reqTagDetails($tid, $vehicleNo, $tagId, $laneId, $txnId, $entry);
                        $tagStatusCode = isset($tagResponse['Txn']['Resp']['Vehicle']['@attributes']['errCode']) ? $tagResponse['Txn']['Resp']['Vehicle']['@attributes']['errCode'] : "";
                        $response = $tagResponse;

                        $statusCode = isset($response['Txn']['Resp']['Vehicle']['@attributes']['errCode']) ? $response['Txn']['Resp']['Vehicle']['@attributes']['errCode'] : "";

                        if ($statusCode == "000") {
                            $VehicleDetailss = $response['Txn']['Resp']['Vehicle']['VehicleDetails'];


                            foreach ($VehicleDetailss as $VehicleDetails1) {
                                if (isset($VehicleDetails1['Detail'])) {
                                    $VehicleDetails = $VehicleDetails1['Detail'];
                                } else {
                                    $VehicleDetails = $VehicleDetails1;
                                }

                                foreach ($VehicleDetails as $vehicleDetail) {
                                    //print_r($vehicleDetail);

                                    $value = $vehicleDetail['@attributes']['value'];
                                    if ($vehicleDetail['@attributes']['name'] == "REGNUMBER") {
                                        $vehicleNumber = $value;
                                    } else if ($vehicleDetail['@attributes']['name'] == "COMVEHICLE") {
                                        $comVehicle = $value;
                                    } else if ($vehicleDetail['@attributes']['name'] == "EXCCODE") {
                                        $execCode = $value;
                                    } else if ($vehicleDetail['@attributes']['name'] == "TAGSTATUS") {
                                        $tagStatus = $value;
                                    } else if ($vehicleDetail['@attributes']['name'] == "VEHICLECLASS") {
                                        $vehClass = $value;
                                    } else if ($vehicleDetail['@attributes']['name'] == "TID") {
                                        $tagTid = $value;
                                    } else if ($vehicleDetail['@attributes']['name'] == "TAGID") {
                                        $tagId = $value;
                                    }
                                }

                                $searchForValue = ',';

                            if (strpos($execCode, $searchForValue) > 0) {
                                    $fastagStatusCode = $execCode;
                                    $codeArray = explode(",", $execCode);
                                    $fastagStatusMessage = "";
                                    foreach ($codeArray as $code) {
                                        $fastagStatusMessage .= $this->getTagCodeMessage($code) . " | ";
                                    }

                                } else {
                                    $fastagStatusCode = $execCode;
                                    $fastagStatusMessage = $this->getTagCodeMessage($execCode);

                                }

                                $usedForPayment = 1;
                                $isTagActiveforPayment = 1;
                                if ($fastagStatusCode == "00") {
                                    break;
                                }

                            }




                            if($fastagStatusCode == "00"){
                                if($txnVehicleNumber != $vehicleNumber){
                                    return "Fastag vehicle not matched#423#@".$txnVehicleNumber."@".$vehicleNumber."@#-";
                                }

                                if($isCPS == 1){
                                    Transaction::where('id', $txnId)
                                    ->update([
                                        'fastag_vehicle_no' => $vehicleNumber,
                                        'fastag_epc' => $tagTid,
                                        'fastag_id' => strtolower($tagId),
                                        'fastag_exec_code' => $fastagStatusCode,
                                        'fastag_exec_message' => $fastagStatusMessage,
                                        
                                    ]);
        
                                }else{
                                    Transaction::where('id', $txnId)
                                    ->update([
                                        'fastag_vehicle_no' => $vehicleNumber,
                                        'fastag_epc' => $tagTid,
                                        'fastag_id' => strtolower($tagId),
                                        'fastag_exec_code' => $fastagStatusCode,
                                        'fastag_exec_message' => $fastagStatusMessage,
                                        'fastag_lane' => $laneId,
                                    ]);
        
                                }
        




                               
                                DB::commit();
                                //break;
                            } else {


                                if($isCPS == 1){
                                    Transaction::where('id', $txnId)
                                    ->update([
                                        'fastag_vehicle_no' => $vehicleNumber,
                                        'fastag_epc' => $tagTid,
                                        'fastag_id' => strtolower($tagId),
                                        'fastag_exec_code' => $fastagStatusCode,
                                        'fastag_exec_message' => $fastagStatusMessage,
                                        
                                    ]);
        
                                }else{
                                    Transaction::where('id', $txnId)
                                    ->update([
                                        'fastag_vehicle_no' => $vehicleNumber,
                                        'fastag_epc' => $tagTid,
                                        'fastag_id' => strtolower($tagId),
                                        'fastag_exec_code' => $fastagStatusCode,
                                        'fastag_exec_message' => $fastagStatusMessage,
                                        'fastag_lane' => $laneId,
                                    ]);
        
                                }
        
                                DB::commit();
                            }

                        }

                        // if($tagStatusCode === "000"){
                        //     break;
                        // }

                        //print_r("nware----".$fastagStatusCode);

                    }
                    //die("here");
                    return $fastagStatusCode;
                }
            }


        } catch (\Exception $e) {
            print_r($e->getMessage());
            return false;
        }

    }

    public function reqTagDetailbyVehicleNumberNware($vehicleNo,$laneId, $txnId, $entry){

            $vehicleNumber = "0";
            $comVehicle = "";
            $execCode = "";
            $tagStatus = "";
            $vehClass = "";
            $tagTid = "";
            $usedForPayment = 0;
            $isTagActiveforPayment = 0;
            $tagId = "";
            $tid = "";
            $fastagStatusMessage = "";
            $fastagStatusCode  = "1113";


            $fastagTagSig = $entry["fastag_tag_signature"];
            $outtime = $entry["out_time"];
            $outtime = date("Y-m-d H:i:s",strtotime($outtime)+3);


            $tid = ""; //e2
            $tagId = ""; //34
            //$vehicleNo = $vehicleNo;


            $tagResponse = $this->reqTagDetails($tid, $vehicleNo, $tagId, $laneId, $txnId, $entry);

            $tagStatusCode = isset($tagResponse['Txn']['Resp']['Vehicle']['@attributes']['errCode']) ? $tagResponse['Txn']['Resp']['Vehicle']['@attributes']['errCode'] : "";
            $response = $tagResponse;

            $statusCode = isset($response['Txn']['Resp']['Vehicle']['@attributes']['errCode']) ? $response['Txn']['Resp']['Vehicle']['@attributes']['errCode'] : "";

            Transaction::where('id', $txnId)
            ->update([
                'out_time'=> $outtime,
                'fastag_tag_signature' =>$fastagTagSig,

            ]);
            DB::commit();


            if ($statusCode == "000") {
                $VehicleDetailss = $response['Txn']['Resp']['Vehicle']['VehicleDetails'];


                //print_r($VehicleDetailss);
                foreach ($VehicleDetailss as $VehicleDetails1) {
                    if (isset($VehicleDetails1['Detail'])) {
                        $VehicleDetails = $VehicleDetails1['Detail'];
                    } else {
                        $VehicleDetails = $VehicleDetails1;
                    }

                    foreach ($VehicleDetails as $vehicleDetail) {
                        //print_r($vehicleDetail);

                        $value = $vehicleDetail['@attributes']['value'];
                        if ($vehicleDetail['@attributes']['name'] == "REGNUMBER") {
                            $vehicleNumber = $value;
                        } else if ($vehicleDetail['@attributes']['name'] == "COMVEHICLE") {
                            $comVehicle = $value;
                        } else if ($vehicleDetail['@attributes']['name'] == "EXCCODE") {
                            $execCode = $value;
                        } else if ($vehicleDetail['@attributes']['name'] == "TAGSTATUS") {
                            $tagStatus = $value;
                        } else if ($vehicleDetail['@attributes']['name'] == "VEHICLECLASS") {
                            $vehClass = $value;
                        } else if ($vehicleDetail['@attributes']['name'] == "TID") {
                            $tagTid = $value;
                        } else if ($vehicleDetail['@attributes']['name'] == "TAGID") {
                            $tagId = $value;
                        }
                    }

                    $searchForValue = ',';

                    if (strpos($execCode, $searchForValue) > 0) {
                        $fastagStatusCode = $execCode;
                        $codeArray = explode(",", $execCode);
                        $fastagStatusMessage = "";
                        foreach ($codeArray as $code) {
                            $fastagStatusMessage .= $this->getTagCodeMessage($code) . " | ";
                        }
                    } else {
                        $fastagStatusCode = $execCode;
                        $fastagStatusMessage = $this->getTagCodeMessage($execCode);
                    }

                    $usedForPayment = 1;
                    $isTagActiveforPayment = 1;
                    if ($fastagStatusCode == "00") {
                        break;
                    }

                }

                if($fastagStatusCode == "00"){
                    $fastagEntry = new FastagEntry();
                    $fastagEntry->txn_id = $txnId;
                    $fastagEntry->vehicle_no = $vehicleNumber;
                    $fastagEntry->fastag_id = strtolower($tagId);
                    $fastagEntry->fastag_no = $tagTid;
                    $fastagEntry->tag_signature_data_hex = $fastagTagSig;
                    $fastagEntry->tag_vrn = "";
                    $fastagEntry->issuer_bank_id = "";
                    $fastagEntry->tag_v_class = "";
                    $fastagEntry->rfu = "";
                    $fastagEntry->epc_id = strtolower($tagId);
                    $fastagEntry->user_memory = $fastagTagSig;
                    $fastagEntry->used_for_payment = "1";
                    $fastagEntry->created_at = date('Y-m-d H:i:s');
                    $fastagEntry->save();

                    //$time = date("m/d/Y h:i:s a", time() + 30);



                    Transaction::where('id', $txnId)
                        ->update([
                            'fastag_vehicle_no' => $vehicleNumber,
                            'fastag_epc' => $tagTid,
                            'fastag_id' => strtolower($tagId),
                            'fastag_exec_code' => $fastagStatusCode,
                            'fastag_exec_message' => $fastagStatusMessage,
                            'fastag_tag_signature' =>$fastagTagSig,
                            'fastag_comment' => "1",
                            'fastag_lane' => $laneId,

                        ]);

                    DB::commit();
                    //break;
                } else {


                    Transaction::where('id', $txnId)
                        ->update([
                            'fastag_vehicle_no' => $vehicleNumber,
                            'fastag_epc' => $tagTid,
                            'fastag_id' => strtolower($tagId),
                            'fastag_exec_code' => $fastagStatusCode,
                            'fastag_exec_message' => $fastagStatusMessage,
                            'fastag_comment' => "1",
                            'fastag_lane' => $laneId,
                            'fastag_tag_signature' =>$fastagTagSig,


                        ]);
                    DB::commit();
                }

            }

            //die("here");
            return "000";

    }



    public function validateFastagNPCIApiCall($vehicleNo, $tagId="",$tid="")
    {

        $endpoint = config("fastag.fastag_url");
        $plazaId = config("fastag.plaza_id");
        $laneId = config("fastag.virtual_gate_id");


        $msgTime = date("Y-m-d\TH:i:s");


        $fastagServerTime = $this->getFastagApiTime($laneId);
        if (!empty($tagId)) {
            $vehicleNo = "";
            $tid = "";
            $tagId = strtoupper($tagId);
        }
        $txnId = "";


        $msgId = $this->getMsgId($plazaId, $laneId, $msgTime);
        //$time = $this->getTime($msgTime);
        $time = $fastagServerTime;

        //$time = date()
        $param = '{
                        "Action":"ReqTagDetails",
                        "Server":"' . config("fastag.server") . '",
                        "PlazaId":"' . $plazaId . '",
                        "LaneId":"' . $laneId . '",
                        "dolphinTxnId":"' . $txnId . '",
                        "Bank":"' . config("fastag.bank") . '",
                        "Head": {
                                    "ver":"' . config("fastag.version") . '",
                                    "ts":"' . $time . '",
                                    "orgId":"' . config("fastag.organization_id") . '",
                                    "msgId":"' . $msgId . '"
                                },
                        "Txn": {
                                    "id":"' . $msgId . '",
                                    "note":"",
                                    "refId":"",
                                    "refUrl":"",
                                    "type":"FETCH",
                                    "orgTxnId":"",
                                    "ts":"' . $time . '",
                                    "Vehicle":{
                                        "TID":"' . $tid . '",
                                        "vehicleRegNo":"' . $vehicleNo . '",
                                        "tagId":"' . $tagId . '"

                                    }
                                }

                    }';

        //print_r($param);
        $reqTagDetails = $this->curlCall($endpoint, $param);

        if($reqTagDetails != false){
            return json_decode(json_encode($reqTagDetails), true);
        }else{
            return false;
        }
    }


    public function validateFastagVehicleNumber($vehicleNo){

        $vehicleNumber = "0";
        $comVehicle = "";
        $execCode = "";
        $tagStatus = "";
        $vehClass = "";
        $tagTid = "";
        $usedForPayment = 0;
        $isTagActiveforPayment = 0;
        $tagId = "";
        $tid = "";
        $fastagStatusMessage = "";
        $fastagStatusCode  = "1113";


        $fastagTagSig = "";
        //$outtime = $entry["out_time"];
        $outtime = date("Y-m-d H:i:s");


        $tid = ""; //e2
        $tagId = ""; //34
        //$vehicleNo = $vehicleNo;


        $tagResponse = $this->validateFastagNPCIApiCall($vehicleNo,"","");

        $tagStatusCode = isset($tagResponse['Txn']['Resp']['Vehicle']['@attributes']['errCode']) ? $tagResponse['Txn']['Resp']['Vehicle']['@attributes']['errCode'] : "";
        $response = $tagResponse;

        $statusCode = isset($response['Txn']['Resp']['Vehicle']['@attributes']['errCode']) ? $response['Txn']['Resp']['Vehicle']['@attributes']['errCode'] : "";




        if ($statusCode == "000") {
            $VehicleDetailss = $response['Txn']['Resp']['Vehicle']['VehicleDetails'];


            //print_r($VehicleDetailss);
            foreach ($VehicleDetailss as $VehicleDetails1) {
                if (isset($VehicleDetails1['Detail'])) {
                    $VehicleDetails = $VehicleDetails1['Detail'];
                } else {
                    $VehicleDetails = $VehicleDetails1;
                }

                foreach ($VehicleDetails as $vehicleDetail) {
                    //print_r($vehicleDetail);

                    $value = $vehicleDetail['@attributes']['value'];
                    if ($vehicleDetail['@attributes']['name'] == "REGNUMBER") {
                        $vehicleNumber = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "COMVEHICLE") {
                        $comVehicle = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "EXCCODE") {
                        $execCode = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "TAGSTATUS") {
                        $tagStatus = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "VEHICLECLASS") {
                        $vehClass = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "TID") {
                        $tagTid = $value;
                    } else if ($vehicleDetail['@attributes']['name'] == "TAGID") {
                        $tagId = $value;
                    }
                }

                $searchForValue = ',';

                if (strpos($execCode, $searchForValue) > 0) {
                    $fastagStatusCode = $execCode;
                    $codeArray = explode(",", $execCode);
                    $fastagStatusMessage = "";
                    foreach ($codeArray as $code) {
                        $fastagStatusMessage .= $this->getTagCodeMessage($code) . " | ";
                    }
                } else {
                    $fastagStatusCode = $execCode;
                    $fastagStatusMessage = $this->getTagCodeMessage($execCode);
                }

                $usedForPayment = 1;
                $isTagActiveforPayment = 1;
                if ($fastagStatusCode == "00") {
                    break;
                }

            }


            if($fastagStatusCode == "00"){

                    return "ActiveTag";
            } else {

                return "InActiveTag-".$fastagStatusCode;
            }

        }else{
            return "InActiveTag-".$statusCode;
        }

    }


    public function getTagCodeMessage($execCode)
    {

        $fastagStatusMessage = "";
        $execCode = preg_replace('/[^0-9]/', '', $execCode);

        if ($execCode == "00") {
            $fastagStatusMessage = "Active Tag";
        } else if ($execCode == "01") {
            $fastagStatusMessage = "Hotlist Tag";
        } else if ($execCode == "02") {
            $fastagStatusMessage = "Exempted Tag";
        } else if ($execCode == "03") {
            $fastagStatusMessage = "Low Balance Tag";
        } else if ($execCode == "04") {
            $fastagStatusMessage = "Invalid Carriage Tag";
        } else if ($execCode == "05") {
            $fastagStatusMessage = "Blacklist Tag";
        } else if ($execCode == "06") {
            $fastagStatusMessage = "closed/replaced Tag";
        }

        return $fastagStatusMessage;
    }

    public function updateTransactionForFastagTagDetailForPayment($response, $laneId, $fastagType, $fastags)
    {
        try {
            $fastagPaymentStatusUpdate = false;


            $txnId = $response->id;


            if ($fastagType == "exit") {

                $entry['vehicleNo'] = $response->vehicle_number;
                $entry['laneId'] = $laneId;
                $entry['txn_id'] = $txnId;
                $entry['in_time'] = $response->in_time;
                $entry['out_time'] = $response->out_time;
                $entry['fastag_id'] = "";
                $entry['fastag_no'] = "";
                $entry['is_cps'] = $response->is_cps;

                $checkReqTagDetail = $this->checkFastagTagDetailByVehicleNo($entry, "",$fastags);
                //$response = $this->reqTagDetails($tid, $vehicleNo, $tagId, $laneId);

                if ($checkReqTagDetail == "00") {
                    //$fastagPaymentStatusUpdate = true;
                    $fastagResponseCode = "00";
                } else {
                    Transaction::where('id', $txnId)
                        ->update([
                            'fastag_pay' => '',
                            'fastag_comment' => $checkReqTagDetail
                        ]);
                    DB::commit();
                    $fastagResponseCode = $checkReqTagDetail;
                    //die($checkReqTagDetail);
                    //throw new \Exception($checkReqTagDetail);
                }

                return $fastagResponseCode;

            } else {

                $fastagEntry = FastagEntry::where('txn_id', $txnId)->get()->toArray();

                if (count($fastagEntry) > 0) {
                    $fastagResponseCode = "";
                    foreach ($fastagEntry as $entry) {


                        $tid = $entry['fastag_no'];
                        $tagId = $entry['fastag_id'];
                        $vehicleNo = $entry['vehicle_no'];
                        $entry['vehicleNo'] = $vehicleNo;
                        $entry['laneId'] = $laneId;
                        $entry['txn_id'] = $txnId;
                        $entry['in_time'] = $response->in_time;
                        $entry['out_time'] = $response->out_time;

                        $checkReqTagDetail = $this->performFastagTagDetail($entry, "transaction");

                        //$response = $this->reqTagDetails($tid, $vehicleNo, $tagId, $laneId);

                        if ($checkReqTagDetail == "000") {
                            //$fastagPaymentStatusUpdate = true;
                            $fastagResponseCode = "000";
                            break;
                        } else {
                            Transaction::where('id', $txnId)
                                ->update([
                                    'fastag_pay' => '',
                                    'fastag_comment' => $checkReqTagDetail
                                ]);
                            DB::commit();

                            $fastagResponseCode = $checkReqTagDetail;

                            //die($checkReqTagDetail);
                            //throw new \Exception($checkReqTagDetail);
                        }


                        /*
                        if (isset($response['Txn']['Resp']['Vehicle']['VehicleDetails'][0]['Detail'][0]['@attributes']['value']) && $response['Txn']['Resp']['@attributes']['respCode']) {
                            $vehicleNumber = $response['Txn']['Resp']['Vehicle']['VehicleDetails'][0]['Detail'][0]['@attributes']['value'];
                            $tagStatus = $response['Txn']['Resp']['Vehicle']['VehicleDetails'][0]['Detail'][4]['@attributes']['value'];
                            $comVehicle = $response['Txn']['Resp']['Vehicle']['VehicleDetails'][0]['Detail'][3]['@attributes']['value'];
                            $statusCode = $response['Txn']['Resp']['@attributes']['respCode'];

                            if ($statusCode == '000') {
                                $fastag = FastagEntry::where('id', $entry['id'])
                                    ->update([
                                        'vehicle_no' => $vehicleNumber,
                                        'exccode' => $statusCode,
                                        'comvehicle' => $comVehicle,
                                        'tag_status' => $tagStatus,
                                        'used_for_payment' => 1,
                                        'cron_status' => 1,
                                    ]);

                                //Update Transaction vehicle no
                                Transaction::where('id', $txnId)
                                    ->update([
                                        'fastag_vehicle_no' => $vehicleNumber,
                                        'fastag_id' => $entry['fastag_id']
                                    ]);
                                DB::commit();
                                $fastagPaymentStatusUpdate = true;
                            }
                        } else {
                            DB::rollback();
                            throw new \Exception('Invalid FASTag Response');
                        }

                        */

                        // if ($fastagPaymentStatusUpdate) {
                        //     break;
                        // } else {
                        //     Transaction::where('id', $txnId)
                        //         ->update([
                        //             'fastag_pay' => 'cancel',
                        //             'fastag_comment' => 'FASTag IDs are blacklisted'
                        //         ]);
                        //     DB::commit();
                        //     throw new \Exception('FASTag IDs are blacklisted');
                        // }
                    }
                    return $fastagResponseCode;
                }
            }


            //throw new \Exception('FASTag IDs are not Found');

        } catch (\Exception $e) {
            $this->createLog(false, storage_path() . '/logs/fastag_engine/', "FASTag Transaction  ", $txnId, $e->getMessage());
            return false;
        }

    }


    public function getFastagErrorMessage($checkFastagTagStatus)
    {
        if ($checkFastagTagStatus) {
            $errorMsg = FastagErrorList::where('error_code', $checkFastagTagStatus)->get()->first();
            if (!empty($errorMsg)) {
                return $errorMsg->description;
            }
            return '';
        }
        return '';
    }

}
