public function get_providers()
 {
     $token = Input::get('token');
     $owner_id = Input::get('id');
     $latitude = Input::get('latitude');
     $longitude = Input::get('longitude');
     $type = Input::get('type');
     $validator = Validator::make(array('token' => $token, 'owner_id' => $owner_id, 'latitude' => $latitude, 'longitude' => $longitude), array('token' => 'required', 'owner_id' => 'required|integer', 'latitude' => 'required', 'longitude' => 'required'));
     /* $var = Keywords::where('id', 2)->first(); */
     if ($validator->fails()) {
         $error_messages = $validator->messages()->all();
         $response_array = array('success' => false, 'error' => 'Invalid Input', 'error_code' => 401, 'error_messages' => $error_messages);
         $response_code = 200;
     } else {
         $is_admin = $this->isAdmin($token);
         if ($owner_data = $this->getOwnerData($owner_id, $token, $is_admin)) {
             // check for token validity
             if (is_token_active($owner_data->token_expiry) || $is_admin) {
                 // Do necessary operations
                 $is_multiple_service = Settings::where('key', 'allow_multiple_service')->first();
                 if ($is_multiple_service->value == 0) {
                     $archk = is_array($type);
                     Log::info('type = ' . print_r($archk, true));
                     if ($archk == 1) {
                         $type = $type;
                         Log::info('type = ' . print_r($type, true));
                     } else {
                         $type = explode(',', $type);
                         Log::info('type = ' . print_r($type, true));
                     }
                     if (!$type) {
                         // choose default type
                         $provider_type = ProviderType::where('is_default', 1)->first();
                         if (!$provider_type) {
                             $type = 1;
                         } else {
                             $type = $provider_type->id;
                         }
                     }
                     foreach ($type as $key) {
                         $typ[] = $key;
                     }
                     $ty = implode(",", $typ);
                     $typequery = "SELECT distinct provider_id from walker_services where type IN({$ty})";
                     $typewalkers = DB::select(DB::raw($typequery));
                     Log::info('typewalkers = ' . print_r($typewalkers, true));
                     if ($typewalkers == NULL) {
                         /* $driver = Keywords::where('id', 1)->first();
                            $response_array = array('success' => false, 'error' => 'No ' . $driver->keyword . ' found matching the service type.', 'error_code' => 405); */
                         $response_array = array('success' => false, 'error' => 'No ' . Config::get('app.generic_keywords.Provider') . ' found matching the service type.', 'error_code' => 405);
                         $response_code = 200;
                         return Response::json($response_array, $response_code);
                     }
                     foreach ($typewalkers as $key) {
                         $types[] = $key->provider_id;
                     }
                     $typestring = implode(",", $types);
                     Log::info('typestring = ' . print_r($typestring, true));
                     $settings = Settings::where('key', 'default_search_radius')->first();
                     $distance = $settings->value;
                     $settings = Settings::where('key', 'default_distance_unit')->first();
                     $unit = $settings->value;
                     if ($unit == 0) {
                         $multiply = 1.609344;
                     } elseif ($unit == 1) {
                         $multiply = 1;
                     }
                     $query = "SELECT " . "walker.*, " . "ROUND(" . $multiply . " * 3956 * acos( cos( radians('{$latitude}') ) * " . "cos( radians(latitude) ) * " . "cos( radians(longitude) - radians('{$longitude}') ) + " . "sin( radians('{$latitude}') ) * " . "sin( radians(latitude) ) ) ,8) as distance " . "from walker " . "where is_available = 1 and " . "is_active = 1 and " . "is_approved = 1 and " . "ROUND((" . $multiply . " * 3956 * acos( cos( radians('{$latitude}') ) * " . "cos( radians(latitude) ) * " . "cos( radians(longitude) - radians('{$longitude}') ) + " . "sin( radians('{$latitude}') ) * " . "sin( radians(latitude) ) ) ) ,8) <= {$distance} and " . "walker.id IN({$typestring}) " . "order by distance " . "LIMIT 5";
                     $walkers = DB::select(DB::raw($query));
                     Log::info('walkers = ' . print_r($walkers, true));
                     if ($walkers != NULL) {
                         $owner = Owner::find($owner_id);
                         $owner->latitude = $latitude;
                         $owner->longitude = $longitude;
                         $owner->save();
                         $request = new Requests();
                         $request->owner_id = $owner_id;
                         $request->request_start_time = date("Y-m-d H:i:s");
                         $request->save();
                         foreach ($type as $key) {
                             $reqserv = new RequestServices();
                             $reqserv->request_id = $request->id;
                             $reqserv->type = $key;
                             $reqserv->save();
                         }
                         $p = 0;
                         foreach ($walkers as $prov) {
                             $providers[$p]['id'] = $prov->id;
                             $providers[$p]['first_name'] = $prov->first_name;
                             $providers[$p]['last_name'] = $prov->last_name;
                             $providers[$p]['picture'] = $prov->picture;
                             $providers[$p]['phone'] = $prov->phone;
                             $providers[$p]['latitude'] = $prov->latitude;
                             $providers[$p]['longitude'] = $prov->longitude;
                             $providers[$p]['rating'] = $prov->rate;
                             $providers[$p]['car_model'] = $prov->car_model;
                             $providers[$p]['car_number'] = $prov->car_number;
                             $providers[$p]['bearing'] = $prov->bearing;
                             $provserv = ProviderServices::where('provider_id', $prov->id)->get();
                             $types = ProviderType::where('id', '=', $prov->type)->first();
                             foreach ($provserv as $ps) {
                                 if ($ps->base_price != 0) {
                                     $providers[$p]['base_price'] = $ps->base_price;
                                     $providers[$p]['price_per_unit_time'] = $ps->price_per_unit_time;
                                     $providers[$p]['price_per_unit_distance'] = $ps->price_per_unit_distance;
                                     $providers[$p]['base_distance'] = $types->base_distance;
                                 } else {
                                     /* $settings = Settings::where('key', 'base_price')->first();
                                        $base_price = $settings->value; */
                                     $providers[$p]['base_price'] = $types->base_price;
                                     $providers[$p]['price_per_unit_time'] = $types->price_per_unit_time;
                                     $providers[$p]['price_per_unit_distance'] = $types->price_per_unit_distance;
                                     $providers[$p]['base_distance'] = $types->base_distance;
                                 }
                             }
                             /* $rat = WalkerReview::where('walker_id', $prov->id)->get();
                                $countRating = count($rat); */
                             /* if ($countRating > 0) {
                                $sum = 0;
                                $count = 0;
                                foreach ($rat as $ratp) {
                                $sum = $ratp->rating + $sum;
                                $count = $count + 1;
                                }
                                $avgrat = $sum / $count;
                                $providers[$p]['rating'] = $avgrat;
                                } else {
                                $providers[$p]['rating'] = 0;
                                } */
                             $s = 0;
                             $total_price = 0;
                             foreach ($provserv as $ps) {
                                 foreach ($type as $tp) {
                                     $providers[$p]['type'] = $tp;
                                     if ($tp == $ps->type) {
                                         $total_price = $total_price + $ps->base_price;
                                     }
                                 }
                                 $s = $s + 1;
                             }
                             $providers[$p]['total_price'] = $total_price;
                             $p = $p + 1;
                         }
                         Log::info('providers = ' . print_r($providers, true));
                         $response_array = array('success' => true, 'request_id' => $request->id, 'provider' => $providers);
                         $response_code = 200;
                     }
                 } else {
                     // Do necessary operations
                     $archk = is_array($type);
                     Log::info('type = ' . print_r($archk, true));
                     if ($archk == 1) {
                         $type = (int) $type;
                         Log::info('type = ' . print_r($type, true));
                         $count = 1;
                     } else {
                         $type1 = explode(',', $type);
                         $type = array();
                         foreach ($type1 as $key) {
                             $type[] = (int) $key;
                         }
                         Log::info('type = ' . print_r($type, true));
                         $count = count($type);
                     }
                     if (!$type) {
                         // choose default type
                         $provider_type = ProviderType::where('is_default', 1)->first();
                         if (!$provider_type) {
                             $type = 1;
                         } else {
                             $type = $provider_type->id;
                         }
                     }
                     $settings = Settings::where('key', 'default_search_radius')->first();
                     $distance = $settings->value;
                     $settings = Settings::where('key', 'default_distance_unit')->first();
                     $unit = $settings->value;
                     if ($unit == 0) {
                         $multiply = 1.609344;
                     } elseif ($unit == 1) {
                         $multiply = 1;
                     }
                     $query = "SELECT " . "walker.id, " . "walker.first_name, " . "walker.last_name, " . "walker.picture, " . "walker.phone, " . "walker.latitude, " . "walker.longitude, " . "ROUND(" . $multiply . " * 3956 * acos( cos( radians('{$latitude}') ) * " . "cos( radians(latitude) ) * " . "cos( radians(longitude) - radians('{$longitude}') ) + " . "sin( radians('{$latitude}') ) * " . "sin( radians(latitude) ) ) ,8) as distance " . "from walker " . "where is_available = 1 and " . "is_active = 1 and " . "is_approved = 1 and " . "ROUND((" . $multiply . " * 3956 * acos( cos( radians('{$latitude}') ) * " . "cos( radians(latitude) ) * " . "cos( radians(longitude) - radians('{$longitude}') ) + " . "sin( radians('{$latitude}') ) * " . "sin( radians(latitude) ) ) ) ,8) <= {$distance} " . "order by distance " . "LIMIT 5";
                     $walker = DB::select(DB::raw($query));
                     $typewalker = array();
                     $typewalker1 = array();
                     foreach ($walker as $key) {
                         $typewalker[] = $key->id;
                     }
                     $flag = 0;
                     if ($typewalker) {
                         $walkers = ProviderServices::whereIn('provider_id', $typewalker)->whereIn('type', $type)->groupBy('provider_id')->havingRaw('count(distinct type) = ' . $count)->get();
                         foreach ($walkers as $key) {
                             $typewalker1[] = $key->provider_id;
                         }
                         if ($typewalker1) {
                             $walkers = Walker::whereIn('id', $typewalker1)->get();
                             if ($walkers) {
                                 $flag = 1;
                             }
                         }
                     }
                     if ($flag == 1) {
                         $c = 0;
                         foreach ($walkers as $key) {
                             $provider[$c]['id'] = $key->id;
                             $provider[$c]['first_name'] = $key->first_name;
                             $provider[$c]['last_name'] = $key->last_name;
                             $provider[$c]['picture'] = $key->picture;
                             $provider[$c]['phone'] = $key->phone;
                             $provider[$c]['latitude'] = $key->latitude;
                             $provider[$c]['longitude'] = $key->longitude;
                             $provider[$c]['rating'] = $key->rate;
                             $provider[$c]['car_model'] = $key->car_model;
                             $provider[$c]['car_number'] = $key->car_number;
                             $provider[$c]['bearing'] = $key->bearing;
                             $provserv = ProviderServices::where('provider_id', $key->id)->get();
                             foreach ($provserv as $ps) {
                                 $provider[$c]['type'] = $ps->type;
                                 $provider[$c]['base_price'] = $ps->base_price;
                             }
                             /* $rat = WalkerReview::where('walker_id', $key->id)->get();
                                                               $countRating = count($rat);
                             
                                                               if ($countRating > 0) {
                                                               $sum = 0;
                                                               $count = 0;
                                                               foreach ($rat as $ratp) {
                                                               $sum = $ratp->rating + $sum;
                                                               $count = $count + 1;
                                                               }
                                                               $avgrat = $sum / $count;
                                                               $provider[$c]['rating'] = $avgrat;
                                                               } else {
                                                               $provider[$c]['rating'] = 0;
                                                               } */
                             $s = 0;
                             $total_price = 0;
                             foreach ($provserv as $ps) {
                                 foreach ($type as $tp) {
                                     if ($tp == $ps->type) {
                                         $total_price = $total_price + $ps->base_price;
                                     }
                                 }
                                 $s = $s + 1;
                             }
                             $provider[$c]['total_price'] = $total_price;
                             $c = $c + 1;
                         }
                         Log::info('provider = ' . print_r($provider, true));
                         $response_array = array('success' => true, 'provider' => $provider);
                         $response_code = 200;
                     } else {
                         $response_array = array('success' => false, 'error' => 'No walker found');
                         $response_code = 200;
                     }
                 }
             } else {
                 $response_array = array('success' => false, 'error' => 'Token Expired', 'error_code' => 405);
                 $response_code = 200;
             }
         } else {
             if ($is_admin) {
                 /* $response_array = array('success' => false, 'error' => '' . $var->keyword . ' ID not Found', 'error_code' => 410); */
                 $response_array = array('success' => false, 'error' => '' . Config::get('app.generic_keywords.User') . ' ID not Found', 'error_code' => 410);
             } else {
                 $response_array = array('success' => false, 'error' => 'Not a valid token', 'error_code' => 406);
             }
             $response_code = 200;
         }
     }
     $response = Response::json($response_array, $response_code);
     return $response;
 }