<?php

include '../config.php';
date_default_timezone_set('Asia/Kolkata');
$body = file_get_contents('php://input');
$object = json_decode($body);
$Requesttime=date('d-M-Y h:i:s', time());
$seconds = microtime(true)*1000;
$memID=uniqid();
error_log("Distance Leg Wise API");
error_log(" Legwise API ID: ".$memID." Before Script Start Mem:".round(memory_get_usage()/1048576,2)." MB");
$SpeedLimit=70;
$accountID = isset($object->accountID) ? $object->accountID : $accountID;
$deviceID = isset($object->deviceID) ? $object->deviceID : $deviceID;
$DriftCount=0;
$tempaccountID = $accountID;
if ($accountID == "gvk-up-108") {
    if (!getDeviceServer($deviceID)) { //check vehicle is in present server or not
        $tacserver = "up108eastapilocal";
        $gtsserver = "up108eastapilocal";
        //$tacserver="up108eastlocal";
        //$gtsserver="up108eastlocal";
        $LiveEventDBserver = "up108eastlocal";
        $LiveTAC = "up108eastlocal";
        $LiveGTS = "up108eastlocal";
        if (!getDeviceServer($deviceID)) {

            $LiveGTS = "als2local";
            $gtsserver = "als2local";
            //$LiveEventDBserver="als2local";
            // $tacserver="als2local";
            $tempaccountID = 'gvk-up-backup';
        }

    }
}

if ($accountID == "gvk-up-102") {
    if (!getDeviceServer($deviceID)) { //check vehicle is in present server or not
        $tacserver = "up102eastapilocal";
        $gtsserver = "up102eastapilocal";
        $LiveEventDBserver = "up102eastlocal";
        $LiveTAC = "up102eastlocal";
        $LiveGTS = "up102eastlocal";

        if (!getDeviceServer($deviceID)) {
            $LiveGTS = "als2local";
            $gtsserver = "als2local";
            // $LiveEventDBserver="als2local";
            // $tacserver="als2local";
            $tempaccountID = 'gvk-up-backup';
        }

    }
}

$user = $object->user;
$password = $object->password;

if (!($user == $apiusername && $password == $apipassword)) {
    echo '{"result": "' . "Incorrect API credentials" . '"}';
    return;
}
if (isset($object->accountID)) {
    $accountID = $object->accountID;
} else {
    echo '{"result": "' . "Incorrect Account ID" . '"}';
    return;
}
$accountID = $tempaccountID;
$formate = 'json';

$bdtime = $object->baseDepartTime ?? 0;
$brtime = $object->baseReachTime ?? 0;
$ptime = $object->prevCaseTime ?? 0;
$ntime = $object->nextCaseTime ?? 0;
$drtime =0;
$ddtime =0;
$ben_count = $object->beneficiaryCount ?? 0;
$prtime = [];
$pdtime = [];
$btpoints = $object->beneficiaryTripPoints;
$isCovid = $object->covid;
$isUadOrFirstAid = $object->uadOrFirstAid;
if (!$isUadOrFirstAid) {
    $drtime = $object->dropReachTime;
    $ddtime = $object->dropDepartTime;
}
if ($isCovid) {
     for ($i = 1; $i <= $ben_count; $i++) {

        $prtime[$i - 1] = $btpoints[$i - 1]->pickupReachTime;
        $pdtime[$i - 1] = $btpoints[$i - 1]->pickupDepartTime;
    }

} else {

    $ben_count = 1;
    $prtime[0] = $object->pickupReachTime;
    $pdtime[0] = $object->pickupDepartTime;
}

/*if ($isCovid && $isUadOrFirstAid) {
    $ben_count = 1;
    $prtime[0] = $object->pickupReachTime;
    $pdtime[0] = $object->pickupDepartTime;
}*/
//var_dump($btpoints);
$fromDate = $bdtime;
$toDate = $brtime;
$requestTime = time();
$response = '';
$jsonresponse = '';
$i = 0;
$totaltripdistance = 0;
$btopdistance = 0;
$ptodrdistance = 0;
$drtodddistance = 0;
$ddtobrdistance = 0;
$prtobrdistance = 0;
$ptopdistance = [];
$prtopddistance = [];
$atPickup = "";

//Base depart to Pickup reach time
if ($bdtime != 0 && $prtime[0] != 0) {
    $btopdistance1 = getCaseDistance($accountID, $deviceID, $bdtime, $prtime[0]);
    $btopdistance2 = explode('*', $btopdistance1);
    $btopdistance = $btopdistance2[0];
    $totaltripdistance += $btopdistance;
}
//Pickup reach time to Pickup depart time
for (; $i < $ben_count; $i++) {
    $prtopddistance[$i] = 0;
    if ($prtime[$i] != 0 && $pdtime[$i] != 0) {
        $prtopddistance1 = getCaseDistance($accountID, $deviceID, $prtime[$i], $pdtime[$i]);
        $prtopddistance2 = explode('*', $prtopddistance1);
        $prtopddistance[$i] = $prtopddistance2[0];
        $totaltripdistance += $prtopddistance[$i];
    }
    if ($isCovid) {
        $atPickup .= '"atPickup' . ($i + 1) . 'GpsKm":"' . $prtopddistance[$i] . '",';
        if ($i < $ben_count - 1) {
            $ptopdistance[$i] = 0;
            if ($prtime[$i] != 0 && $prtime[$i + 1] != 0) {
                $ptopdistance1 = getCaseDistance($accountID, $deviceID, $prtime[$i], $prtime[$i + 1]);
                $ptopdistance2 = explode('*', $ptopdistance1);
                $ptopdistance[$i] = $ptopdistance2[0];
                $totaltripdistance += $ptopdistance[$i];
            }
        }
    }
}
$i--;
if (!$isUadOrFirstAid) {
    //Pickup reach time to hospital or drop reach  time
    $ptodrdistance = 0;
    if ($prtime[$i] != 0 && $drtime != 0) {
        $ptodrdistance1 = getCaseDistance($accountID, $deviceID, $prtime[$i], $drtime);
        $ptodrdistance2 = explode('*', $ptodrdistance1);
        $ptodrdistance = $ptodrdistance2[0];
        $totaltripdistance += $ptodrdistance;
    }
    //hospital or drop reach time to hospital or drop depart time
    $drtodddistance = 0;
    if ($drtime != 0 && $ddtime != 0) {
        $drtodddistance1 = getCaseDistance($accountID, $deviceID, $drtime, $ddtime);
        $drtodddistance2 = explode('*', $drtodddistance1);
        $drtodddistance = $drtodddistance2[0];
        $totaltripdistance += $drtodddistance;
    }
    //hospital reach time to Base reach time
    $ddtobrdistance = 0;
    if ($drtime != 0 && $brtime != 0) {
        $ddtobrdistance1 = getCaseDistance($accountID, $deviceID, $drtime, $brtime);
        $ddtobrdistance2 = explode('*', $ddtobrdistance1);
        $ddtobrdistance = $ddtobrdistance2[0];
        $totaltripdistance += $ddtobrdistance;
    }
}
//else{
    //Pickup reach time to Base reach time
    $prtobrdistance = 0;
    if ($prtime[$i] != 0 && $brtime != 0) {
        $prtobrdistance1 = getCaseDistance($accountID, $deviceID, $prtime[$i], $brtime);
        $prtobrdistance2 = explode('*', $prtobrdistance1);
        $prtobrdistance = $prtobrdistance2[0];
        if($isUadOrFirstAid){
	    $totaltripdistance += $prtobrdistance;
	}
    }

//}

//Previous case base reach time to base start time
$ptocdistance = 0;
if ($ptime != 0 && $bdtime != 0) {
    $ptocdistance1 = getCaseDistance($accountID, $deviceID, $ptime, $bdtime);
    $ptocdistance2 = explode('*', $ptocdistance1);
    $ptocdistance = $ptocdistance2[0];
}

//Base reach to next case start time
$ctondistance = 0;
if ($brtime != 0 && $ntime != 0) {
    $ctondistance1 = getCaseDistance($accountID, $deviceID, $brtime, $ntime);
    $ctondistance2 = explode('*', $ctondistance1);
    $ctondistance = $ctondistance2[0];

}

//Base depart to Base reach
$caseDist = getCaseDistance($accountID, $deviceID, $fromDate, $toDate);
$caseDistsplit = explode('*', $caseDist);
$casedistance = $caseDistsplit[0];

$offlineTime = $caseDistsplit[7];
$gapstatus = $caseDistsplit[8];

$speedatstart = $caseDistsplit[9];
$speedatend = $caseDistsplit[10];
$offlineStus = "false";
if ($offlineTime > 600) { //more than 10 minits
    $offlineStus = "true";
}
if ($totaltripdistance - $casedistance < 1.0) {
   $offlineStus = "false";
}
$diff=$toDate - $fromDate;
//if offline more then given value
if (($offlineTime/($diff))*100 > 5) {
   $offlineStus = "true";
}

$jsonresponse = '{"Status":"success","offline":"' . $offlineStus . '","currentToPrevGPSKm":"' . $ptocdistance . '","baseToPickupGPSKm":"' . $btopdistance. '",';
if ($isCovid) {
    for ($i = 1; $i < $ben_count; $i++) {

        $jsonresponse .= '"pickup' . $i . 'ToPickup' . ($i + 1) . 'GpsKm":"' . $ptopdistance[$i - 1] . '",';
    }
    $jsonresponse .= $atPickup;
}
else{
    $jsonresponse .= '"atPikcupGPSKm":"' . $prtopddistance[0] . '",';
}
if (!$isUadOrFirstAid) {
    $jsonresponse .= '"pickupToDropGPSKm":"' . $ptodrdistance . '","atDropGPSKm":"' . $drtodddistance. '","dropToBaseGPSKm":"' . $ddtobrdistance. '",';
}
else{
    $jsonresponse .= '"pickupToDropGPSKm":"0.0","atDropGPSKm":"0.0","dropToBaseGPSKm":"0.0",';
}

$isDrift="no";
if($DriftCount>0){
   $isDrift="yes";
 }
$jsonresponse .= '"pickupToBaseGPSKm":"' . $prtobrdistance . '","totalTripGPSKm":"' . $casedistance . '","currentToNextGPSKm":"' . $ctondistance . '","isDrift":"'.$isDrift.'"}';

$response = "success";
if ($formate == "xml") {
    header("Content-Type: text/xml;charset=utf-8");
    echo "<?xml version='1.0' standalone='yes'?><casemanager><Status>" . $response . "</Status><ReceivedTime>" . date('d-M-Y h:i:s a', time()) . "</ReceivedTime></casemanager>";
} else {
    header('Content-Type: application/json');
    echo $jsonresponse;
   $resseconds=microtime(true)*1000;
$diff=round($resseconds)-round($seconds);
error_log(" Request ms: ".$seconds." Response ms: ".$resseconds."   Diff:  ".$diff."ms  DeviceID:  ".$deviceID." BD/BR ".$bdtime."/".$brtime);
}



error_log(" Legwise API ID: ".$memID." After End Script Mem:".round(memory_get_usage()/1048576,2)." MB");
function getCaseDistance($accountID, $deviceID, $fromDate, $toDate)
{
    global $gtsusername, $gtspassword, $gtsdb, $apiname, $gtsserver, $LiveEventDBserver,$memID,$DriftCount,$SpeedLimit;
    $currentTime = time();
    $difftime1 = $currentTime - $fromDate;
    $difftime2 = $currentTime - $toDate;
    if ($difftime1 < 11700 || $difftime2 < 11700) {
        // request for before 3 hours 15 mts data go to production server
        $gtsserver = $LiveEventDBserver;
    }
    $gtsconnect = mysqli_connect($gtsserver, $gtsusername, $gtspassword) or die ("Unable to connect to gtsdb: " . mysqli_error($gtsconnect));
    mysqli_select_db($gtsconnect, $gtsdb);
    $totaldis = 0;
    $startlat = 0;
    $startlong = 0;
    $endlat = 0;
    $endlong = 0;
    $stime = 0;
    $etime = 0;
    $speedatstart = 0;
    $speedatend = 0;
    $i = 0;
    $eventData = array(array());
    $Query = " SELECT heading, geozoneID,timestamp,deviceID,FROM_UNIXTIME(timestamp) as 'time1',speedKPH,address,odometerKM+odometerOffsetKM as 'distance',statusCode,analog0,latitude,longitude FROM `EventData` where accountID='$accountID' and deviceID='$deviceID'  and  timestamp between '$fromDate' and '$toDate' and latitude<>0 and longitude<>0  order by timestamp asc ";  //request from web for particular vehicle
//error_log($Query);
   // error_log("From Date ".date('d-m-Y H:i:s',$fromDate)."  ToDate:".date('d-m-Y H:i:s',$toDate));
    $qry_result = mysqli_query($gtsconnect, $Query) or die(mysqli_error($gtsconnect));
    $offlineTime = 0;
    $recordscount = mysqli_num_rows($qry_result);

    $offlinestarttime = 0;
    $gapstatus = "";

    $requestgaptime = abs(time() - $toDate);
    $eventCheckTotime = time();
    if ($requestgaptime > 259200) {//if request gap greater then 72 hours,than add 72 hours to case colse time (todate)
        $eventCheckTotime = $toDate + 259200;
    }
  // echo $gtsserver;
  // echo "Count:".$recordscount;
  // echo $Query;
    while ($row = mysqli_fetch_assoc($qry_result)) {
        if ($row['latitude'] != 0 && $row['longitude'] != 0) {
            $eventData[$i][0] = $row['latitude'];
            $eventData[$i][1] = $row['longitude'];
            $eventData[$i][2] = $row['timestamp'];
            $eventData[$i][3] = $row['statusCode'];
            if ($i > 0) {

                $endlat = $row['latitude'];
                $endlong = $row['longitude'];
                $etime = $row['timestamp'];
                $speedatend = $row['speedKPH'];
                $eventtoeventdistance = distance1($row['latitude'], $row['longitude'], $eventData[$i - 1][0], $eventData[$i - 1][1]);
                $difftimes = abs(($eventData[$i][2]) - ($eventData[$i - 1][2]));

                $gapstatus = "completegps";
                if ($difftimes > 600) {
                    //   echo $eventData[$i-1][3]."  ".$eventData[$i][3];
                    //  echo date('d-m-y H:i:s',$eventData[$i-1][2])."  ".date('d-m-y H:i:s',$eventData[$i][2]);
                    if ($eventData[$i - 1][3] == "61717" || $eventData[$i][3] == "61717") {//lessthan then 10 mints  is invalid offline between ignition off and ignition on,take morethen 20 mints is valid
                        if ($difftimes > 1200) {
                            $offlineTime += $difftimes;
                            $offlinestarttime = $eventData[$i][2];
                            $gapstatus = EventCount($gtsconnect, $accountID, $deviceID, $offlinestarttime, $eventCheckTotime, $gapstatus);
                        }

                    } else {
                        $offlineTime += $difftimes;
                        $offlinestarttime = $eventData[$i][2];
                        $gapstatus = EventCount($gtsconnect, $accountID, $deviceID, $offlinestarttime, $eventCheckTotime, $gapstatus);

                    }

                }
                $maxDistanceTravelledperMint = 2;//max km travelled per mint
                $calculatedDistenceTravelledperMint = intval($eventtoeventdistance) / $difftimes;
                 //distance 0.201 me sec =5 = 0.0402 invalid ,distance 0.201/6=0.03,,              6 sec 200 meter ,mint 10*200=2000 meters 2 , 1 hour 120/
                //Speed calculation 
                 $distanceInKm=$eventtoeventdistance*1000;
                 $speed=$distanceInKm/$difftimes;
                 $speed=intval($speed*(18/5));//speed in km/hr
                 if($speed>$SpeedLimit){
                         $DriftCount++;
                  }
             
                if (is_nan($eventtoeventdistance) || ($eventtoeventdistance / $difftimes > 0.04)) {//if distnace greater than 2 km with 5 minits then distnace=0 bzc drift point in
                    $eventtoeventdistance = 0;
                } else {
                    $totaldis = $totaldis + $eventtoeventdistance;
                    $i++;
                }
            }

            if ($i == 0) {
                $speedatstart = $row['speedKPH'];
                $startlat = $row['latitude'];
                $startlong = $row['longitude'];
                $stime = $row['timestamp'];
                $i++;
            }
        }
    }
    if ($recordscount < 2) {
        $offlineTime = abs($fromDate - $toDate);
        $offlinestarttime = $fromDate;
        //echo date('d-m-y H:i:s',$fromDate);
        $gapstatus = EventCount($gtsconnect, $accountID, $deviceID, $offlinestarttime, $eventCheckTotime, $gapstatus);
    }

    if (count($eventData) >= 2) {
        if (abs($fromDate - $eventData[0][2]) > 600) {
            $difftimes = abs($fromDate - $eventData[0][2]);
            // echo "Start". date('d-m-y H:i:s',$eventData[0][2]);
            // $offlineTime +=abs($fromDate-$eventData[0][2]);
            if ($eventData[0][3] == "61717") {//lessthan then 10 mints  is invalid offline between ignition off and ignition on,take morethen 20 mints is valid
                if ($difftimes > 1200) {
                    $offlineTime += $difftimes;
                    $offlinestarttime = $eventData[0][2];
                    $gapstatus = EventCount($gtsconnect, $accountID, $deviceID, $offlinestarttime, $eventCheckTotime, $gapstatus);
                }

            } else {
                $offlineTime += $difftimes;
                $offlinestarttime = $eventData[0][2];
                // $nowtime=$offlinestarttime+86400;;//time();
                $gapstatus = EventCount($gtsconnect, $accountID, $deviceID, $offlinestarttime, $eventCheckTotime, $gapstatus);

            }


        }
        if (abs($toDate - $eventData[count($eventData) - 1][2]) > 600) {
            // $offlineTime +=abs($toDate-$eventData[count($eventData)-1][2]);

            $difftimes = abs($toDate - $eventData[count($eventData) - 1][2]);
            //echo "End ".date('d-m-y H:i:s',$eventData[count($eventData)-1][2]);
            // $offlineTime +=abs($fromDate-$eventData[0][2]);
            if ($eventData[count($eventData) - 1][3] == "61717") {//lessthan then 10 mints  is invalid offline between ignition off and ignition on,take morethen 20 mints is valid
                if ($difftimes > 1200) {
                    $offlineTime += $difftimes;
                    $offlinestarttime = $eventData[count($eventData) - 1][2];
                    // $nowtime=$offlinestarttime+86400;;//time();
                    $gapstatus = EventCount($gtsconnect, $accountID, $deviceID, $offlinestarttime, $eventCheckTotime, $gapstatus);
                }

            } else {
                $offlineTime += $difftimes;
                $offlinestarttime = $eventData[count($eventData) - 1][2];
                //$nowtime=$offlinestarttime+86400;;//time();
                $gapstatus = EventCount($gtsconnect, $accountID, $deviceID, $offlinestarttime, $eventCheckTotime, $gapstatus);

            }

        }
    }


    $startlat = round($startlat, 5);
    $startlong = round($startlong, 5);
    $endlat = round($endlat, 5);
    $endlong = round($endlong, 5);
    $totaldis = round($totaldis, 2);
    $resultdata = $totaldis . '*' . $startlat . '*' . $startlong . '*' . $endlat . '*' . $endlong . "*" . $stime . "*" . $etime . "*" . $offlineTime . "*" . $gapstatus . "*" . $speedatstart . "*" . $speedatend;
    mysqli_close($gtsconnect);
   // error_log(" Legwise API ID: ".$memID." Before Clear Mem:".round(memory_get_usage()/1048576,2)." MB");
    unset($eventData);
   // error_log(" Legwise API ID: ".$memID." After Clear Mem:".round(memory_get_usage()/1048576,2)." MB");
    return $resultdata;
}


function EventCount($gtsconnect, $accountID, $deviceID, $offlinestarttime, $nowtime, $gapstatus)
{
    $eventQry = "SELECT count(*) as count FROM EventData where accountID='$accountID' and deviceID='$deviceID'  and  timestamp between '$offlinestarttime' and '$nowtime' and latitude<>0 and longitude<>0  order by timestamp asc";
    //echo $eventQry;
    $evntcnt_result = mysqli_query($gtsconnect, $eventQry) or die(mysqli_error($gtsconnect));
    $recordscount = 0;
    while ($row11 = mysqli_fetch_assoc($evntcnt_result)) {
        $recordscount = $row11["count"];
    }
    $minmumevetsRequired = abs($nowtime - $offlinestarttime) / 300;//avg events
    if ($minmumevetsRequired < $recordscount) {
        $gapstatus = "completegps";
    } else {
        $gapstatus = "partialgps";
    }
    // echo "==".$offlineTime."offline time";

    // echo "  TKE".$minmumevetsRequired."   ====".$recordscount;
    return $gapstatus;
}

?>


