<?php
include "../configAutoTrigger.php";

 include '../GTSDistanceCalculation.php';
   $unclosedCases=getUnclosedCases($accountID);

   for($caseindx=0;$caseindx<count($unclosedCases);$caseindx++){
         $caseID=$unclosedCases[$caseindx][0];
         $deviceID=$unclosedCases[$caseindx][1];
         $fromDate=$unclosedCases[$caseindx][2];
         $sceneReachTime=$fromDate+$unclosedCases[$caseindx][13];

         $toDate=time();//default case close time 4 hours a
         if($unclosedCases[$caseindx][8]=="close"){
             $toDate=$unclosedCases[$caseindx][7];
             if($toDate==0){
                  if(strtolower($unclosedCases[$caseindx][14])=="pickup"){
                      $toDate=$fromDate+7200;//two hours
                  }else{ 
                      $toDate=time();
                   }

              }
         }else if(strtolower($unclosedCases[$caseindx][14])=="pickup"){
                 $toDate=$fromDate+7200;//two hours
          }
       //echo $caseID."  ".$toDate."  ".$unclosedCases[$caseindx][14]."  ".$unclosedCases[$caseindx][8]."  ";
          if(time()>$toDate && $unclosedCases[$caseindx][5]==""){//if base arrivel not found
                  //echo date('d-m-Y H:i:s',$fromDate)."  ".date('d-m-Y H:i:s',$fromDate+7200)."<br>";
                  $result= getCaseDistance($accountID,$deviceID,$fromDate,$toDate);
                  $caseDistsplit=explode('*',$result);
                  $offlineTime=$caseDistsplit[7];
                  $offlineStus="SNR";
                  if($offlineTime>600){ //more than 10 minits
                    $offlineStus="ND";
                  }
                  $data=array(
                       "zoneType"=>"baseLocation",
                       "caseID"=> $caseID,
                       "accountID"=>$accountID,
                       "msg"=>$offlineStus
                  );
                 // var_dump($data);
                 //   callService($data);


              }



         $caseData=getCaseEvents($accountID,$deviceID,$fromDate,$toDate);
         $findHospital="no";
         $hospitalReachTime=0;
         $hospitalLat=0;
         $hospitalLng=0;
         $hospitalName="";
         $hospitalDepartTime=0;
         $tempgeozone="";
         $tempZoneArrivelTime="";
        $sceneCrossed="no";
         for($zindx=0;$zindx<count($caseData);$zindx++){
            if($caseData[$zindx][4]=="61968" && $unclosedCases[$caseindx][5]==""){
               if(strpos($caseData[$zindx][0], strtolower($deviceID))>-1){
                 
                  if($unclosedCases[$caseindx][9]!="" && $unclosedCases[$caseindx][9]>$caseData[$zindx][1]){ continue;} //ignore if base arrival less than scene arrival  
                  if($unclosedCases[$caseindx][10]!="" && $unclosedCases[$caseindx][10]>$caseData[$zindx][1]){ continue;} //ignore if base arrival less than scene depart    
                   if($unclosedCases[$caseindx][11]!="" && $unclosedCases[$caseindx][11]>$caseData[$zindx][1]){ continue;}//ignore if base arrival less than hsptl arrival
                   if($unclosedCases[$caseindx][12]!="" && $unclosedCases[$caseindx][12]>$caseData[$zindx][1]){ continue;}//ignore if base arrival less than hsptl depart

                   if($unclosedCases[$caseindx][6]!="" && $unclosedCases[$caseindx][6]>$caseData[$zindx][1]){ continue;}//ignore if base arrival less than base depart


                   //check assigned base to vehicle or not
                   $tempgeozone=$caseData[$zindx][0];
                   $tempZoneArrivelTime=$caseData[$zindx][1]; 
                   $speed=$caseData[$zindx][5];
                   $caseAssignTime=$fromDate;         
                   $diff=abs($tempZoneArrivelTime-$caseAssignTime);
       
                   if(($sceneReachTime-300)<$tempZoneArrivelTime || ($sceneReachTime+300)<$tempZoneArrivelTime){        //Base Arrivel Valid when scenereahcTime<eventTime 
                   

                    $result= getCaseDistance($accountID,$deviceID,$fromDate,$tempZoneArrivelTime);
                    $caseDistsplit=explode('*',$result);
                    $distance=$caseDistsplit[0];

                    $offlineTime=$caseDistsplit[7];
                    $offlineStus="false";
                    if($offlineTime>600){ //more than 10 minits
                       $offlineStus="true";
                    }
                    $baseID=str_replace('_'.strtolower($deviceID).'_base','',$tempgeozone);
                    $baseID=str_replace('_peak','',$baseID);

                    $data=array(
                       "zoneType"=>"baseLocation",
                       "caseID"=> $caseID,
                       "accountID"=>$accountID,
                       "alertType"=> 'Arrived',
                       "geozoneID"=>$baseID,
                       "triggerTime"=>$tempZoneArrivelTime,
                       "speed"=>$speed,
                        "distance"=>$distance,
                       "offlineStatus"=>$offlineStus
                   );
                 // var_dump($data);
                  callService($data);
                  $baseArrivalLatLng=$caseData[$zindx][2]."/".$caseData[$zindx][3];
                 $unclosedCases[$caseindx][5]=$tempZoneArrivelTime;
                 updateCaseStatus($accountID,$caseID,$tempZoneArrivelTime,"arrived",$baseArrivalLatLng);
                       //if base depart not found
                 if($unclosedCases[$caseindx][6]==""){ //if base depart not found
                      // get vehicle starting time meanse case assing time as base depart time
                      $basedepartdata=getStartingEvent($accountID,$deviceID,$fromDate,$fromDate+600);
                      if($basedepartdata[0][0]!="nodata"){
                          $data=array(
                            "zoneType"=>"baseLocation",
                            "caseID"=> $caseID,
                            "accountID"=>$accountID,
                            "alertType"=> 'Depart',
                            "geozoneID"=>'no',
                            "triggerTime"=>$basedepartdata[0][1],
                            "speed"=>$basedepartdata[0][5],
                            "distance"=>""
                        );
                        callService($data);
                        updateCaseStatus($accountID,$caseID,$basedepartdata[0][1],"departed",$basedepartdata[0][2]."/".$basedepartdata[0][3]);
                       // updateBaseStatus($accountID,$caseID);
                      }

                  }//end base depart not found
  
                }
             }
            }
            if($caseData[$zindx][4]=="62000" && $unclosedCases[$caseindx][6]==""){
                if(strpos($caseData[$zindx][0], strtolower($deviceID))>-1){ 

                   //check event before scene , hospitla and base arrivel
                   if($unclosedCases[$caseindx][9]!="" && $unclosedCases[$caseindx][9]<$caseData[$zindx][1]){ continue;} //ignore if base depart more than scene arrival  
                   if($unclosedCases[$caseindx][10]!="" && $unclosedCases[$caseindx][10]<$caseData[$zindx][1]){ continue;} //ignore if base depart more than scene depart
                   if($unclosedCases[$caseindx][11]!="" && $unclosedCases[$caseindx][11]<$caseData[$zindx][1]){ continue;}//ignore if base depart more than hsptl arrival
                   if($unclosedCases[$caseindx][12]!="" && $unclosedCases[$caseindx][12]<$caseData[$zindx][1]){ continue;}//ignore if base depart more than hsptl depart
    
                   if($unclosedCases[$caseindx][5]!="" && $unclosedCases[$caseindx][5]<$caseData[$zindx][1]){ continue;}//ignore if base depart more than base arrival
                //check assigned base to vehicle or not
                $tempgeozone=$caseData[$zindx][0];
                $tempZoneArrivelTime=$caseData[$zindx][1];
                $speed=$caseData[$zindx][5];
                $caseAssignTime=$fromDate;
                $diff=abs($tempZoneArrivelTime-$caseAssignTime);

               if(($sceneReachTime+300)>$tempZoneArrivelTime || ($sceneReachTime-300)>$tempZoneArrivelTime ){ //Base  Depart Valid when  scenereahcTime>eventTime 
                $baseID=str_replace('_'.strtolower($deviceID).'_base','',$tempgeozone);
                $baseID=str_replace('_peak','',$baseID);
                $data=array(
                       "zoneType"=>"baseLocation",
                       "caseID"=> $caseID,
                       "accountID"=>$accountID,
                       "alertType"=> 'Depart',
                       "geozoneID"=>$baseID,
                       "triggerTime"=>$tempZoneArrivelTime,
                       "speed"=>$speed,
                        "distance"=>""
               );
                //  var_dump($data);
                   callService($data);
                    $unclosedCases[$caseindx][6]=$tempZoneArrivelTime;
                   $baseDepartLatLng=$caseData[$zindx][2]."/".$caseData[$zindx][3];
                   updateCaseStatus($accountID,$caseID,$tempZoneArrivelTime,"departed",$baseDepartLatLng);
               }
             }
            }


       
          
            
         }

         // echo time()."  ".$toDate." ==".(time()>($toDate))." ++ ".$unclosedCases[$caseindx][5]." ".$unclosedCases[$caseindx][15]."<br>";
          if(time()>($toDate) && $unclosedCases[$caseindx][5]=="0" && $unclosedCases[$caseindx][15]=="0" && $unclosedCases[$caseindx][8]=="close"){//if base arrivel not found
               //  echo date('d-m-Y H:i:s',$fromDate)."  ".date('d-m-Y H:i:s',$fromDate+7200)."<br>";
                  $result= getCaseDistance($accountID,$deviceID,$fromDate,$fromDate+7200);
                  $caseDistsplit=explode('*',$result);
                  $offlineTime=$caseDistsplit[7];
                  $offlineStus="SNR";
                  if($offlineTime>600){ //more than 10 minits
                    $offlineStus="ND";
                  }
                  $data=array(
                       "zoneType"=>"baseLocation",
                       "caseID"=> $caseID,
                       "accountID"=>$accountID,
                       "msg"=>$offlineStus
                  );
                 // var_dump($data);
                  // callService($data);
                   updateBaseStatus($accountID,$caseID);

              }
/*
        if($hospitalReachTime!=0){
             $data=array();
             $data["zoneType"]="hospital";
             $data["caseID"]=$caseID;
             $data["accountID"]=$accountID;
              
             $data["reachHospitalLat"]=$hospitalLat;
             $data["reachHospitalLng"]=$hospitalLng;
             $data["reachToHospitalTime"]=$hospitalReachTime;
             $data["hospitalDepartTime"]=$hospitalDepartTime;
             $data["hospitalID"]=str_replace('_hsptl','',$hospitalName);
             $data["hospitalmatching"]=$findHospital;
             $data["sceneCrossed"]=$sceneCrossed;
            // $jsonDataEncoded=json_encode($data);
             var_dump($data);
             callService($data);
             updateCaseStatus($accountID,$caseID,$hospitalReachTime,$hospitalDepartTime);
        }
  */      
  }


function callService($jsonDataEncoded){
    //API URL

       global $triggerUrl;
       $url = $triggerUrl;
     var_dump($jsonDataEncoded);
     //  $url = 'http://test-crm.upeastemri.tk/api/glovision/saveGlovisionTripDetails';
        //create a new cURL resource
        $ch = curl_init($url);
        //setup request to send json via POST
        $payload = json_encode($jsonDataEncoded);
        //attach encoded JSON string to the POST fields
        curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
        //set the content type to application/json
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
        //return response instead of outputting
//        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        //execute the POST request
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
        curl_setopt($ch, CURLOPT_TIMEOUT_MS, 2000);

        $result = curl_exec($ch);
        echo $result;
        //close cURL resource
        curl_close($ch);

}
  function updateBaseStatus($accountID,$caseID){
       global $tacserver, $tacusername, $tacpassword,$tacdb,$LiveEventDBserver;
       $tacconnect = mysqli_connect($LiveEventDBserver,$tacusername,$tacpassword) or die ("Unable to connect to the database1 : " . mysqli_error($tacconnect));
       mysqli_select_db($tacconnect, $tacdb);
       $updatequery="";
       $qry="update caseManager set baseStatus='1' where accountID='$accountID' and caseID='$caseID'";
       //error_log($updatequery);
       mysqli_query($tacconnect,$qry) or die(mysqli_error($tacconnect));
       //echo $updatequery;
       mysqli_close($tacconnect);
 }
function getCaseEvents($accountID,$deviceID,$fromDate,$toDate) {
    global $gtsusername, $gtspassword, $gtsdb, $apiname,$gtsserver,$LiveEventDBserver;
   $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);
   $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 statusCode in ('62000','61968') and (geozoneID LIKE '%_base%' or geozoneID LIKE '%_hsptl%') order by timestamp asc ";  //request from web for particular vehicle
   $qry_result = mysqli_query($gtsconnect, $Query) or die(mysqli_error($gtsconnect));
   $i=0;
   while($row = mysqli_fetch_assoc($qry_result)) {
        $eventData[$i][0]=$row['geozoneID'];
        $eventData[$i][1]=$row['timestamp'];
        $eventData[$i][2]=$row['latitude'];
        $eventData[$i][3]=$row['longitude'];
        $eventData[$i][4]=$row['statusCode'];
         $eventData[$i][5]=$row['speedKPH'];
        $i++;
    }
   mysqli_close($gtsconnect);
   return $eventData;
}


 function updateCaseStatus($accountID,$caseID,$time,$alerttype,$latlng){
       global $tacserver, $tacusername, $tacpassword,$tacdb,$LiveEventDBserver;
       $tacconnect = mysqli_connect($LiveEventDBserver,$tacusername,$tacpassword) or die ("Unable to connect to the database1 : " . mysqli_error($tacconnect));
       mysqli_select_db($tacconnect, $tacdb);
       $updatequery="";
       $qry="update caseManager set baseArrivedTime='$time',baseReachLatLng='$latlng' where accountID='$accountID' and caseID='$caseID'";
       if($alerttype=="departed"){
           $qry="update caseManager set baseDepartedTime='$time',baseDepartLatLng='$latlng' where accountID='$accountID' and caseID='$caseID'";
      }

      echo $qry;
       //error_log($updatequery);
       mysqli_query($tacconnect,$qry) or die(mysqli_error($tacconnect));
       //echo $updatequery;
       mysqli_close($tacconnect);
 }


   function deleteGeozone($accountID,$geozoneID){
      global $LiveEventDBserver,$gtsusername,$gtspassword,$gtsdb;
       $gtsconnect = mysqli_connect($LiveEventDBserver,$gtsusername,$gtspassword) or die ("Unable to connect to the database: " . mysqli_error($gtsconnect));
       mysqli_select_db($gtsconnect,$gtsdb);
       $deleteqry="delete from Geozone where accountID='$accountID' and geozoneID='$geozoneID'";
       $qry1 = mysqli_query($gtsconnect,$deleteqry) or die(mysqli_error($gtsconnect));
       mysqli_close($gtsconnect);


   }

   function getUnclosedCases($accountID){
       global $tacserver, $tacusername, $tacpassword,$tacdb,$LiveEventDBserver,$caseCheckingTime;
       $tacconnect = mysqli_connect($LiveEventDBserver,$tacusername,$tacpassword) or die ("Unable to connect to the database1 : " . mysqli_error($tacconnect));
       mysqli_select_db($tacconnect, $tacdb);
       $updatequery="";
       $selectQuery="select baseStatus,caseType,baseToSourceEta,sceneReachTimestamp,sceneDepartTimestamp,destinationReachTimestamp1,destinationDepartTimestamp1,caseCloseTime,caseStatus,destinationLatitude1,destinationLongitude1,caseID,caseTimestamp,deviceID,baseDepartedTime,baseArrivedTime  from caseManager where accountID='$accountID' and  (UNIX_TIMESTAMP(NOW())-caseTimestamp)<$caseCheckingTime and (baseArrivedTime is null or baseDepartedTime is null) and caseID <> ''"; 
       //echo $selectQuery;
       //$selectQuery="select destinationLatitude1,destinationLongitude1,caseID,caseTimestamp,deviceID  from caseManager where accountID='$accountID' and deviceID='UP41G3347'   order by caseTimestamp desc limit 1";
       $qry_result=mysqli_query($tacconnect,$selectQuery) or die(mysqli_error($tacconnect));
       $caseInfomation=array(array());
       $i=0;
       while($row = mysqli_fetch_assoc($qry_result)) {
           $caseInfomation[$i][0]=$row["caseID"];
           $caseInfomation[$i][1]=$row["deviceID"];
           $caseInfomation[$i][2]=$row["caseTimestamp"];
           $caseInfomation[$i][3]=$row["destinationLatitude1"];
           $caseInfomation[$i][4]=$row["destinationLongitude1"];   
           $caseInfomation[$i][5]=$row["baseArrivedTime"]; 
           $caseInfomation[$i][6]=$row["baseDepartedTime"];
           $caseInfomation[$i][7]=$row["caseCloseTime"];
           $caseInfomation[$i][8]=$row["caseStatus"];

           $caseInfomation[$i][9]=$row["sceneReachTimestamp"];
           $caseInfomation[$i][10]=$row["sceneDepartTimestamp"];
           $caseInfomation[$i][11]=$row["destinationReachTimestamp1"];
           $caseInfomation[$i][12]=$row["destinationDepartTimestamp1"];
           $caseInfomation[$i][13]=($row["baseToSourceEta"]==""?0:$row["baseToSourceEta"]);
            $caseInfomation[$i][14]=$row["caseType"];
           $caseInfomation[$i][15]=$row["baseStatus"];
           $i++;
       }
       //error_log($updatequery);
       mysqli_close($tacconnect);
       return $caseInfomation;
 }



function distance1($lat1, $lon1, $lat2, $lon2) {
        if($lat1 == $lat2 && $lon1 == $lon2){
            return 0;

        }else{$theta = $lon1 - $lon2;
            $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
            $dist = acos($dist);
            $dist = rad2deg($dist);
            $miles = $dist * 60 * 1.1515;
            return $miles* 1.609344;
        }
 }

function getStartingEvent($accountID,$deviceID,$fromDate,$toDate) {
    global $gtsusername, $gtspassword, $gtsdb, $apiname,$gtsserver,$LiveEventDBserver;
   $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);
   $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' order by timestamp asc  limit 1";  //request from web for particular vehicle
   $qry_result = mysqli_query($gtsconnect, $Query) or die(mysqli_error($gtsconnect));
   $i=0;
   while($row = mysqli_fetch_assoc($qry_result)) {
        $eventData[$i][0]=$row['address'];
        $eventData[$i][1]=$row['timestamp'];
        $eventData[$i][2]=$row['latitude'];
        $eventData[$i][3]=$row['longitude'];
        $eventData[$i][4]=$row['statusCode'];
        $eventData[$i][5]=$row['speedKPH'];
        $i++;
    }
   if($i==0){
      $eventData[0][0]="nodata";
   }
   mysqli_close($gtsconnect);
   return $eventData;
}

?>
