/**
  * get all route that passing certain bus stop
  *
  * @param $halte_id
  * @return \Illuminate\Http\JsonResponse
  */
 public function getRoutePassingBusStop($halte_id)
 {
     $busRouteModel = new BusRoute();
     $busRoute = $busRouteModel->select('rute_id')->where('halte_id', '=', $halte_id)->groupBy('rute_id')->get()->toArray();
     $response = array();
     if ($busRoute != null) {
         $response['code'] = 200;
         $response['data'] = $busRoute;
     } else {
         $response['code'] = 400;
         $response['data']['msg'] = 'bus stop is not registered in system, make sure you make correct request.';
     }
     header("Access-Control-Allow-Origin: *");
     return response()->json($response);
 }
 /**
  * check bus stop history,
  * if last visited bus is the last bus stop on its route, then delete record that related to that bus
  */
 public function checkBusStopHistory()
 {
     $busStopHistoryModel = new BusStopHistory();
     $busStopHistory = $busStopHistoryModel->where('plat_nomor', '=', $this->plat_nomor)->orderBy('arrival_history', 'desc')->with('routeOrder')->take(1)->get()->toArray();
     if (sizeof($busStopHistory > 0) && $busStopHistory != null) {
         $busRouteModel = new BusRoute();
         $lastRouteOrder = $busRouteModel->where('rute_id', '=', $busStopHistory[0]['rute_id'])->orderBy('urutan', 'desc')->take(1)->get()->toArray();
         //if bus has reach the last bus stop on its route, then delete related record
         if ($busStopHistory[0]['route_order']['urutan'] == $lastRouteOrder[0]['urutan']) {
             $busStopHistoryModel = new BusStopHistory();
             $busStopHistoryModel->where('plat_nomor', '=', $this->plat_nomor)->delete();
         }
     }
 }
 /**
  * Display bus stop operating in certain route
  *
  * @param $rute_id
  * @return \Illuminate\Http\JsonResponse
  */
 public function busStopOperationInRoute($rute_id)
 {
     $response = array();
     try {
         $busRouteModel = new BusRoute();
         $busStop = $busRouteModel->select('rute_id', 'halte_id', DB::raw('halte_id as slug'))->where('rute_id', '=', $rute_id)->with(array('detailHalte' => function ($query) {
             $query->addSelect('nama_halte', 'lokasi_halte', 'halte_id');
         }))->get()->toArray();
         if (isset($busStop[0])) {
             for ($i = 0; $i < sizeof($busStop); $i++) {
                 $busStop[$i]['rute_pass'] = $busRouteModel->select('rute_id')->where('halte_id', '=', $busStop[$i]['halte_id'])->groupBy('rute_id')->get()->toArray();
                 unset($busStop[$i]['halte_id']);
             }
             $response['code'] = 200;
             $response['data'] = $busStop;
         } else {
             $response['code'] = 400;
             $response['data']['msg'] = 'cannot find operating bus stop in this route, please try again later';
         }
     } catch (\Exception $e) {
         $response['code'] = 500;
         $response['data']['msg'] = "internal server error, please contact administrator";
     }
     header("Access-Control-Allow-Origin: *");
     return response()->json($response);
 }
 /**
  * get remaining bus stop information based on route_id of the bus and visited bus stop
  *
  * @param $plat_nomor
  * @return \Illuminate\Http\JsonResponse
  */
 public function remainingBusStop($plat_nomor)
 {
     $busOperationModel = new BusOperation();
     $busRouteModel = new BusRoute();
     $busStopHistoryModel = new BusStopHistory();
     $response = array();
     try {
         if ($plat_nomor == 'all') {
             $listBusOperation = $busOperationModel->get()->toArray();
             $counter = 0;
             $dataContainer = array();
             foreach ($listBusOperation as $busOperation) {
                 $busStopHistory = $busStopHistoryModel->where('plat_nomor', '=', $plat_nomor)->get()->toArray();
                 $visitedBusStopArray = array();
                 for ($i = 0; $i < sizeof($busStopHistory); $i++) {
                     $visitedBusStopArray[$i] = $busStopHistory[$i]['halte_id'];
                 }
                 $busRoute = $busRouteModel->where('rute_id', '=', $busOperation['rute_id'])->whereNotIn('halte_id', $visitedBusStopArray)->with('detailHalte')->get()->toArray();
                 if ($busRoute != null) {
                     $dataContainer[$counter] = $busRoute;
                 } else {
                     $dataContainer[$counter]['msg'] = 'route is not registered in system';
                 }
                 $counter++;
             }
             $response['code'] = 200;
             $response['data'] = $dataContainer;
         } else {
             $busOperation = $busOperationModel->where('plat_nomor', '=', $plat_nomor)->firstOrFail();
             $busStopHistory = $busStopHistoryModel->where('plat_nomor', '=', $plat_nomor)->get()->toArray();
             $visitedBusStopArray = array();
             for ($i = 0; $i < sizeof($busStopHistory); $i++) {
                 $visitedBusStopArray[$i] = $busStopHistory[$i]['halte_id'];
             }
             $busRoute = $busRouteModel->where('rute_id', '=', $busOperation['rute_id'])->whereNotIn('halte_id', $visitedBusStopArray)->with('detailHalte')->get()->toArray();
             $response['code'] = 200;
             if ($busRoute != null) {
                 $response['data'] = $busRoute;
             } else {
                 $response['data']['msg'] = 'route is not registered in system';
             }
         }
     } catch (\Exception $e) {
         $response['code'] = 200;
         $response['data']['msg'] = 'bus is not registered in system';
     }
     header("Access-Control-Allow-Origin: *");
     return response()->json($response);
 }
 /**
  * base recursion function, this will be self called if recursion condition happen
  *
  * @param $halte_id_origin
  * @param $halte_id_dest
  * @param $treeLevel
  * @return null
  */
 public function baseSearchRouteRecursion($halte_id_origin, $halte_id_dest, $treeLevel)
 {
     $busRouteModel = new BusRoute();
     $listBusRoute = $busRouteModel->where('halte_id', '=', $halte_id_dest)->with('detailHalte')->get()->toArray();
     //echo '<br><br>'.json_encode($listBusRoute).'<br>';
     foreach ($listBusRoute as $busRoute) {
         $this->response[$treeLevel] = $busRoute;
         //echo 'halte id origin'. $halte_id_origin. '<br>';
         //echo 'rute_id '. $busRoute['rute_id']. '<br>';
         try {
             $directOrigin = $busRouteModel->where('rute_id', '=', $busRoute['rute_id'])->where('halte_id', '=', $halte_id_origin)->with('detailHalte')->firstOrFail();
             //echo 'success <br>';
             $this->response[$treeLevel + 1] = $directOrigin;
             $this->counterRecursion = 0;
             return -1;
         } catch (\Exception $e) {
             //echo 'error message: '.$e;
             $this->counterRecursion++;
             //echo 'recursing ke '.$this->counterRecursion. '<br>';
             //echo 'urutan: '.($busRoute['urutan']-1). '<br>';
             //echo 'halte id '. $busRoute['halte_id']. '<br>';
             //echo 'rute_id '. $busRoute['rute_id']. '<br>';
             if ($busRoute['urutan'] - 1 == 0) {
             } else {
                 $prevBusStop = $busRouteModel->where('urutan', '=', $busRoute['urutan'] - 1)->where('rute_id', '=', $busRoute['rute_id'])->first();
                 if ($this->counterRecursion < 100) {
                     $status = $this->baseSearchRouteRecursion($halte_id_origin, $prevBusStop['halte_id'], $treeLevel + 1);
                     if ($status == -1) {
                         return -1;
                     }
                 } else {
                     $this->counterRecursion--;
                     return -1;
                 }
             }
         }
     }
 }