HEX
Server: Apache/2.4.41 (Amazon) OpenSSL/1.0.2k-fips PHP/5.6.40
System: Linux ip-172-31-40-18 4.14.146-93.123.amzn1.x86_64 #1 SMP Tue Sep 24 00:45:23 UTC 2019 x86_64
User: apache (48)
PHP: 5.6.40
Disabled: NONE
Upload Files
File: //var/www/html/punjabcabs/Original_Backup/app/Http/Controllers/UserApiController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Mail;
use DB;
use Log;
use Auth;
use Hash;
use Storage;
use Setting;
use Exception;
use Notification;
use Twilio;

use Carbon\Carbon;
use App\Http\Controllers\SendPushNotification;
use App\Notifications\ResetPasswordOTP;
use App\Helpers\Helper;

use Validator;
use App\Card;
use App\User;
use App\Provider;
use App\ContactList;
use App\Complaint;
use App\Settings;
use App\Promocode;
use App\ServiceType;
use App\UserRequests;
use App\RequestFilter;
use App\PromocodeUsage;
use App\ProviderService;
use App\UserRequestRating;
use App\Http\Controllers\ProviderResources\TripController;


class UserApiController extends Controller
{
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function signup(Request $request)
    {
        
            $validator = Validator::make($request->all(), [
                'social_unique_id' => ['required_if:login_by,facebook,google','unique:users'],
                'device_type' => 'required|in:android,ios',
                'device_token' => 'required',
                'device_id' => 'required',
                'login_by' => 'required|in:manual,facebook,google',
                'first_name' => 'required|max:255',
                'last_name' => 'required|max:255',
                'email' => 'required|email|max:255|unique:users',
                'mobile' => 'required',
                'password' => 'required|min:6',
            ]);
            if($validator->fails()) {
                return response()->json(['error' =>$validator->messages()], 500);
            }

        try{
            
            $User = $request->all();

            $User['payment_mode'] = 'CASH';
            $User['password'] = bcrypt($request->password);
            $User = User::create($User);
            if($request->has('stripe_token')){
                \Stripe\Stripe::setApiKey(Setting::get('stripe_secret_key'));
                $customer = \Stripe\Customer::create([
                            'email' => $User->email,
                        ]);
                $strip_cust_id = $customer['id'];
                $customer = \Stripe\Customer::retrieve($strip_cust_id);
                $card = $customer->sources->create(["source" => $request->stripe_token]);
                $create_card = new Card;
                $create_card->user_id = $User->id;
                $create_card->card_id = $card['id'];
                $create_card->last_four = $card['last4'];
                $create_card->brand = $card['brand'];
                $create_card->save();
                User::where('id',$User->id)->update(['stripe_cust_id' => $strip_cust_id]);
            }
            // send welcome email here
            if(Setting::get('mail_enable', 0) == 1) {
                $user = $request->all();
                Mail::send('emails.user-register', ['user' => $user], function ($message) use ($user){
                    $message->to($user['email'], $user['first_name'])->subject(config('app.name').' Passenger Registration');
                });
            }
            return $User;
        } catch (Exception $e) {
             return response()->json(['error' => trans('api.something_went_wrong')], 500);
        }
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function logout(Request $request)
    {
        try {
            User::where('id', $request->id)->update(['device_id'=> '', 'device_token' => '']);
            return response()->json(['message' => trans('api.logout_success')]);
        } catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')], 500);
        }
    }


    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function change_password(Request $request){

        $this->validate($request, [
                'password' => 'required|confirmed|min:6',
                'old_password' => 'required',
            ]);

        $User = Auth::user();

        if(Hash::check($request->old_password, $User->password))
        {
            $User->password = bcrypt($request->password);
            $User->save();

            if($request->ajax()) {
                return response()->json(['message' => trans('api.user.password_updated')]);
            }else{
                return back()->with('flash_success', 'Password Updated');
            }

        } else {
           if($request->ajax()) {
                return response()->json(['error' => trans('api.user.incorrect_password')], 500);
            }else{
                return back()->with('flash_success', 'api.user.incorrect_password');
            }
        }

    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function update_location(Request $request){

        $this->validate($request, [
                'latitude' => 'required|numeric',
                'longitude' => 'required|numeric',
            ]);

        if($user = User::find(Auth::user()->id)){

            $user->latitude = $request->latitude;
            $user->longitude = $request->longitude;
            $user->save();
            return response()->json(['message' => trans('api.user.location_updated')]);
        }else{
            return response()->json(['error' => trans('api.user.user_not_found')], 500);
        }

    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function details(Request $request){

        $this->validate($request, [
            'device_type' => 'in:android,ios',
        ]);

        try{

            if($user = User::find(Auth::user()->id)){

                if($request->has('device_token')){
                    $user->device_token = $request->device_token;
                }

                if($request->has('device_type')){
                    $user->device_type = $request->device_type;
                }

                if($request->has('device_id')){
                    $user->device_id = $request->device_id;
                }

                $user->save();

                $user->currency = Setting::get('currency');
                $user->sos = Setting::get('sos_number', '911');
                return $user;

            } else {
                return response()->json(['error' => trans('api.user.user_not_found')], 500);
            }
        }
        catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')], 500);
        }

    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function update_profile(Request $request)
    {

        $this->validate($request, [
                'first_name' => 'required|max:255',
                'last_name' => 'max:255',
                'email' => 'email|unique:users,email,'.Auth::user()->id,
                'mobile' => 'required',
                'picture' => 'mimes:jpeg,bmp,png',
            ]);

         try {

            $user = User::findOrFail(Auth::user()->id);

            if($request->has('first_name')){ 
                $user->first_name = $request->first_name;
            }
            
            if($request->has('last_name')){
                $user->last_name = $request->last_name;
            }
            
            if($request->has('email')){
                $user->email = $request->email;
            }
        
            if($request->has('mobile')){
                $user->mobile = $request->mobile;
            }

            if ($request->picture != "") {
                Storage::delete($user->picture);
                $user->picture = $request->picture->store('user/profile');
            }

            $user->save();

            if($request->ajax()) {
                return response()->json($user);
            }else{
                return back()->with('flash_success', trans('api.user.profile_updated'));
            }
        }

        catch (ModelNotFoundException $e) {
             return response()->json(['error' => trans('api.user.user_not_found')], 500);
        }

    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function services() {

        if($serviceList = ServiceType::all()) {
            return $serviceList;
        } else {
            return response()->json(['error' => trans('api.services_not_found')], 500);
        }

    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function apiservices() {

        if($serviceList = ServiceType::all()) {
            
            foreach ($serviceList as $key => $service_type) {
                $service_type = ServiceType::findOrFail($service_type->id);
                $current = Carbon::now()->toTimeString();
                $sro_levy = Setting::get('sro_levy', 0);
                $fare_flag=0.00;
                $fare_distance=0.00;
                $fare_booking=0.00;
                $fare_waiting=0.00;

                if($service_type->p_enable ==3 && ($current > '18:00:00' || $current < $service_type->p_etime )){
                    $fare_flag = $service_type->p_flag;
                    $fare_distance = $service_type->p_distance;
                    $fare_booking = $service_type->p_booking;
                    $fare_waiting = $service_type->p_waiting;
                }else{
                    $currentday = Carbon::now()->format('l');
                    if($service_type->p_enable ==2 && ($current > $service_type->p_stime || $current < $service_type->p_etime )){
                        $fare_flag = $service_type->p_flag;
                        $fare_distance = $service_type->p_distance;
                        $fare_booking = $service_type->p_booking;
                        $fare_waiting = $service_type->p_waiting;
                        
                    }elseif((($currentday =='Friday' || $currentday=='Saturday') && $current > $service_type->p_stime) || (($currentday=='Saturday' || $currentday=='Sunday') && $current < $service_type->p_etime)){
                        $fare_flag = $service_type->p_flag;
                        $fare_distance = $service_type->p_distance;
                        $fare_booking = $service_type->p_booking;
                        $fare_waiting = $service_type->p_waiting;
                        
                    }elseif($current > $service_type->n_stime || $current > $service_type->n_etime){
                        $fare_flag = $service_type->n_flag;
                        $fare_distance = $service_type->n_distance;
                        $fare_booking = $service_type->n_booking;
                        $fare_waiting = $service_type->n_waiting;
                       
                    }else{
                        $fare_flag = $service_type->d_flag;
                        $fare_distance = $service_type->d_distance;
                        $fare_booking = $service_type->d_booking;
                        $fare_waiting = $service_type->d_waiting;
                    
                    } 
                }

                $serviceList[$key]->fixed = $fare_flag;
                $serviceList[$key]->booking_fee = $fare_booking;
                $serviceList[$key]->waiting_fee = $fare_waiting;
                $serviceList[$key]->distance_fee = $fare_distance;
                $serviceList[$key]->sro_levy = $sro_levy;

            }

            return $serviceList;
        } else {
            return response()->json(['error' => trans('api.services_not_found')], 500);
        }

    }

    public function countrylatlng() {

        $countrylatlng['lat'] = Setting::get('countrylat', 0);
        $countrylatlng['lng'] = Setting::get('countrylng', 0);
        return $countrylatlng;
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function send_request(Request $request) {

        $this->validate($request, [
                's_latitude' => 'required|numeric',
                'd_latitude' => 'required|numeric',
                's_longitude' => 'required|numeric',
                'd_longitude' => 'required|numeric',
                'service_type' => 'required|numeric|exists:service_types,id',
                'promo_code' => 'exists:promocodes,promo_code',
                'distance' => 'required|numeric',
                'use_wallet' => 'numeric',
                'payment_mode' => 'required|in:CASH,CARD,PAYPAL',
                'card_id' => ['required_if:payment_mode,CARD','exists:cards,card_id,user_id,'.Auth::user()->id],
            ]);

        

        $ActiveRequests = UserRequests::PendingRequest(Auth::user()->id)->count();

        if(Auth::user()->due_balance !=0.00){
            if($request->ajax()) {
                return response()->json(['message' => 'Clear Pending Dues to take trip']);
            } else {
                return redirect('dashboard')->with('flash_error', 'Clear Pending Dues to take trip');
            }
        }
        
        if($ActiveRequests > 0) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.ride.request_inprogress')], 500);
            } else {
                return redirect('dashboard')->with('flash_error', 'Already request is in progress. Try again later');
            }
        }

        if($request->has('schedule_date') && $request->has('schedule_time')){
            $beforeschedule_time = (new Carbon("$request->schedule_date $request->schedule_time"))->subMinute(15);
            $afterschedule_time = (new Carbon("$request->schedule_date $request->schedule_time"))->addMinute(15);

            $CheckScheduling = UserRequests::where('status','SCHEDULED')
                            ->where('user_id', Auth::user()->id)
                            ->whereBetween('schedule_at',[$beforeschedule_time,$afterschedule_time])
                            ->count();


            if($CheckScheduling > 0){
                if($request->ajax()) {
                    return response()->json(['error' => trans('api.ride.request_scheduled')], 500);
                }else{
                    return redirect('dashboard')->with('flash_error', 'Already request is Scheduled on this time.');
                }
            }

        }

        if($request->has('schedule_date') && $request->has('schedule_time')){
            $details = "https://maps.googleapis.com/maps/api/directions/json?origin=".$request->s_latitude.",".$request->s_longitude."&destination=".$request->d_latitude.",".$request->d_longitude."&mode=driving&key=".env('GOOGLE_MAP_KEY');

            $json = curl($details);

            $details = json_decode($json, TRUE);

            $route_key = $details['routes'][0]['overview_polyline']['points'];

            $UserRequest = new UserRequests;
            $UserRequest->booking_id = Helper::generate_booking_id();
            $UserRequest->user_id = Auth::user()->id;
            $UserRequest->current_provider_id = 0;
            $UserRequest->service_type_id = $request->service_type;
            $UserRequest->tip_percent = $request->tip_percent ? : 0;
            $UserRequest->payment_mode = $request->payment_mode;
            
            $UserRequest->status = 'SCHEDULED';
            $UserRequest->push = 'AUTO';

            if($request->has('web')){
                $UserRequest->booking_by = 'WEB';
            }else{
                $UserRequest->booking_by = 'APP';
            }
            
            $UserRequest->s_address = $request->s_address ? : "";
            $UserRequest->s_latitude = $request->s_latitude;
            $UserRequest->s_longitude = $request->s_longitude;

            $UserRequest->d_address = $request->d_address ? : "";
            $UserRequest->d_latitude = $request->d_latitude;
            $UserRequest->d_longitude = $request->d_longitude;
            $UserRequest->driver_message = $request->driver_message ? : "";
            $UserRequest->route_key = '';

            $UserRequest->distance = $request->distance;

            $UserRequest->assigned_at = Carbon::now();

            if(Auth::user()->wallet_balance > 0){
                $UserRequest->use_wallet = $request->use_wallet ? : 0;
            }
            $UserRequest->surge = 0;        // Surge is not necessary while adding a manual dispatch

            if($request->has('schedule_date') && $request->has('schedule_time')){
                $UserRequest->schedule_at = date("Y-m-d H:i:s",strtotime("$request->schedule_date $request->schedule_time"));
            }

            $UserRequest->save();
            if($request->ajax()) {
                return response()->json([
                        'message' => trans('api.new_request_dispatcher'),
                        'request_id' => $UserRequest->id,
                        'scheduled_status' => 1,
                    ]);
            }else{
                return redirect('dashboard');
            }
        }

        $distance = Setting::get('provider_search_radius', '10');
        $latitude = $request->s_latitude;
        $longitude = $request->s_longitude;
        $service_type = $request->service_type;

        $Active_fav =[];
        $exists_driver = Auth::user()->favourite_driver;
        if(!empty($exists_driver)){
            $drivers = explode(',', $exists_driver);
            $Active_fav = ProviderService::whereIn('provider_id', $drivers)
                ->where('service_type_id', $request->service_type)
                ->where('status', 'active')->get()
                ->pluck('provider_id')->toArray();
        }

        $Active_base = ProviderService::where('service_type_id', $request->service_type)
                ->where('status', 'active')->get()
                ->pluck('provider_id')->toArray();

        $ActiveProviders = array_unique (array_merge ($Active_fav, $Active_base));

        $Providers = Provider::whereIn('id', $ActiveProviders)
                ->where('status', 'approved')
                ->selectRaw("* , (1.609344 * 3956 * acos( cos( radians('$latitude') ) * cos( radians(latitude) ) * cos( radians(longitude) - radians('$longitude') ) + sin( radians('$latitude') ) * sin( radians(latitude) ) ) ) AS distance")
                ->having('distance', '<', $distance)
                ->orderBy('distance') 
                ->get();

        // List Providers who are currently busy and add them to the filter list.

        if(count($Providers) == 0) {
            if($request->ajax()) {
                // Push Notification to User
                return response()->json(['message' => trans('api.ride.no_providers_found')]); 
            }else{
                return back()->with('flash_success', 'No Drivers Found! Please try again.');
            }
        }

        try{

            $details = "https://maps.googleapis.com/maps/api/directions/json?origin=".$request->s_latitude.",".$request->s_longitude."&destination=".$request->d_latitude.",".$request->d_longitude."&mode=driving&key=".env('GOOGLE_MAP_KEY');

            $json = curl($details);

            $details = json_decode($json, TRUE);

            $route_key = $details['routes'][0]['overview_polyline']['points'];

            $UserRequest = new UserRequests;
            $UserRequest->booking_id = Helper::generate_booking_id();
            $UserRequest->user_id = Auth::user()->id;
            $UserRequest->current_provider_id = $Providers[0]->id;
            $UserRequest->service_type_id = $request->service_type;
            $UserRequest->tip_percent = $request->tip_percent ? : 0;
            $UserRequest->payment_mode = $request->payment_mode;
            
            $UserRequest->status = 'SEARCHING';

            if($request->has('web')){
                $UserRequest->booking_by = 'WEB';
            }else{
                $UserRequest->booking_by = 'APP';
            }
            $UserRequest->s_address = $request->s_address ? : "";
            $UserRequest->d_address = $request->d_address ? : "";

            $UserRequest->s_latitude = $request->s_latitude;
            $UserRequest->s_longitude = $request->s_longitude;

            $UserRequest->d_latitude = $request->d_latitude;
            $UserRequest->d_longitude = $request->d_longitude;
            $UserRequest->distance = $request->distance;
            $UserRequest->driver_message = $request->driver_message ? : "";

            if(Auth::user()->wallet_balance > 0){
                $UserRequest->use_wallet = $request->use_wallet ? : 0;
            }

            $UserRequest->assigned_at = Carbon::now();
            $UserRequest->route_key = '';

            if($Providers->count() <= Setting::get('surge_trigger') && $Providers->count() > 0){
                $UserRequest->surge = 1;
            }

            if($request->has('schedule_date') && $request->has('schedule_time')){
                $UserRequest->schedule_at = date("Y-m-d H:i:s",strtotime("$request->schedule_date $request->schedule_time"));
            }

            $UserRequest->save();

            // update payment mode 

            User::where('id',Auth::user()->id)->update(['payment_mode' => $request->payment_mode]);
            User::where('id',Auth::user()->id)->update(['trip_status' => 1]);
            if($request->has('card_id')){
                Card::where('user_id',Auth::user()->id)->update(['is_default' => 0]);
                Card::where('card_id',$request->card_id)->update(['is_default' => 1]);
            }

            (new SendPushNotification)->IncomingRequest($Providers[0]->id);
            ProviderService::where('provider_id',$Providers[0]->id)->update(['status' =>'riding']);
            foreach ($Providers as $key => $Provider) {
                $Filter = new RequestFilter;
                $Filter->request_id = $UserRequest->id;
                $Filter->provider_id = $Provider->id; 
                $Filter->save();
            }

            if($request->ajax()) {
                return response()->json([
                        'message' => trans('api.new_request_created'),
                        'request_id' => $UserRequest->id,
                        'current_provider' => $UserRequest->current_provider_id,
                        'scheduled_status' => 0,
                    ]);
            }else{
                return redirect('dashboard');
            }

        } catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')], 500);
            }else{
                return back()->with('flash_error', 'Something went wrong while sending request. Please try again.');
            }
        }
    }


    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function cancel_request(Request $request) {

        $this->validate($request, [
            'request_id' => 'required|numeric|exists:user_requests,id,user_id,'.Auth::user()->id,
        ]);

        try{

            $UserRequest = UserRequests::findOrFail($request->request_id);

            if($UserRequest->status == 'CANCELLED')
            {
                if($request->ajax()) {
                    return response()->json(['error' => trans('api.ride.already_cancelled')], 500); 
                }else{
                    return back()->with('flash_error', 'Request is Already Cancelled!');
                }
            }

            if(in_array($UserRequest->status, ['SEARCHING','STARTED','ARRIVED','SCHEDULED'])) {

                if($UserRequest->status != 'SEARCHING'){
                    $this->validate($request, [
                        'cancel_reason'=> 'max:255',
                    ]);
                }
                $cancellation = 0;
                if($UserRequest->payment_mode =='CARD'){
                    
                    if(Setting::get('cancellation_fare') !=0){
                        $startTime = Carbon::parse($UserRequest->accepted_at);
                        $finishTime = Carbon::now();
                        $totalDuration = $finishTime->diffInMinutes($startTime);
                        if($UserRequest->status !='SEARCHING' && $UserRequest->status !='SCHEDULED'){
                            User::where('id',Auth::user()->id)->update(['due_balance' => Setting::get('cancellation_fare'),'due_trip' => $UserRequest->id]);
                            app(\App\Http\Controllers\PaymentController::class)->due_payment(Auth::user()->id);
                            $cancellation = 1;
                        }
                    }
                }else{
                    if(Auth::user()->cancel_points ==0){
                        if($request->ajax()) {
                            return response()->json(['message' => 'Ride Cannot be Cancelled']);
                        }else{
                            return redirect('dashboard')->with('flash_success','Ride Cannot be Cancelled');
                        }
                    }
                    User::where('id',Auth::user()->id)->decrement('cancel_points');   
                }

                $UserRequest->status = 'CANCELLED';
                $UserRequest->cancel_reason = $request->cancel_reason;
                $UserRequest->cancelled_by = 'USER';
                $UserRequest->save();

                RequestFilter::where('request_id', $UserRequest->id)->delete();
                if($UserRequest->status != 'SCHEDULED'){

                    if($UserRequest->provider_id != 0){
                        ProviderService::where('provider_id',$UserRequest->provider_id)->update(['status' => 'active']);
                    }
                    if($UserRequest->current_provider_id != 0){
                        ProviderService::where('provider_id',$UserRequest->current_provider_id)->update(['status' => 'active']);
                    }
                }

                 // Send Push Notification to User  
                (new SendPushNotification)->UserCancellRide($UserRequest);
                if($cancellation == 1){
                    if($request->ajax()) {
                        return response()->json(['message' => 'Cancellation charge applied'.Setting::get('cancellation_fare')]);
                    }else{
                        return redirect('dashboard')->with('flash_success','Request Cancelled Successfully');
                    }
                }else{
                    if($request->ajax()) {
                        return response()->json(['message' => trans('api.ride.ride_cancelled')]);
                    }else{
                        return redirect('dashboard')->with('flash_success','Request Cancelled Successfully');
                    }
                }
                

            } else {
                if($request->ajax()) {
                    return response()->json(['error' => trans('api.ride.already_onride')], 500); 
                }else{
                    return back()->with('flash_error', 'Service Already Started!');
                }
            }
        }

        catch (ModelNotFoundException $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')]);
            }else{
                return back()->with('flash_error', 'No Request Found!');
            }
        }

    }

    public function clear_status(Request $request) {
        
        User::where('id',Auth::user()->id)->update(['trip_status' => 0]);
        $data = [];
        return response()->json($data);
       
    }
    /**
     * Show the request status check.
     *
     * @return \Illuminate\Http\Response
     */

    public function get_status(Request $request) {
        
        try{
            if(!empty($request->latitude)) {
                User::where('id',Auth::user()->id)->update([
                        'latitude' => $request->latitude,
                        'longitude' => $request->longitude
                ]);
            }

            return response()->json(['ride_active' => Auth::user()->trip_status]);

        } catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')], 500);
        }
    }
    /**
     * Show the request status check user web panel.
     *
     * @return \Illuminate\Http\Response
     */
    public function dashboard_request_status_check() {

        try{
            $check_status = ['CANCELLED', 'SCHEDULED'];

            $UserRequests = UserRequests::UserRequestStatusCheck(Auth::user()->id, $check_status)
                                        ->get()
                                        ->toArray();

            $search_status = ['SEARCHING','SCHEDULED'];
            $UserRequestsFilter = UserRequests::UserRequestAssignProvider(Auth::user()->id,$search_status)->get(); 

            // Log::info($UserRequestsFilter);

            $Timeout = Setting::get('provider_select_timeout', 180);

            if(!empty($UserRequestsFilter)){
                for ($i=0; $i < sizeof($UserRequestsFilter); $i++) {
                    $ExpiredTime = $Timeout - (time() - strtotime($UserRequestsFilter[$i]->assigned_at));
                    if($UserRequestsFilter[$i]->status == 'SEARCHING' && $ExpiredTime < 0) {
                        $Providertrip = new TripController();
                        $Providertrip->assign_next_provider($UserRequestsFilter[$i]->id);
                    }else if($UserRequestsFilter[$i]->status == 'SEARCHING' && $ExpiredTime > 0){
                        break;
                    }
                }
            }

            return response()->json(['data' => $UserRequests]);

        } catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')], 500);
        }
    }
    /**
     * Show the request status check.
     *
     * @return \Illuminate\Http\Response
     */

    public function request_status_check() {

        try{

            $check_status = ['CANCELLED','SCHEDULED'];

            $UserRequests = UserRequests::where('user_requests.user_id', Auth::user()->id)
            ->where('user_requests.user_rated',0)
            ->whereNotIn('user_requests.status', $check_status)
            ->select('user_requests.status')
            ->get();

            if($UserRequests->isNotEmpty()){
                $status = $UserRequests[0]->status;
            }else{
                 $status = '';
            }

            switch ($status) {
                case "SEARCHING":
                    $UserRequests = UserRequests::where('user_requests.user_id', Auth::user()->id)
                    ->where('user_requests.user_rated',0)
                    ->whereNotIn('user_requests.status', $check_status)
                    ->select('user_requests.*')
                    ->with('user')
                    ->get()
                    ->toArray();
                    break;
                case "ACCEPTED":
                case "STARTED":  
                case "ARRIVED":
                case "PICKEDUP":
                case "END":
                    $UserRequests = UserRequests::where('user_requests.user_id', Auth::user()->id)
                    ->where('user_requests.user_rated',0)
                    ->whereNotIn('user_requests.status', $check_status)
                    ->select('user_requests.*')
                    ->with('user','provider','service_type','provider_service')
                    ->get()
                    ->toArray();
                    break;
                case "DROPPED":
                    $UserRequests = UserRequests::where('user_requests.user_id', Auth::user()->id)
                    ->where('user_requests.user_rated',0)
                    ->whereNotIn('user_requests.status', $check_status)
                    ->select('user_requests.*')
                    ->with('provider','payment')
                    ->get()
                    ->toArray();
                    break;
                case "COMPLETED":
                    $UserRequests = UserRequests::where('user_requests.user_id', Auth::user()->id)
                    ->where('user_requests.user_rated',0)
                    ->whereNotIn('user_requests.status', $check_status)
                    ->select('user_requests.*')
                    ->with('provider','payment','rating')
                    ->get()
                    ->toArray();
                    break;
                default:
                    $UserRequests = UserRequests::where('user_requests.user_id', Auth::user()->id)
                    ->where('user_requests.user_rated',0)
                    ->orderBy('user_requests.updated_at', 'desc')
                    ->select('user_requests.*')
                    ->take(1)
                    ->get()
                    ->toArray();
            }
            
            $search_status = ['SEARCHING','SCHEDULED'];
            
            $UserRequestsFilter = UserRequests::where('user_requests.user_id', Auth::user()->id)
            ->where('user_requests.user_rated',0)
            ->where('user_requests.provider_id',0)
            ->whereIn('user_requests.status', $search_status)
            ->select('user_requests.status','user_requests.assigned_at','user_requests.id')
            ->get();
            // Log::info($UserRequestsFilter);

            $Timeout = Setting::get('provider_select_timeout', 180);

            if(!empty($UserRequestsFilter)){
                for ($i=0; $i < sizeof($UserRequestsFilter); $i++) {
                    $ExpiredTime = 5+$Timeout - (time() - strtotime($UserRequestsFilter[$i]->assigned_at));
                    if($UserRequestsFilter[$i]->status == 'SEARCHING' && $ExpiredTime < 0) {
                        $Providertrip = new TripController();
                        $Providertrip->assign_next_provider($UserRequestsFilter[$i]->id);
                    }else if($UserRequestsFilter[$i]->status == 'SEARCHING' && $ExpiredTime > 0){
                        break;
                    }
                }
            }

            return response()->json(['data' => $UserRequests]);

        } catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')], 500);
        }
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */


    public function rate_provider(Request $request) {

        $this->validate($request, [
                'request_id' => 'required|integer|exists:user_requests,id,user_id,'.Auth::user()->id,
                'rating' => 'required|integer|in:1,2,3,4,5',
                'comment' => 'max:255',
            ]);
    
        $UserRequests = UserRequests::where('id' ,$request->request_id)
                ->where('status' ,'COMPLETED')
                ->where('paid', 0)
                ->first();

        if ($UserRequests) {
            if($request->ajax()){
                return response()->json(['error' => trans('api.user.not_paid')], 500);
            } else {
                return back()->with('flash_error', 'Service Already Started!');
            }
        }

        try{

            $UserRequest = UserRequests::findOrFail($request->request_id);
            
            if($UserRequest->rating == null) {
                UserRequestRating::create([
                        'provider_id' => $UserRequest->provider_id,
                        'user_id' => $UserRequest->user_id,
                        'request_id' => $UserRequest->id,
                        'user_rating' => $request->rating,
                        'user_comment' => $request->comment,
                    ]);
            } else {
                $UserRequest->rating->update([
                        'user_rating' => $request->rating,
                        'user_comment' => $request->comment,
                    ]);
            }

            $UserRequest->user_rated = 1;
            $UserRequest->save();

            $average = UserRequestRating::where('provider_id', $UserRequest->provider_id)->avg('user_rating');

            Provider::where('id',$UserRequest->provider_id)->update(['rating' => $average]);
            User::where('id', $UserRequest->user_id)->update(['trip_status' => 0]);
            // Send Push Notification to Provider 
            if($request->ajax()){
                return response()->json(['message' => trans('api.ride.provider_rated')]); 
            }else{
                return redirect('dashboard')->with('flash_success', 'Driver Rated Successfully!');
            }
        } catch (Exception $e) {
            if($request->ajax()){
                return response()->json(['error' => trans('api.something_went_wrong')], 500);
            }else{
                return back()->with('flash_error', 'Something went wrong');
            }
        }

    } 


    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function trips(Request $request) {
        $this->validate($request,[
                'time_period' => 'required|numeric',
        ]);
    
        try{
            if($request->time_period ==1){
                $timer = Carbon::now()->today();
            }
            if($request->time_period ==2){
                $timer = Carbon::now()->subDays(7);
            }
            if($request->time_period ==3){
                $timer = Carbon::now()->subDays(30);
            }
            
            $UserRequests = UserRequests::where('user_requests.user_id', '=', Auth::user()->id)
                    ->where('user_requests.updated_at', '>=', $timer)
                    ->whereIn('user_requests.status', ['CANCELLED', 'COMPLETED'])
                    ->orderBy('user_requests.updated_at','desc')
                    ->select('user_requests.*')
                    ->with('payment','service_type')->get();

            return $UserRequests;
        }

        catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')]);
        }
    }
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function dashboardtrips() {
    
        try{
            $UserRequests = UserRequests::DashboardUserTrips(Auth::user()->id)->get();
            return $UserRequests;
        }

        catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')]);
        }
    }
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function estimated_fare(Request $request){
        
        $this->validate($request,[
                's_latitude' => 'required|numeric',
                's_longitude' => 'required|numeric',
                'd_latitude' => 'required|numeric',
                'd_longitude' => 'required|numeric',
                'service_type' => 'required|numeric|exists:service_types,id',
        ]);

        try{

            $details = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=".$request->s_latitude.",".$request->s_longitude."&destinations=".$request->d_latitude.",".$request->d_longitude."&mode=driving&sensor=false&key=".env('GOOGLE_MAP_KEY');

            $json = curl($details);

            $details = json_decode($json, TRUE);
            //dd($details);
            $meter = $details['rows'][0]['elements'][0]['distance']['value'];
            $time = $details['rows'][0]['elements'][0]['duration']['text'];
            $seconds = $details['rows'][0]['elements'][0]['duration']['value'];

            $unit =Setting::get('distance_unit');
            
            if($unit =='km'){
                $kilometer = $meter/1000;
            }else{
                $base = $meter/1000;
                $kilometer = $base * 0.62137119;
            }
            $kilometer = round($kilometer,2);
            $minutes = $seconds/60;

            $tax_percentage = Setting::get('tax_percentage');
            $sro_levy = Setting::get('sro_levy');
            
            $service_type = ServiceType::findOrFail($request->service_type);
            $current = Carbon::now()->toTimeString();
            $today = Carbon::now();

            if(($today->day == '25' && $today->month == '12') || ($today->day == '26' && $today->month == '12') || ($today->day == '1' && $today->month == '1') || ($today->day == '31' && $today->month == '12' && $current > '18:00:00')){
                $fare_flag = $service_type->p_flag;
                $fare_distance = $service_type->p_distance;
                $fare_booking = $service_type->p_booking;
                $fare_waiting = $service_type->p_waiting;
            }else{
                $currentday = Carbon::now()->format('l');
                if($service_type->p_enable ==2 && ($current > $service_type->p_stime || $current < $service_type->p_etime )){
                    $fare_flag = $service_type->p_flag;
                    $fare_distance = $service_type->p_distance;
                    $fare_booking = $service_type->p_booking;
                    $fare_waiting = $service_type->p_waiting;
                    
                }elseif((($currentday =='Friday' || $currentday=='Saturday') && $current > $service_type->p_stime) || (($currentday=='Saturday' || $currentday=='Sunday') && $current < $service_type->p_etime)){
                    $fare_flag = $service_type->p_flag;
                    $fare_distance = $service_type->p_distance;
                    $fare_booking = $service_type->p_booking;
                    $fare_waiting = $service_type->p_waiting;
                    
                }elseif($current > $service_type->n_stime || $current > $service_type->n_etime){
                    $fare_flag = $service_type->n_flag;
                    $fare_distance = $service_type->n_distance;
                    $fare_booking = $service_type->n_booking;
                    $fare_waiting = $service_type->n_waiting;
                   
                }else{
                    $fare_flag = $service_type->d_flag;
                    $fare_distance = $service_type->d_distance;
                    $fare_booking = $service_type->d_booking;
                    $fare_waiting = $service_type->d_waiting;
                
                } 
            }

            $price = $fare_flag;
            if($kilometer > 1){
                $kilometer1 = $kilometer - 1;
                $price += ($kilometer1 * $fare_distance); 
            }   
            $tax_price = $tax_percentage;
            $total = $price  + $sro_levy + $fare_booking;

            return response()->json([
                    'estimated_fare' => round($total,2), 
                    'distance' => $kilometer,
                    'distance_unit' => $unit,
                    'time' => $time,
                    'tax_price' => $tax_price,
                    'sro_levy' => $sro_levy,
                    'booking_fee' => $fare_booking,
                    'base_price' => $fare_flag,
                    'wallet_balance' => Auth::user()->wallet_balance,
                ]);

        } catch(Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')], 500);
        }
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function trip_details(Request $request) {

         $this->validate($request, [
                'request_id' => 'required|integer|exists:user_requests,id',
            ]);
    
        try{
            $UserRequests = UserRequests::UserTripDetails(Auth::user()->id,$request->request_id)->get();

            return $UserRequests;
        }

        catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')]);
        }
    }

    /**
     * get all promo code.
     *
     * @return \Illuminate\Http\Response
     */

    public function promocodes() {
        try{
            $this->check_expiry();

            return PromocodeUsage::Active()
                    ->where('user_id', Auth::user()->id)
                    ->with('promocode')
                    ->get();

        } catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')], 500);
        }
    } 

    public function list_promocode(){

        try{
            $this->check_expiry();
            $new_user = Promocode::where('status','ADDED')
                ->where('user_type','new')
                ->where('updated_at','<=', Auth::user()->created_at)
                ->pluck('id')->toArray();
            $all_user = Promocode::where('status','ADDED')
                ->where('user_type','all')
                ->pluck('id')->toArray();
            $promo_id=array_merge($new_user,$all_user);
            $all = Promocode::whereIn('id',$promo_id)->get();
            return response()->json(['promocode'=>$all]);    
        } catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')], 500);
        }
    }

    public function check_expiry(){
        try{
            $Promocode = Promocode::all();
            foreach ($Promocode as $index => $promo) {
                if(date("Y-m-d") > $promo->expiration){
                    $promo->status = 'EXPIRED';
                    $promo->save();
                    PromocodeUsage::where('promocode_id', $promo->id)->update(['status' => 'EXPIRED']);
                }
            }
        } catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')], 500);
        }
    }


    /**
     * add promo code.
     *
     * @return \Illuminate\Http\Response
     */

    public function add_promocode(Request $request) {

        $this->validate($request, [
                'promocode' => 'required|exists:promocodes,promo_code',
            ]);

        try{

            $find_promo = Promocode::where('promo_code',$request->promocode)->first();

            if($find_promo->status == 'EXPIRED' || (date("Y-m-d") > $find_promo->expiration)){

                if($request->ajax()){

                    return response()->json([
                        'message' => trans('api.promocode_expired'), 
                        'code' => 'promocode_expired'
                    ]);

                }else{
                    return back()->with('flash_error', trans('api.promocode_expired'));
                }

            }elseif(PromocodeUsage::where('promocode_id',$find_promo->id)->where('user_id', Auth::user()->id)->count() > 0){

                if($request->ajax()){

                    return response()->json([
                        'message' => trans('api.promocode_already_in_use'), 
                        'code' => 'promocode_already_in_use'
                        ]);

                }else{
                    return back()->with('flash_error', 'Promocode Already in use');
                }

            }else{

                $promo = new PromocodeUsage;
                $promo->promocode_id = $find_promo->id;
                $promo->user_id = Auth::user()->id;
                $promo->usage = $find_promo->use_count;
                $promo->status = 'ADDED';
                $promo->save();

                if($request->ajax()){

                    return response()->json([
                            'message' => trans('api.promocode_applied') ,
                            'code' => 'promocode_applied'
                         ]); 

                }else{
                    return back()->with('flash_success', trans('api.promocode_applied'));
                }
            }

        }

        catch (Exception $e) {
            if($request->ajax()){
                return response()->json(['error' => trans('api.something_went_wrong')], 500);
            }else{
                return back()->with('flash_error', 'Something Went Wrong');
            }
        }

    }  

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function upcoming_trips() {
    
        try{
            $UserRequests = UserRequests::UserUpcomingTrips(Auth::user()->id)->get();
            return $UserRequests;
        }

        catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')]);
        }
    }
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function dashboard_upcoming_trips() {
    
        try{
            $UserRequests = UserRequests::DashboardUserUpcomingTrips(Auth::user()->id)->get();
            
            return $UserRequests;
        }

        catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')]);
        }
    }
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function upcoming_trip_details(Request $request) {

         $this->validate($request, [
                'request_id' => 'required|integer|exists:user_requests,id',
            ]);
    
        try{
            $UserRequests = UserRequests::UserUpcomingTripDetails(Auth::user()->id,$request->request_id)->get();
            $services = ServiceType::select('id','name')->get();
            if(!empty($UserRequests)){
                foreach ($UserRequests as $key => $value) {
                    $UserRequests[$key]->available_services = $services;
                }
            }
            return $UserRequests;
        }

        catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')]);
        }
    }


    /**
     * Show the nearby providers.
     *
     * @return \Illuminate\Http\Response
     */

    public function show_providers(Request $request) {

        $this->driver_detector();
        $this->validate($request, [
                'latitude' => 'required|numeric',
                'longitude' => 'required|numeric',
                'service' => 'numeric|exists:service_types,id',
            ]);

        try{

            $distance = Setting::get('provider_search_radius', '10');
            $latitude = $request->latitude;
            $longitude = $request->longitude;

            if($request->has('service')){
                $ActiveProviders = ProviderService::AvailableServiceProvider($request->service)->get()->pluck('provider_id');
                $Providers = Provider::whereIn('id', $ActiveProviders)
                    ->where('status', 'approved')
                    ->whereRaw("(1.609344 * 3956 * acos( cos( radians('$latitude') ) * cos( radians(latitude) ) * cos( radians(longitude) - radians('$longitude') ) + sin( radians('$latitude') ) * sin( radians(latitude) ) ) ) <= $distance")
                    ->get();
            } else {
               $ActiveProviders = ProviderService::ActiveServiceProvider()->get()->pluck('provider_id');
                 $Providers = Provider::whereIn('id', $ActiveProviders)
                    ->where('status', 'approved')
                    ->whereRaw("(1.609344 * 3956 * acos( cos( radians('$latitude') ) * cos( radians(latitude) ) * cos( radians(longitude) - radians('$longitude') ) + sin( radians('$latitude') ) * sin( radians(latitude) ) ) ) <= $distance")
                    ->get();
            }

            if(count($Providers) == 0) {
                if($request->ajax()) {
                    return response()->json(['message' => "No Drivers Found"]); 
                }else{
                    return back()->with('flash_success', 'No Drivers Found! Please try again.');
                }
            }
            /*$shorter = 0;
            if(!empty($Providers)){
                foreach ($Providers as $key => $value) {
                    $details = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=".$value->latitude.",".$value->longitude."&destinations=".$latitude.",".$longitude."&mode=driving&sensor=false&key=".env('GOOGLE_MAP_KEY');

                        $json = curl($details);
                        $details = json_decode($json, TRUE);
                        $meter = $details['rows'][0]['elements'][0]['distance']['value'];
                        $time = $details['rows'][0]['elements'][0]['duration']['text'];
                        $seconds = $details['rows'][0]['elements'][0]['duration']['value'];
                        $unit =Setting::get('distance_unit');
                        if($unit =='km'){
                            $kilometer = $meter/1000;
                        }else{
                            $base = $meter/1000;
                            $kilometer = $base * 0.62137119;
                        }
                        $kilometer = round($kilometer,2);
                        $minutes = $seconds/60;
                    $Providers[$key]->distance = $kilometer;
                    $Providers[$key]->time = round($minutes).' min';
                    $short_time = $shorter;
                    if($short_time < $minutes){
                        $shorter = $minutes;
                    }
                }
            }*/

            return response()->json([
                'provider' => $Providers
            ]);
            
        } catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')], 500);
            }else{
                return back()->with('flash_error', 'Something went wrong while sending request. Please try again.');
            }
        }
    }


    /**
     * Forgot Password.
     *
     * @return \Illuminate\Http\Response
     */


    public function forgot_password(Request $request){

        $this->validate($request, [
                'email' => 'required|email|exists:users,email',
            ]);

        try{  
            
            $user = User::where('email' , $request->email)->first();

            $otp = mt_rand(100000, 999999);

            $user->otp = $otp;
            $user->save();

            Notification::send($user, new ResetPasswordOTP($otp));
            //sms
            if(Setting::get('sms_enable', 0) == 1) {
                $mobile = $user->mobile;
                $message = 'Kindly note your OTP : '.$otp.' Regards '.config('app.name'); 
                    try {
                        Twilio::message($mobile, $message);
                    } catch ( \Services_Twilio_RestException $e ) {
                        //return $e->getMessage();  
                    }
            }
                
            return response()->json([
                'message' => 'OTP sent to your email!',
                'user' => $user
            ]);

        }catch(Exception $e){
                return response()->json(['error' => trans('api.something_went_wrong')], 500);
        }
    }


    /**
     * Reset Password.
     *
     * @return \Illuminate\Http\Response
     */

    public function reset_password(Request $request){

        $this->validate($request, [
                'password' => 'required|confirmed|min:6',
                'id' => 'required|numeric|exists:users,id'
            ]);

        try{

            $User = User::findOrFail($request->id);
            $User->password = bcrypt($request->password);
            $User->save();

            if($request->ajax()) {
                return response()->json(['message' => 'Password Updated']);
            }

        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')]);
            }
        }
    }

    /**
     * help Details.
     *
     * @return \Illuminate\Http\Response
     */

    public function help_details(Request $request){

        try{

            if($request->ajax()) {
                return response()->json([
                    'contact_number' => Setting::get('contact_number',''), 
                    'contact_email' => Setting::get('contact_email','')
                     ]);
            }

        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')]);
            }
        }
    }

    /**
     * privacy Details.
     *
     * @return \Illuminate\Http\Response
     */
    public function privacy_policy(Request $request){

        try{

            if($request->ajax()) {
                return response()->json([
                    'privacy_policy' => Setting::get('page_privacy','')
                     ]);
            }

        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')]);
            }
        }
    }
    /**
     * privacy Details.
     *
     * @return \Illuminate\Http\Response
     */
    public function term_condition(Request $request){

        try{

            if($request->ajax()) {
                return response()->json([
                    'terms_conditions' => Setting::get('term_condition','')
                     ]);
            }

        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')]);
            }
        }
    }
    /**
     * help Details.
     *
     * @return \Illuminate\Http\Response
     */

    public function contact_list(Request $request){

        try{

            $Contacts = ContactList::where('user_id', Auth::user()->id)->get();
            return $Contacts;
            
        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')]);
            }
        }
    }
    /**
     * help Details.
     *
     * @return \Illuminate\Http\Response
     */

    public function add_contact(Request $request){

        $this->validate($request, [
                'contact_name' => 'required',
                'contact_number' => 'required',
            ]);

        try{
            $checklist = ContactList::where('user_id',Auth::user()->id)
                        ->where('contact_number',$request->contact_number)
                        ->get();
            if(count($checklist) ==0){
                $Contact = new ContactList;
                $Contact->user_id = Auth::user()->id;
                $Contact->contact_name = $request->contact_name;
                $Contact->contact_number = $request->contact_number;
                $Contact->save();
                if($request->ajax()) {
                    return response()->json([
                            'message' => trans('api.new_contact_added'),
                            'contact_name' => $Contact->contact_name,
                            'contact_number' => $Contact->contact_number,
                            'status' =>200

                        ]);
                }
            }else{
                if($request->ajax()) {
                    return response()->json([
                            'message' => trans('api.contact_already_exists'),
                            'status' =>201
                        ]);
                }
            }

        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')],500);
            }
        }
    }

    /**
     * help Details.
     *
     * @return \Illuminate\Http\Response
     */

    public function delete_contact(Request $request){

        $this->validate($request, [
                'contact_number' => 'required',
            ]);

        try{

            $Contact = ContactList::where('user_id',Auth::user()->id)
                        ->where('contact_number',$request->contact_number)
                        ->delete();
            
            if($request->ajax()) {
                return response()->json([
                        'message' => trans('api.contact_deleted')
                    ]);
            }

        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')]);
            }
        }
    }
    /**
     * Edit Scheduled Trip Details.
     *
     * @return \Illuminate\Http\Response
     */
    public function edit_request(Request $request)
    {
           $this->validate($request, [
                's_latitude' => 'required|numeric',
                'd_latitude' => 'required|numeric',
                's_longitude' => 'required|numeric',
                'd_longitude' => 'required|numeric',
                'service_type' => 'required|numeric|exists:service_types,id',
                'trip_id' => 'required|numeric',
                's_address' => 'required',
                'd_address' => 'required',
                "schedule_at" => 'required', 
            ]);

           try {

            $trip = UserRequests::findOrFail($request->trip_id);
            $details = "https://maps.googleapis.com/maps/api/directions/json?origin=".$request->s_latitude.",".$request->s_longitude."&destination=".$request->d_latitude.",".$request->d_longitude."&mode=driving&key=".env('GOOGLE_MAP_KEY');

            $json = curl($details);
            $details = json_decode($json, TRUE);
            $route_key = '';
            $meter = $details['routes'][0]['legs'][0]['distance']['value'];
            $unit =Setting::get('distance_unit');
            
            if($unit =='km'){
                $kilometer = $meter/1000;
            }else{
                $base = $meter/1000;
                $kilometer = $base * 0.62137119;
            }

            $trip->distance = $kilometer;
            $trip->s_latitude = $request->s_latitude;
            $trip->s_longitude = $request->s_longitude;
            $trip->d_latitude = $request->d_latitude;
            $trip->d_longitude = $request->d_longitude;
            $trip->route_key = $route_key;
            $trip->s_address = $request->s_address;
            $trip->d_address = $request->d_address;
            $trip->service_type_id = $request->service_type;
            $trip->provider_id = 0;
            $trip->current_provider_id = 0;
            $trip->cancelled_by ="NONE";
            $trip->cancel_reason ="";
            $trip->booking_by ="APP";
            $trip->paid =0;
            $trip->assigned_at = Carbon::now();
            $trip->schedule_at = Carbon::parse($request->schedule_at);
            $trip->status ="SCHEDULED";
            $trip->push = 'AUTO';
            $trip->user_rated =0;
            $trip->provider_rated =0;
            $trip->save();

            if($request->ajax()) {
                return response()->json([
                        'message' => 'Scheduled Trip Request has Updated!',
                        'request' => $trip,
                    ]);
            }else{
                return redirect('dashboard');
            }  
        } 

        catch (ModelNotFoundException $e) {
            return back()->with('flash_error', 'Something Went Wrong');
        }
    }
    
    public function driver_detector(){

        $now = Carbon::now()->subMinutes(20);
        $Providers = Provider::where('updated_at', '<', $now)
                    ->get()->pluck('id');
        foreach ($Providers as $Provider) {            
          ProviderService::where('provider_id',$Provider)->where('status', '!=', 'offline')
          ->where('status', '!=', 'riding')->update(['status' =>'offline']);
        }
    }
    public function auto_assign(){
        $UserRequests = UserRequests::where('push','=','AUTO')->whereNotIn('status', ['COMPLETED','CANCELLED'])->get();
        foreach ($UserRequests as $key => $request) {
            $original = $request->schedule_at;
            $schedule = (new Carbon("$request->schedule_at"))->subMinutes(15);
            $now = Carbon::now();
             if($now > $schedule && $now < $original){
                $distance = Setting::get('provider_search_radius', '10');
                $latitude = $request->s_latitude;
                $longitude = $request->s_longitude;
                
                $Active_fav =[];
                $exists_driver = User::where('id', $request->user_id)->pluck('favourite_driver')->first();
                if(!empty($exists_driver)){
                    $drivers = explode(',', $exists_driver);
                    $Active_fav = ProviderService::whereIn('provider_id', $drivers)
                        ->where('service_type_id', $request->service_type_id)
                        ->where('status', 'active')->get()
                        ->pluck('provider_id')->toArray();
                }

                $Active_base = ProviderService::where('service_type_id', $request->service_type_id)
                        ->where('status', 'active')->get()
                        ->pluck('provider_id')->toArray();

                $ActiveProviders = array_unique (array_merge ($Active_fav, $Active_base));

                $Providers = Provider::whereIn('id', $ActiveProviders)
                    ->where('status', 'approved')
                    ->selectRaw("* , (1.609344 * 3956 * acos( cos( radians('$latitude') ) * cos( radians(latitude) ) * cos( radians(longitude) - radians('$longitude') ) + sin( radians('$latitude') ) * sin( radians(latitude) ) ) ) AS distance")
                    ->having('distance', '<', $distance)
                    ->orderBy('distance') 
                    ->get();
               
                if(count($Providers) > 0) {

                    $Request = UserRequests::findOrFail($request->id);
                    $Request->current_provider_id = $Providers[0]->id;
                    $Request->push = 'SENDED';
                    $Request->save();

                     // Incoming request push to provider
                    (new SendPushNotification)->IncomingRequest($Request->current_provider_id);
                    foreach ($Providers as $key => $Provider) {
                        $Filter = new RequestFilter;
                        $Filter->request_id = $Request->id;
                        $Filter->provider_id = $Provider->id; 
                        $Filter->save();
                    }
                }   
            } 
            if($now > $original){
                $Request = UserRequests::findOrFail($request->id);
                $Request->status = 'CANCELLED';
                $Request->save();
                User::where('id', $Request->user_id)->update(['trip_status' => 0]);
            }
             
        }
        $UserRequestsFilter = UserRequests::where('status', 'SEARCHING')->get(); 

        $Timeout = Setting::get('provider_select_timeout', 180);

        if(!empty($UserRequestsFilter)){
            for ($i=0; $i < sizeof($UserRequestsFilter); $i++) {
                $ExpiredTime = 20+$Timeout - (time() - strtotime($UserRequestsFilter[$i]->assigned_at));
                if($UserRequestsFilter[$i]->status == 'SEARCHING' && $ExpiredTime < 0){
                    $UserRequestsFilter[$i]->status = 'CANCELLED';
                    $UserRequestsFilter[$i]->cancelled_by = 'REJECTED';
                    $UserRequestsFilter[$i]->save();
                    User::where('id', $UserRequestsFilter[$i]->user_id)->update(['trip_status' => 0]);
                    $UnwantedRequest = RequestFilter::where('request_id',$UserRequestsFilter[$i]->id);
                    ProviderService::where('provider_id',$UserRequestsFilter[$i]->current_provider_id)->update(['status' =>'active']);
                    if($UnwantedRequest->count() > 0){
                        $UnwantedRequest->delete();
                    }
                }
            }
        }  
    }
    /**
     * help Details.
     *
     * @return \Illuminate\Http\Response
     */

    public function complaint(Request $request){

        $this->validate($request, [
                'complaint_type' => 'required',
                'complaint_desc' => 'required',
            ]);

        try{
            $Complaint = new Complaint;
            $Complaint->name = Auth::user()->first_name;
            $Complaint->email = Auth::user()->email;
            $Complaint->phone = Auth::user()->mobile;
            
            $status = $request->complaint_type;
            switch ($status) {
                case "1":
                    $Complaint->complaint_type = "Driver behaviour";
                    break;
                case "2":
                    $Complaint->complaint_type = "Driver driving skills";
                    break;
                case "3":
                    $Complaint->complaint_type = "Lost property";
                    break;
                case "4":
                    $Complaint->complaint_type = "Trip charges";
                    break;
                default:      
            }
            $Complaint->complaint_desc = $request->complaint_desc;
            $Complaint->save();
            if($request->ajax()){
                return response()->json([
                        'message' => 'Complaint saved Successfully',
                    ]);
            }
          
        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')],500);
            }
        }
    }
    /**
     * help Details.
     *
     * @return \Illuminate\Http\Response
     */

    public function favourite_list(){

        try{
        
            $exists_driver = Auth::user()->favourite_driver;

            if(!empty($exists_driver)){
                $drivers = explode(',', $exists_driver);
            }else{
                $drivers =[];
            }

            $providers = Provider::whereIn('id', $drivers)->select('id','first_name','last_name','mobile','avatar','rating')->get();
            if(!empty($providers)){
                foreach ($providers as $key => $value) {
                     $providers[$key]->avatar = asset('storage/'.$value->avatar);
                }
            }
            
            return $providers;

        }catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')],500);
        }
    }
    /**
     * help Details.
     *
     * @return \Illuminate\Http\Response
     */

    public function favourite_add(Request $request){

        $this->validate($request, [
                'provider_id' => 'required',
            ]);

        try{
            $new_driver  = $request->provider_id;
            $exists_driver = Auth::user()->favourite_driver;

            if(!empty($exists_driver)){
                $drivers = explode(',', $exists_driver);
            }else{
                $drivers =[];
            }

            if(in_array($new_driver,$drivers))
            {
                return response()->json(['message' => 'Already driver in favourite list',]);

            }elseif(count($drivers) ==3){

                return response()->json(['message' => 'Adding favourite driver is limited',]);
            }   
            else{
                $drivers[] = $new_driver;
                $updated_drivers = implode(',', $drivers);
                User::where('id',Auth::user()->id)->update(['favourite_driver' => $updated_drivers]);
            }

            if($request->ajax()){
                return response()->json([
                        'message' => 'Driver add as favourite driver Successfully',
                    ]);
            }
          
        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')],500);
            }
        }
    }
    /**
     * help Details.
     *
     * @return \Illuminate\Http\Response
     */

    public function favourite_delete(Request $request){

        $this->validate($request, [
                'provider_id' => 'required',
            ]);

        try{
            $remove_driver  = $request->provider_id;
            $exists_driver = Auth::user()->favourite_driver;


            if(!empty($exists_driver)){
                $drivers = explode(',', $exists_driver);
                if (($key = array_search($remove_driver, $drivers)) !== false) {
                    unset($drivers[$key]);
                    $updated_drivers = implode(',', $drivers);
                    User::where('id',Auth::user()->id)->update(['favourite_driver' => $updated_drivers]);
                    return response()->json(['message' => 'Driver removed from list',]);
                }else{
                    return response()->json(['message' => 'Driver not found in favourite list',]);
                }
            }else{
                return response()->json(['message' => 'Favourite driver list is empty',]);
            }

        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')],500);
            }
        }
    }

    public function sendmail(Request $request){

        //sms and email----------------
            $user = Provider::with('service')->findOrFail(24);
            if(Setting::get('mail_enable', 0) == 1) {
                Mail::send('emails.driver-approved', ['user' => $user], function ($message) use ($user){
                    $message->to($user->email, $user->first_name)->subject(config('app.name').' Request Approval');
                });
            }
            if(Setting::get('sms_enable', 0) == 1) {
                $mobile = $user->mobile;
                $message = 'You have become the authorised driver of '.config('app.name').' Name:'.$user->first_name.' '.$user->first_name.', Phone:'.$user->mobile.', Service Number:'.$user->service->service_number.', Service Model:'.$user->service->service_model.'. Regards '.config('app.name'); 
                try {
                        Twilio::message($mobile, $message);
                    } catch ( \Services_Twilio_RestException $e ) {
                        //return $e->getMessage();  
                    }
            }
            //---------------------

        //Twilio::message('+919500698960', 'this is my first messge');

    }

}