/**
  * Finds the Comercio model based on its primary key value.
  * If the model is not found, a 404 HTTP exception will be thrown.
  * @param integer $id
  * @return Comercio the loaded model
  * @throws NotFoundHttpException if the model cannot be found
  */
 protected function findModel($id)
 {
     if (($model = Comercio::findOne($id)) !== null) {
         return $model;
     } else {
         throw new NotFoundHttpException('The requested page does not exist.');
     }
 }
 private function calcularRuta($usuario, $comerciosValidos)
 {
     //obtenemos las coordenadas del usuario (punto de partida en la ruta) y los comercios.
     $coordenadasUsuario = ['latitud' => $usuario->latitud, 'longitud' => $usuario->longitud];
     $latitudModificada = $usuario->latitud + 0.0001;
     $longitudModificada = $usuario->longitud + 0.0001;
     //$coordenadasUsuarioMod = ['latitud'=>$latitudModificada,'longitud'=>$longitudModificada];
     $coordenadasComercios = $this->obtenerCoordenadasComercios($comerciosValidos);
     $request = ['origin' => ['lat' => $coordenadasUsuario['latitud'], 'lng' => $coordenadasUsuario['longitud']], 'travelMode' => 'walking'];
     $comerciosOrdenados = [];
     //si tenemos mas de un comercio armamos la ruta con waypoints...
     if (count($comerciosValidos) > 1) {
         //armamos la primera url que nos ordena los comercios, de ahi sacamos el ultimo. En esta instancia el user es origen y destino.
         $comerciosIndexados = [];
         $url1 = "https://maps.googleapis.com/maps/api/directions/json?origin=" . $coordenadasUsuario['latitud'] . "," . $coordenadasUsuario['longitud'] . "&destination=" . $coordenadasUsuario['latitud'] . "," . $coordenadasUsuario['longitud'] . "&key=" . sysconfigs::API_KEY_GMAPS_RUTAS . "&mode=walking&waypoints=optimize:true";
         $i = 0;
         //guardamos los comercios por el indice en el cual se agrego en los waypoints.
         foreach ($coordenadasComercios as $idComercio => $coordenadasComercio) {
             $comercio = Comercio::findOne($idComercio);
             $url1 = $url1 . '|' . $coordenadasComercio['latitud'] . ',' . $coordenadasComercio['longitud'];
             $comerciosIndexados[$i] = $comercio;
             $i++;
         }
         $response = file_get_contents($url1);
         $json1 = json_decode($response, true);
         if ($json1['status'] == 'OK') {
             //obtenemos los waypoints ordenados y armamos la ruta desde el user hasta el ultimo waypoint recibido
             $ordenComercios = $json1['routes'][0]['waypoint_order'];
             $comercioDestino = $comerciosIndexados[end($ordenComercios)];
             $url2 = "https://maps.googleapis.com/maps/api/directions/json?origin=" . $coordenadasUsuario['latitud'] . "," . $coordenadasUsuario['longitud'] . "&destination=" . $comercioDestino->latitud . "," . $comercioDestino->longitud . "&key=" . sysconfigs::API_KEY_GMAPS_RUTAS . "&mode=walking&waypoints=optimize:true";
             foreach ($coordenadasComercios as $idComercio => $coordenadasComercio) {
                 if ($idComercio != $comercioDestino->id) {
                     $url2 = $url2 . '|' . $coordenadasComercio['latitud'] . ',' . $coordenadasComercio['longitud'];
                 }
             }
             $response = file_get_contents($url2);
             $json2 = json_decode($response, true);
             if ($json2['status'] == 'OK') {
                 $distancia = 0;
                 //calculamos la distancia total de la ruta.
                 $legs = $json2['routes'][0]['legs'];
                 foreach ($legs as $leg) {
                     $distancia = $distancia + $leg['distance']['value'];
                 }
                 if ($distancia <= sysconfigs::DISTANCIA_RELEVADOR) {
                     $request['destination'] = ['lat' => $comercioDestino->latitud, 'lng' => $comercioDestino->longitud];
                     $request['optimizeWaypoints'] = true;
                     $ordenComercios = $json1['routes'][0]['waypoint_order'];
                     //die("ordenComercios:".var_dump($ordenComercios));
                     $i = 0;
                     $request['waypoints'] = [];
                     foreach ($ordenComercios as $orden) {
                         if ($comerciosIndexados[$orden]->id != $comercioDestino->id) {
                             $comerciosOrdenados[$i] = $comerciosIndexados[$orden];
                             $request['waypoints'][$i] = ['lat' => $comerciosIndexados[$orden]->latitud, 'lng' => $comerciosIndexados[$orden]->longitud];
                             $i++;
                         }
                     }
                     $comerciosOrdenados[$i] = $comercioDestino;
                     return ['jsonRuta' => $json2, 'jsonRequest' => $request, 'comerciosOrdenados' => $comerciosOrdenados];
                 } else {
                     //desechamos uno de los comercios con menor prioridad que este lo mas cerca del final del recorrido.
                     $keyComercio = null;
                     $comercioDesechable = null;
                     foreach ($comerciosIndexados as $key => $comercio) {
                         if ($keyComercio == null) {
                             $keyComercio = $key;
                             $comercioDesechable = $comercio;
                         } else {
                             if ($comercio->prioridad >= $comercio->prioridad) {
                                 $keyComercio = $key;
                                 $comercioDesechable = $comercio;
                             }
                         }
                     }
                     unset($comerciosIndexados[$keyComercio]);
                     return $this->calcularRuta($usuario, $comerciosIndexados);
                 }
             } else {
                 //algo fallo!
                 return false;
             }
         } else {
             return false;
         }
     } else {
         //tenemos solo un comercio, por tanto la ruta generada es solo entre el usuario y el comercio.
         foreach ($coordenadasComercios as $idComercio => $coordenadasComercio) {
             $url3 = "https://maps.googleapis.com/maps/api/directions/json?origin=" . $coordenadasUsuario['latitud'] . "," . $coordenadasUsuario['longitud'] . "&destination=" . $coordenadasComercio['latitud'] . "," . $coordenadasComercio['longitud'] . "&key=" . sysconfigs::API_KEY_GMAPS_RUTAS . "&mode=walking";
             $response = file_get_contents($url3);
             $json3 = json_decode($response, true);
             if ($json3['status'] == 'OK') {
                 //vemos si la ruta generada no se pasa de la distancia
                 $distancia = 0;
                 //calculamos la distancia total de la ruta.
                 $legs = $json3['routes'][0]['legs'];
                 foreach ($legs as $leg) {
                     $distancia = $distancia + $leg['distance']['value'];
                 }
                 if ($distancia <= sysconfigs::DISTANCIA_RELEVADOR) {
                     $request['destination'] = ['lat' => $coordenadasComercio['latitud'], 'lng' => $coordenadasComercio['longitud']];
                     $comercio = Comercio::findOne($idComercio);
                     $comerciosOrdenados[0] = $comercio;
                     return ['jsonRuta' => $json3, 'jsonRequest' => $request, 'comerciosOrdenados' => $comerciosOrdenados];
                 } else {
                     //no se puede generar una ruta cumpliendo las reglas, por tanto se retorna false
                     return false;
                 }
             } else {
                 return false;
             }
         }
     }
 }