<?php

namespace App\Http\Controllers\Api;

use App\Address;
use App\Contact;
use App\Category;
use App\Userskill;
use App\Subcategory;
use App\Notification;
use App\Paymenthistory;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Introduction;
use App\Introimage;
use App\Proposal;
use App\Rating;
use App\Service;
use App\Servicerequest;
use App\Providerbank;
use App\Skill;
use App\User;
use App\Useranswer;
use Exception;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use Validator;
use Mail;
use App\Question;
//

use LaravelFCM\Message\OptionsBuilder;
use LaravelFCM\Message\PayloadDataBuilder;
use LaravelFCM\Message\PayloadNotificationBuilder;
use FCM;
use LaravelFCM\Message\Topics;

use Stripe;

class AuthController extends Controller
{
  public function getDynamicDataByLanguage(Request $request)
  {
    if ($request->type == 'en') {
    } else {
    }
  }

  public function getStaticDataByLanguage(Request $request)
  {
    $data = [
      'data' => trans('messages')
    ];
    return response()->json($data, 200);
  }


  public function register(Request $request)
  {
    $validator = Validator::make($request->all(), ['userEmail' => 'required|email|unique:users,email', 'userFirstName' => 'required', 'userLastName' => 'required', 'userpassword' => 'required']);

    if ($validator->fails()) {
      $user = User::where('email', $request->userEmail)->first();
      if ($request->social_type != '1') {
        $error = $validator->messages();
        $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $error];
        return response($data, 403);
      } else {
        $user->password = bcrypt($request->userpassword);
        $user->social_type = $request->social_type;
        $user->fb_token = $request->fb_token;
        $user->google_token = $request->google_token;
        $user->last_login = date('Y-m-d h:i:s');
        $user->save();
        $token = Str::random(60);
        $user->api_token = hash('sha256', $token);
        $user->save();
        $userdetail = $user->toArray();
        $userdetail['authorizationToke'] = $token;


        $data = ['status' => 200, 'isSuccess' => 'true', 'message' => 'Login Success', 'userdetail' => $userdetail];
        return response($data, 200);
      }
    } else {

      $user = new User;
      $user->userFirstName = $request->userFirstName;
      $user->userLastName = $request->userLastName;
      $user->userFCMToken = $request->userFCMToken;
      $user->email = $request->userEmail;
      $user->phone = $request->userPhone;
      $user->password = bcrypt($request->userpassword);
      $user->social_type = $request->social_type;
      $user->fb_token = $request->fb_token;
      $user->google_token = $request->google_token;
      $user->last_login = date('Y-m-d h:i:s');
      $user->save();
      $token = Str::random(60);
      $user->api_token = hash('sha256', $token);
      $user->save();
      $userdetail = $user->toArray();
      $userdetail['authorizationToke'] = $token;


      $data = ['status' => 200, 'isSuccess' => 'true', 'message' => 'Login Success', 'userdetail' => $userdetail];
      return response($data, 200);
    }
  }

  public function login(Request $request)
  {
    $validator = Validator::make($request->all(), ['userEmail' => 'required', 'userpassword' => 'required']);
    if ($validator->fails()) {
      $error = $validator->messages();
      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $error];
      return response($data, 403);
    } else {
      $credentials = ['email' => $request->userEmail, 'password' => $request->userpassword];

      if (Auth::attempt($credentials)) {
        $user = User::where('email', $request->userEmail)->first();
        $token = Str::random(60);
        $user->api_token = hash('sha256', $token);
        $user->userFCMToken = $request->userFCMToken;
        $user->last_login = date('Y-m-d h:i:s');
        $user->save();
        $userdetail = $user->toArray();
        $userdetail['authorizationToke'] = $token;

        $data = ['status' => 200, 'isSuccess' => 'true', 'message' => 'Login Success', 'userdetail' => $userdetail];
        return response($data, 200);
      } else {

        $data = ['status' => 201, 'isSuccess' => 'flase', 'message' => 'Login false', 'userdetail' => []];
        return response($data, 200);
      }
    }
  }
  public function category(Request $request)
  {
    $lang = $request->header('X-localization');
    $c =  Category::paginate(40);
    $status = 200;
    $total = $c->total();
    $perPage = 40;
    if ($total > 0)
      $message = "data found";
    else
      $message = "no data found";
    //$categoryList = $c->items();
    $categoryList = array();
    $nextpage = $c->nextPageUrl();
    $prevpage = $c->previousPageUrl();
    $notification = Notification::where(['user_id' => Auth::user()->id, 'status' => 0])->count();

    //print_r($c->items());
    //die;
    if (count($c->items()) > 0) :
      foreach ($c->items() as $key => $val) :
        $categoryList[$key]['id'] = $val->id;
        if ($lang == 'en') {
          $categoryList[$key]['categoryName'] = $val->categoryName;
          $categoryList[$key]['categoryDescription'] = $val->categoryDescription;
          $categoryList[$key]['categorylocation'] = $val->categorylocation;
        } else {
          $categoryList[$key]['categoryName'] = $val->fr_categoryName;
          $categoryList[$key]['categoryDescription'] = $val->fr_categoryDescription;
          $categoryList[$key]['categorylocation'] = $val->fr_categorylocation;
        }
        $categoryList[$key]['categoryIcon'] = $val->categoryIcon;
        $categoryList[$key]['created_at'] = $val->created_at;
        $categoryList[$key]['updated_at'] = $val->updated_at;
      endforeach;
    endif;

    $data = ['status' => $status, 'total' => $total, 'message' => $message, 'perPage' => $perPage, 'categoryList' => $categoryList, 'nextpage' => $nextpage, 'prevpage' => $prevpage, 'notification' => $notification];
    return response($data, 200);
  }
  public function subcategory(Request $request, Category $category)
  {
    $lang = $request->header('X-localization');
    $c =  $category->subcategories()->paginate(40);
    $status = 200;
    $total = $c->total();
    $perPage = 40;
    if ($total > 0)
      $message = "data found";
    else
      $message = "no data found";
    //$subcategoryList = $c->items();
    $subcategoryList = array();

    if (count($c->items()) > 0) :
      foreach ($c->items() as $key => $val) :
        $subcategoryList[$key]['id'] = $val->id;
        $subcategoryList[$key]['category_id'] = $val->category_id;
        if ($lang == 'en') {
          $subcategoryList[$key]['subcategoryName'] = $val->subcategoryName;
          $subcategoryList[$key]['subcategoryDescription'] = $val->subcategoryDescription;
          $subcategoryList[$key]['subcategorylocation'] = $val->subcategorylocation;
        } else {
          $subcategoryList[$key]['subcategoryName'] = $val->fr_subcategoryName;
          $subcategoryList[$key]['subcategoryDescription'] = $val->fr_subcategoryDescription;
          $subcategoryList[$key]['subcategorylocation'] = $val->fr_subcategorylocation;
        }
        $subcategoryList[$key]['subcategoryIcon'] = $val->subcategoryIcon;
        $subcategoryList[$key]['created_at'] = $val->created_at;
        $subcategoryList[$key]['updated_at'] = $val->updated_at;
      endforeach;
    endif;

    $nextpage = $c->nextPageUrl();
    $prevpage = $c->previousPageUrl();
    $data = ['status' => $status, 'total' => $total, 'message' => $message, 'perPage' => $perPage, 'subcategoryList' => $subcategoryList, 'nextpage' => $nextpage, 'prevpage' => $prevpage];
    return response($data, 200);
  }
  public function service()
  {

    $c =  Service::with(
      [
        'category' => function ($query) {
          $query->select('id', 'categoryName');
        },
        'subcategory' => function ($query) {
          $query->select('id', 'subcategoryName');
        }
      ]
    )->paginate(40);
    $status = 200;
    $total = $c->total();
    $perPage = 40;
    if ($total > 0)
      $message = "data found";
    else
      $message = "no data found";
    $serviceList = $c->items();
    $nextpage = $c->nextPageUrl();
    $prevpage = $c->previousPageUrl();
    $data = ['status' => $status, 'total' => $total, 'message' => $message, 'perPage' => $perPage, 'serviceList' => $serviceList, 'nextpage' => $nextpage, 'prevpage' => $prevpage];
    return response($data, 200);
  }
  public function servicebycategory(Request $request, Category $category)
  {
    $lang = $request->header('X-localization');
    $c =  Service::whereHas('category', function ($query) use ($category) {
      $query->where('category_id', $category->id);
    })->with(
      [
        'category' => function ($query) {
          $query->select('id', 'categoryName');
        },
        'subcategory' => function ($query) {
          $query->select('id', 'subcategoryName');
        }
      ]
    )->paginate(40);
    $status = 200;
    $total = $c->total();
    $perPage = 40;
    if ($total > 0)
      $message = "data found";
    else
      $message = "no data found";
    $serviceList = $c->items();
    $nextpage = $c->nextPageUrl();
    $prevpage = $c->previousPageUrl();
    $data = ['status' => $status, 'total' => $total, 'message' => $message, 'perPage' => $perPage, 'serviceList' => $serviceList, 'nextpage' => $nextpage, 'prevpage' => $prevpage];
    return response($data, 200);
  }
  public function servicebysubcategory(Request $request, Subcategory $subcategory)
  {
    $lang = $request->header('X-localization');
    $c =  Service::whereHas('subcategory', function ($query) use ($subcategory) {
      $query->where('subcategory_id', $subcategory->id);
    })->with(
      [
        'category' => function ($query) {
          $query->select('id', 'categoryName', 'fr_categoryName');
        },
        'subcategory' => function ($query) {
          $query->select('id', 'subcategoryName', 'fr_subcategoryName');
        }
      ]
    )->paginate(40);
    $status = 200;
    $total = $c->total();
    $perPage = 40;
    if ($total > 0)
      $message = "data found";
    else
      $message = "no data found";
    //$serviceList = $c->items();
    $nextpage = $c->nextPageUrl();
    $prevpage = $c->previousPageUrl();
    $serviceList = array();

    if (count($c->items()) > 0) :
      foreach ($c->items() as $key => $val) :
        $serviceList[$key]['id'] = $val->id;
        $serviceList[$key]['category_id'] = $val->category_id;
        $serviceList[$key]['subcategory_id'] = $val->subcategory_id;
        if ($lang == 'en') {
          $serviceList[$key]['serviceName'] = $val->serviceName;
          $serviceList[$key]['serviceDescription'] = $val->serviceDescription;
          $serviceList[$key]['serviceAddress'] = $val->serviceAddress;
        } else {
          $serviceList[$key]['serviceName'] = $val->fr_serviceName;
          $serviceList[$key]['serviceDescription'] = $val->fr_serviceDescription;
          $serviceList[$key]['serviceAddress'] = $val->fr_serviceAddress;
        }
        $serviceList[$key]['category'] = $val->category;
        $serviceList[$key]['subcategory'] = $val->subcategory;
        $serviceList[$key]['created_at'] = $val->created_at;
        $serviceList[$key]['updated_at'] = $val->updated_at;
      endforeach;
    endif;

    $data = ['status' => $status, 'total' => $total, 'message' => $message, 'perPage' => $perPage, 'serviceList' => $serviceList, 'nextpage' => $nextpage, 'prevpage' => $prevpage];
    return response($data, 200);
  }
  public function questionsets(Request $request, $service)
  {
    $lang = $request->header('X-localization');
    $c = Question::where('service_id', $service)->get();
    $total = $c->count();

    if ($total > 0) {
      $questionSetforall = [];
      $questionSetforprovider = [];
      $questionSetforusers = [];
      $questionSetprovider = [];
      $questionSetusers = [];

      //foreach($c as $key=>$val) {
      foreach ($c as $q) {

        if ($q->questionfor == "serviceprovider") {
          $questionSetforprovider[] = $q;

          // $questionSetforprovider[$key]['id'] = $val->id;
          // $questionSetforprovider[$key]['service_id'] = $val->service_id;
          // if($lang=='en') {
          //   $questionSetforprovider[$key]['question'] = $val->question;
          //   $questionSetforprovider[$key]['array_answer'] = implode(",",json_decode($val->answer));
          //   $questionSetforprovider[$key]['json_answer'] = json_decode($val->answer);
          // } else {
          //   $questionSetforprovider[$key]['question'] = $val->fr_question;
          //   $questionSetforprovider[$key]['array_answer'] = implode(",",json_decode($val->fr_answer));
          //   $questionSetforprovider[$key]['json_answer'] = json_decode($val->fr_answer);
          // }
          // $questionSetforprovider[$key]['type'] = $val->type;
          // $questionSetforprovider[$key]['questionfor'] = $val->questionfor;
          // $questionSetforprovider[$key]['created_at'] = $val->created_at;
          // $questionSetforprovider[$key]['updated_at'] = $val->updated_at;


        } else {
          $questionSetforusers[] = $q;

          // $questionSetforusers[$key]['id'] = $val->id;
          // $questionSetforusers[$key]['service_id'] = $val->service_id;
          // if($lang=='en') {
          //   $questionSetforusers[$key]['question'] = $val->question;
          //   $questionSetforusers[$key]['array_answer'] = implode(",",json_decode($val->answer));
          //   $questionSetforusers[$key]['json_answer'] = json_decode($val->answer);
          // } else {
          //   $questionSetforusers[$key]['question'] = $val->fr_question;
          //   $questionSetforusers[$key]['array_answer'] = implode(",",json_decode($val->fr_answer));
          //   $questionSetforusers[$key]['json_answer'] = json_decode($val->fr_answer);
          // }
          // $questionSetforusers[$key]['type'] = $val->type;
          // $questionSetforusers[$key]['questionfor'] = $val->questionfor;
          // $questionSetforusers[$key]['created_at'] = $val->created_at;
          // $questionSetforusers[$key]['updated_at'] = $val->updated_at;


        }
      }

      if (count($questionSetforprovider) > 0) {
        foreach ($questionSetforprovider as $key => $val) {
          $questionSetprovider[$key]['id'] = $val->id;
          $questionSetprovider[$key]['service_id'] = $val->service_id;
          if ($lang == 'en') {
            $questionSetprovider[$key]['question'] = $val->question;
            $questionSetprovider[$key]['array_answer'] = implode(",", json_decode($val->answer));
            $questionSetprovider[$key]['json_answer'] = json_decode($val->answer);
          } else {
            $questionSetprovider[$key]['question'] = $val->fr_question;
            if ($val->fr_answer != '') {
              $questionSetprovider[$key]['array_answer'] = implode(",", json_decode($val->fr_answer));
              $questionSetprovider[$key]['json_answer'] = json_decode($val->fr_answer);
            } else {
              $questionSetprovider[$key]['array_answer'] = "";
              $questionSetprovider[$key]['json_answer'] = "";
            }
          }
          $questionSetprovider[$key]['type'] = $val->type;
          $questionSetprovider[$key]['questionfor'] = $val->questionfor;
          $questionSetprovider[$key]['created_at'] = $val->created_at;
          $questionSetprovider[$key]['updated_at'] = $val->updated_at;
        }
      }


      if (count($questionSetforusers) > 0) {
        foreach ($questionSetforusers as $key => $val) {
          $questionSetusers[$key]['id'] = $val->id;
          $questionSetusers[$key]['service_id'] = $val->service_id;
          if ($lang == 'en') {
            $questionSetusers[$key]['question'] = $val->question;
            $questionSetusers[$key]['array_answer'] = implode(",", json_decode($val->answer));
            $questionSetusers[$key]['json_answer'] = json_decode($val->answer);
          } else {
            $questionSetusers[$key]['question'] = $val->fr_question;
            if ($val->fr_answer != '') {
              $questionSetusers[$key]['array_answer'] = implode(",", json_decode($val->fr_answer));
              $questionSetusers[$key]['json_answer'] = json_decode($val->fr_answer);
            } else {
              $questionSetusers[$key]['array_answer'] = "";
              $questionSetusers[$key]['json_answer'] = "";
            }
          }
          $questionSetusers[$key]['type'] = $val->type;
          $questionSetusers[$key]['questionfor'] = $val->questionfor;
          $questionSetusers[$key]['created_at'] = $val->created_at;
          $questionSetusers[$key]['updated_at'] = $val->updated_at;
        }
      }



      $message = "Data Found";
      $data = ['status' => 200, 'totalQuestionSets' => $total, 'message' => $message,  'questionSetforprovider' => $questionSetprovider, 'questionSetforusers' => $questionSetusers];
    } else {
      $message = "No Data Found";
      $data = ['status' => 201, 'total' => $total, 'message' => $message];
    }

    return response($data, 200);
  }
  public function subcategorysearch(Request $request)
  {
    $c = Subcategory::orWhere('subcategoryName', 'like', $request->searchText . '%')
      ->orWhere('subcategoryName', 'like', '%' . $request->searchText)
      ->orWhere('subcategoryName', 'like', '%' . $request->searchText . '%')
      ->get();

    $total = $c->count();
    if ($total > 0) {
      $message = "Data Found";
      $data = ['status' => 200, 'total' => $total, 'message' => $message, 'subcategoryList' => $c];
    } else {

      /*$notification = new Notification;
          $notification->user_id = Auth::user()->id;
          $notification->message = 'Searching for new Sub category '. $request->searchText;
          $notification->type = 'Newsubcategory';
          $notification->status = 0;
          $notification->save();*/

      $message = "No Data Found";
      $data = ['status' => 201, 'total' => $total, 'message' => $message];
    }

    return response($data, 200);
  }

  public function subcategorynotification(Request $request)
  {

    $notification = new Notification;
    $notification->user_id = $request->user_id;
    $notification->message = 'Searching for new Sub category "' . $request->subcategory . '"';
    $notification->type = 'Newsubcategory';
    $notification->status = 0;
    $notification->save();

    $subject = $request->serviceType;
    $msg = $request->serviceDetails;
    $from_email = "sudip.pal@shyamfuture.com";
    $from_name = "Phoenixerrands";
    $to_email = "samir.samanta@shyamfuture.com";
    $headers = "MIME-Version: 1.0" . "\r\n";
    $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
    $headers .= 'From: ' . $from_name . ' <' . $from_email . '>' . "\r\n";
    mail($to_email, $subject, $msg, $headers);

    $message = "Data Updated Successfully";
    $data = ['status' => 200, 'notificationUpdate' => true, 'message' => $message];


    return response($data, 200);
  }

  public function servicesearch(Request $request)
  {
    $c =  Service::where(function ($query) use ($request) {

      $query->Where('serviceName', 'like', $request->searchText . '%');
      $query->orWhere('serviceName', 'like', '%' . $request->searchText);
      $query->orWhere('serviceName', 'like', '%' . $request->searchText . '%');
    })
      // $c =  Service::where('serviceName','like', $request->searchText .'%')
      ->where('subcategory_id', $request->subCategoryID)
      ->get();
    $status = 200;
    $total = $c->count();
    if ($total > 0)
      $message = "data found";
    else
      $message = "no data found";
    $data = ['status' => $status, 'total' => $total, 'message' => $message, 'serviceList' => $c,];
    return response($data, 200);
  }
  public function skill()
  {
    $c =  Skill::paginate(40);
    $status = 200;
    $total = $c->total();
    $perPage = 40;
    if ($total > 0)
      $message = "data found";
    else
      $message = "no data found";
    $skill = $c->items();
    $nextpage = $c->nextPageUrl();
    $prevpage = $c->previousPageUrl();
    $data = ['status' => $status, 'total' => $total, 'message' => $message, 'perPage' => $perPage, 'skill' => $skill, 'nextpage' => $nextpage, 'prevpage' => $prevpage];
    return response($data, 200);
  }
  public function skillbyservice(Service $service)
  {
    $skill = $service->skills;
    $data = ['status' => 200, 'skill' => $skill];
    return response($data, 200);
  }
  public function addskill(Request $request)
  {
    $wqSkill = Userskill::where([
      'skill_id' => $request->skillid,
      'user_id' => Auth::user()->id,
    ])->first();
    if ($wqSkill === null) {
      $skill = new Userskill;
      $skill->skill_id = $request->skillid;
      $skill->user_id = Auth::user()->id;
      $skill->save();
      $data = ['status' => 200, 'message' => "skill added"];
      return response($data, 200);
    } else {
      $data = ['status' => 201, 'message' => "Skill already exist"];
      return response($data, 403);
    }
  }
  public function removeskill(Request $request)
  {
    $skill = $request->skill_id;
    $user_id = Auth::user()->id;
    Userskill::where(['user_id' => $user_id, 'skill_id' => $skill])->delete();
    $data = ['status' => 200, 'message' => "skill deleted successfully"];
    return response($data, 200);
  }
  public function myskill(Request $request)
  {
    $lang = $request->header('X-localization');
    $user = Auth::user();

    //$c =  Userskill::with('skill')->where('user_id', $user->id)->paginate(40);
    $c =  Userskill::with(['skill' => function ($query) {
      $query->orderBy('skillName', 'asc');
    }])->where('user_id', $user->id)->paginate(40);

    $status = 200;
    $total = $c->total();
    $perPage = 40;
    if ($total > 0)
      $message = "data found";
    else
      $message = "no data found";
    //$skill = $c->items();
    //print_r($c->items()); die;
    $skill = $skilldetail = array();
    $nextpage = $c->nextPageUrl();
    $prevpage = $c->previousPageUrl();


    if (count($c->items()) > 0) :
      foreach ($c->items() as $key => $val) :
        $skill[$key]['id'] = $val->id;
        $skill[$key]['user_id'] = $val->user_id;
        $skill[$key]['skill_id'] = $val->skill_id;

        $skilldetail['id'] = $val->skill->id;
        $skilldetail['service_id'] = $val->skill->service_id;
        $skilldetail['skillIcon'] = $val->skill->skillIcon;
        $skilldetail['created_at'] = $val->skill->created_at;
        $skilldetail['updated_at'] = $val->skill->updated_at;
        if ($lang == 'en') {
          $skilldetail['skillName'] = $val->skill->skillName;
          $skilldetail['skillDescription'] = $val->skill->skillDescription;
        } else {
          $skilldetail['skillName'] = $val->skill->fr_skillName;
          $skilldetail['skillDescription'] = $val->skill->fr_skillDescription;
        }

        $skill[$key]['skill'] = $skilldetail;
        $skill[$key]['created_at'] = $val->created_at;
        $skill[$key]['updated_at'] = $val->updated_at;
      endforeach;
    endif;

    $data = ['status' => $status, 'total' => $total, 'message' => $message, 'perPage' => $perPage, 'skill' => $skill, 'nextpage' => $nextpage, 'prevpage' => $prevpage];
    return response($data, 200);
  }

  public function forgetpassword(Request $request)
  {
    $user = User::where('email', $request->userEmail)->first();
    if ($user) {

      Mail::send('test', function ($m) use ($user) {
        $m->from('hello@app.com', 'Your Application');
        $m->to($request->userEmail, 'Test')->subject('Your Reminder!');
      });

      $data = ['status' => 200, 'isSuccess' => 'true', 'message' => 'email sent to registered mail'];
      return response($data, 200);
    } else {
      $data = ['status' => 201, 'isSuccess' => 'false', 'message' => 'email not found'];
      return response($data, 200);
    }
  }
  public function introduction(Request $request)
  {
    $lang = $request->header('X-localization');
    $intro = Introduction::find(1);
    $image = Introimage::all()->toArray();
    $rating = Rating::all();
    $totalReview = $rating->count();
    if ($totalReview != 0) {
      $to = 0;
      foreach ($rating as $r) {
        $to = $to + $r->rating;
      }
      $averageReview = number_format($to / $totalReview, 1);
    } else
      $averageReview = 0;

    if ($lang == 'en') {
      $introductionText = $intro->text;
    } else {
      $introductionText = $intro->fr_text;
    }

    $introdetail = ['introductionText' => $introductionText, 'totalReview' => $totalReview, 'averageReview' => $averageReview, 'introImage' => $image];

    $data = ['status' => 201, 'introDetails' => $introdetail, 'message' => 'Introductiondetails'];
    return response($data, 200);
  }
  public function contact()
  {

    $contact = Contact::where(['user_id' => auth()->user()->id])->get();
    $us = [];
    foreach ($contact as $k => $u) {
      $user = User::find($u->provider_id);
      $us[$k]['contactID'] = $user->id;
      $us[$k]['contactName'] = $user->userFirstName . ' ' . $user->userLastName;
      $us[$k]['contactImage'] = $user->image;
      $us[$k]['contactTotalRating'] = $user->totalrating();
      $us[$k]['contactRating'] = $user->userrating();
    }
    $data = ['status' => 201, 'contactList' => $us, 'message' => 'Contact list found'];
    return response($data, 200);
  }
  public function contactdetails(Request $request)
  {
    $validator = Validator::make($request->all(), ['contactID' => 'required']);
    if ($validator->fails()) {
      $error = $validator->messages();
      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $error];
      return response($data, 403);
    } else {
      $id = $request->contactID;
      $u = User::findorfail($id);

      $us['contactID'] = $u->id;
      $us['contactName'] = $u->userFirstName . ' ' . $u->userLastName;
      $us['contactImage'] = $u->image;
      $us['contactTotalRating'] = $u->totalrating();
      $us['contactRating'] = $u->userrating();

      $data = ['status' => 201, 'contactList' => $us, 'message' => 'Contact list found'];
      return response($data, 200);
    }
  }
  public function validatepostalcode(Request $request)
  {
    $validator = Validator::make($request->all(), ['postalcode' => 'required']);
    if ($validator->fails()) {
      $error = $validator->messages();
      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $error];
      return response($data, 403);
    }
    $zip = $request->postalcode;
    $response = file_get_contents("https://api.postalpincode.in/pincode/$zip");
    // $response = '[{"Message":"No records found","Status":"Error","PostOffice":null}]';
    $valid = json_decode($response)[0]->Status;
    if ($valid == "Success") {
      $data = ['status' => 200, 'isVerified' => true, 'message' => 'Postal code verified'];
      return response($data, 200);
    } else {
      $data = ['status' => 201, 'isVerified' => false, 'message' => 'Postal code not found'];
      return response($data, 200);
    }
  }

  public function url_get_contents($Url)
  {
    if (!function_exists('curl_init')) {
      die('CURL is not installed!');
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $Url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
  }

  public function getLnt($zip)
  {
    $myarr = array();
    $url = "https://maps.googleapis.com/maps/api/geocode/json?address=" . urlencode($zip) . "&sensor=true&key=AIzaSyAAkZKZty_mWhW4VG_er5SN1MIxfldbDLY";
    $result_string = $this->url_get_contents($url);
    $result = json_decode($result_string, true);
    //print_r($result);
    //die;
    if (count($result['results']) > 0) {
      return $result['results'][0]['geometry']['location'];
    } else {
      return $myarr;
    }
  }

  public function calculateDistance($lat1, $lon1, $lat2, $lon2, $unit)
  {
    if (($lat1 == $lat2) && ($lon1 == $lon2)) {
      return 0;
    } else {
      $theta = $lon1 - $lon2;
      $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
      $dist = acos($dist);
      $dist = rad2deg($dist);
      $miles = $dist * 60 * 1.1515;
      $unit = strtoupper($unit);

      if ($unit == "K") {
        return ($miles * 1.609344);
      } else if ($unit == "N") {
        return ($miles * 0.8684);
      } else {
        return $miles;
      }
    }
  }

  public function sendPushNotifications($tokenList, $title, $description)
  {
    define('API_ACCESS_KEY1', 'AIzaSyAP5ObweLIeVOWCZTUjiebFsNaMvtePGfI');
    $fcmUrl = 'https://fcm.googleapis.com/fcm/send';
    //$token='e1lSf-NdBJk:APA91bHT4jcRSft6lJdxZRrcVXFBHT6pr9-gA3YbjSBLjXTZUhAAPp_VEMBbQn74YAiAtx1AsAk5M6THGmcx4cWrbglL-NA29FBSkqwWhDbXvXacT4JbYVlik1qZk4qTzi0Tmvf08F0F';

    $notification = [
      'title' => $title,
      'body' => $description,
      'icon' => 'myIcon',
      'sound' => 'mySound'
    ];
    $extraNotificationData = ["message" => $notification, "moredata" => 'dd'];

    $fcmNotification = [
      'registration_ids' => $tokenList, //multple token array
      //'to'        => $token, //single token
      'notification' => $notification,
      'data' => $extraNotificationData
    ];

    $headers = [
      'Authorization: key=' . API_ACCESS_KEY1,
      'Content-Type: application/json'
    ];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $fcmUrl);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fcmNotification));
    $result = curl_exec($ch);
    curl_close($ch);
  }

  public function sendSinglePushNotifications($token, $title, $description)
  {
    define('API_ACCESS_KEY2', 'AIzaSyAP5ObweLIeVOWCZTUjiebFsNaMvtePGfI');
    $fcmUrl = 'https://fcm.googleapis.com/fcm/send';
    //$token='e1lSf-NdBJk:APA91bHT4jcRSft6lJdxZRrcVXFBHT6pr9-gA3YbjSBLjXTZUhAAPp_VEMBbQn74YAiAtx1AsAk5M6THGmcx4cWrbglL-NA29FBSkqwWhDbXvXacT4JbYVlik1qZk4qTzi0Tmvf08F0F';

    $notification = [
      'title' => $title,
      'body' => $description,
      'icon' => 'myIcon',
      'sound' => 'mySound'
    ];
    $extraNotificationData = ["message" => $notification, "moredata" => 'dd'];

    $fcmNotification = [
      //'registration_ids' => $tokenList, //multple token array
      'to'        => $token, //single token
      'notification' => $notification,
      'data' => $extraNotificationData
    ];

    $headers = [
      'Authorization: key=' . API_ACCESS_KEY2,
      'Content-Type: application/json'
    ];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $fcmUrl);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fcmNotification));
    $result = curl_exec($ch);
    curl_close($ch);

    // print_r($result);
    // die;
  }

  public function searching(Request $request)
  {
    $userarray = $tokens = array();
    $validator = Validator::make($request->all(), ['serviceid' => 'required', 'questionSet' => 'required', 'zipcode' => 'required']);
    if ($validator->fails()) {
      $error = $validator->messages();
      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $error];
      return response($data, 403);
    }
    $service = Service::find($request->serviceid);
    if ($service) {
      $servicereq = new Servicerequest;
      $servicereq->user_id = Auth::user()->id;
      $servicereq->service_id = $request->serviceid;
      $servicereq->zipcode = $request->zipcode;
      $servicereq->latlong = $request->latlong;

      $questionset = $request->questionSet;
      if ($questionset[0]['answerList'] == "Yes") {
        $servicereq->user_type = "0";
      } else {
        $servicereq->user_type = "1";
      }

      if ($servicereq->user_type == 0) {
        $servicereq->address_id = $request->address;
        $servicereq->delivery_date = $request->delivery_date;
      }

      if ($request->latlong != '') {
        $latlong = explode(",", $request->latlong);
        $lat = $latlong[0];
        $lon = $latlong[1];
        $token = "c7f9161028e266";
        $curl = curl_init('https://us1.locationiq.com/v1/reverse.php?key=' . $token . '&lat=' . $lat . '&lon=' . $lon . '&format=json');

        curl_setopt_array($curl, array(
          CURLOPT_RETURNTRANSFER    =>  true,
          CURLOPT_FOLLOWLOCATION    =>  true,
          CURLOPT_MAXREDIRS         =>  10,
          CURLOPT_TIMEOUT           =>  30,
          CURLOPT_CUSTOMREQUEST     =>  'GET',
        ));

        $response = curl_exec($curl);
        $err = curl_error($curl);

        curl_close($curl);

        if ($err) {
          $servicereq->provideraddress = $request->latlong;
        } else {
          $res = json_decode($response);
          $servicereq->provideraddress = $res->display_name;
        }
      }

      $servicereq->image = $request->image;
      $servicereq->save();

      unset($questionset[0]);
      foreach ($questionset as $q) {
        $useranswers = new Useranswer;
        $useranswers['servicerequest_id'] = $servicereq->id;
        $useranswers['question_id'] = $q['questionid'];
        $useranswers['answer'] = $q['answerList'];
        $useranswers->save();
      }

      if ($servicereq->user_type == 0) {
        $useraddress = Address::where('id', $request->address)->first();
        $userlatlong = explode(",", $useraddress->latlong);
        $userlat = $userlatlong[0];
        $userlong = $userlatlong[1];

        $users = Servicerequest::select('user_id', 'zipcode')->where('user_id', '<>', Auth::user()->id)->where(['service_id' => $request->serviceid, 'user_type' => 1])->get();

        if (count($users) > 0) {
          foreach ($users as $key => $value) {
            array_push($userarray, $value->user_id);
          }
        }

        // foreach ($users as $key => $value) {
        //   $providerlatlong = $this->getLnt($value->zipcode);
        //   if (count($providerlatlong) > 0) {
        //     $providerlat = $providerlatlong['lat'];
        //     $providerlong = $providerlatlong['lng'];

        //     if (isset($userlat) && $userlat != '' && isset($userlong) && $userlong != '' && isset($providerlat) && $providerlat != '' && isset($providerlong) && $providerlong != '') {
        //       $distance_difference_btw_user_and_provider = $this->calculateDistance($userlat, $userlong, $providerlat, $providerlong, "K");

        //       if ($distance_difference_btw_user_and_provider <= 30) {
        //         array_push($userarray, $value->user_id);
        //       }
        //     }
        //   }
        // }
      }


      // $users = Servicerequest::select('user_id')->where('user_id' , '<>', Auth::user()->id)->where(['service_id' => $request->serviceid, 'user_type' => 1])->groupBy('user_id')->get();
      // $tokens = [];

      if (count($userarray) > 0) {
        foreach ($userarray as $key1 => $value1) {
          $message = "New Service Posted";
          $tokens[$key1] = User::find($value1)->userFCMToken;
          $notification = new Notification;
          $notification->user_id = $value1;
          $notification->message = $message;
          $notification->type = 'NewService';
          $notification->status = 0;
          $notification->save();
        }
      }

      //Start Notification
      if (count($tokens) > 0) {
        $downstreamResponse = $this->sendPushNotifications($tokens, 'New Service', $message);
        // $optionBuilder = new OptionsBuilder();
        // $optionBuilder->setTimeToLive(60*20);
        // $notificationBuilder = new PayloadNotificationBuilder('New Service Posted');
        // $notificationBuilder->setBody($message)->setSound('default');

        // $dataBuilder = new PayloadDataBuilder();
        // $dataBuilder->addData(['type' => 'NewService','message'=>$message]);

        // $option = $optionBuilder->build();
        // $notification = $notificationBuilder->build();
        // $data = $dataBuilder->build();
        // $downstreamResponse = FCM::sendTo($tokens, $option, $notification, $data);
      }
      //End Notification

      $data = ['status' => 200, 'isServiceFound' => true, 'message' => 'Your request has been sent'];
      return response($data, 200);
    } else {
      $data = ['status' => 201, 'isServiceFound' => false,];
      return response($data, 200);
    }
  }
  public function updatenotificationstatus($id)
  {
    Notification::where('id', $id)->update(['status' => 1]);
    return ['status' => 200, 'isNotificationUpdated' => true];
  }

  public function rejectmypostedservice($id)
  {
    Servicerequest::where('id', $id)->update(['is_active' => '0']);
    return ['status' => 200, 'message' => 'Status has updated successfully'];
  }

  public function notificationlist()
  {
    $notification = Notification::where('user_id', Auth::user()->id)->where('type', '!=', 'Newsubcategory')->latest()->get();
    //Notification::where('user_id',Auth::user()->id)->update(['status'=>1]);
    return ['status' => 200, 'notification' => $notification];
  }

  public function mypostedservice(Request $request)
  {
    $lang = $request->header('X-localization');
    $wqarr = array();
    $user = Auth::user()->id;
    $c =  Servicerequest::with('service')->where(['user_id' => $user, 'user_type' => 0, 'accept_proposal' => NULL, 'is_active' => '1'])->latest()->paginate(500000);
    $status = 200;
    $total = $c->total();
    $perPage = 50;
    if ($total > 0)
      $message = "data found";
    else
      $message = "no data found";
    //dd($c->items());
    $serviceList = [];
    foreach ($c->items() as $d) {
      if ($d->service) {
        $q = $d->service->toArray();

        $wqarr['id'] = $q['id'];
        $wqarr['category_id'] = $q['category_id'];
        $wqarr['subcategory_id'] = $q['subcategory_id'];
        if ($lang == 'en') {
          $wqarr['serviceName'] = $q['serviceName'];
          $wqarr['serviceDescription'] = $q['serviceDescription'];
          $wqarr['serviceAddress'] = $q['serviceAddress'];
        } else {
          $wqarr['serviceName'] = $q['fr_serviceName'];
          $wqarr['serviceDescription'] = $q['fr_serviceDescription'];
          $wqarr['serviceAddress'] = $q['fr_serviceAddress'];
        }

        $wqarr['created_at'] = date('Y-m-d h:i:s a', strtotime($d['created_at']));
        $wqarr['updated_at'] = date('Y-m-d h:i:s a', strtotime($d['updated_at']));
        $wqarr['is_active'] = $d['is_active'];
        $wqarr['requestid'] = $d['id'];
        $wqarr['requestas'] = $d['user_type'] == 0 ? "user" : "provider";

        //$q['requestid'] = $d->id;
        //$q['requestas'] = $d->user_type == 0 ? "user":"provider";
        $serviceList[] = $wqarr;
      }
    }
    // $serviceList = $c->items();
    $nextpage = $c->nextPageUrl();
    $prevpage = $c->previousPageUrl();
    $data = ['status' => $status, 'total' => $total, 'message' => $message, 'perPage' => $perPage, 'serviceList' => $serviceList, 'nextpage' => $nextpage, 'prevpage' => $prevpage];
    return response($data, 200);
  }
  public function searvicenearme()
  {
    //echo Auth::user()->id;die;
    $services = Servicerequest::where(['user_id' => Auth::user()->id, 'user_type' => 1])->get();

    $myservice = [];
    foreach ($services as $key => $value) {
      $myservice[] =  $value->service_id;
    }

    $myservice = array_unique($myservice);

    $c =  Servicerequest::with('service')->where('user_id', '<>', Auth::user()->id)->where(['user_type' => 0, 'accept_proposal' => NULL])->whereIn('service_id', $myservice)->latest()->paginate(50);
    $status = 200;
    $total = $c->total();
    $perPage = 50;
    if ($total > 0)
      $message = "data found";
    else
      $message = "no data found";
    //dd($c->items());
    $serviceList = [];
    foreach ($c->items() as $d) {
      if ($d->service) {
        $q = $d->service->toArray();
        $q['requestid'] = $d->id;
        $q['created_at'] = $d->created_at->format('Y-m-d H:i:s');
        //   $q['isbid'] = $d->proposals->count() == 0 ? "false":"true";
        $q['isbid'] = Proposal::where(['servicerequest_id' => $d->id, 'user_id' => Auth::user()->id])->count() == 0 ? "false" : "true";
        if ($q['isbid'] == "true") {
          $q['bidamount'] = Proposal::where(['servicerequest_id' => $d->id, 'user_id' => Auth::user()->id])->first()->amount;
        }
        $serviceList[] = $q;
      }
    }
    // $serviceList = $c->items();
    $nextpage = $c->nextPageUrl();
    $prevpage = $c->previousPageUrl();
    $data = ['status' => $status, 'total' => $total, 'message' => $message, 'perPage' => $perPage, 'serviceList' => $serviceList, 'nextpage' => $nextpage, 'prevpage' => $prevpage];
    return response($data, 200);
  }
  public function servicerequestdetail(Servicerequest $servicerequest)
  {
    $questions = [];
    foreach ($servicerequest->answers as $k => $qus) {
      if ($qus) {
        $q = $qus->toArray();
        if ($qus->question) {
          $q['question'] = $qus->question->question;
          $questions[$k] = $q;
        }
      }
    }
    $data = ['status' => 200, 'service' => $servicerequest->service, 'questionset' => $questions, 'image' => $servicerequest->image];
    return response($data, 200);
  }

  public function makeproposal(Request $request)
  {
    $validator = Validator::make($request->all(), ['servicerequestid' => 'required', 'proposalamount' => 'required']);
    if ($validator->fails()) {
      $error = $validator->messages();
      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $error];
      return response($data, 403);
    }
    $proposal = new Proposal;
    $proposal->servicerequest_id = $request->servicerequestid;
    $proposal->amount = $request->proposalamount;
    $proposal->user_id = Auth::user()->id;
    $proposal->save();
    //
    $servicereq = Servicerequest::find($request->servicerequestid);
    $user = User::find($servicereq->user_id);
    $message = "New Proposal receive from " . Auth::user()->userFirstName . " Amount " . $proposal->amount;
    if ($user->userFCMToken != '') {
      $token = $user->userFCMToken;
      $this->sendSinglePushNotifications($token, 'New Proposal', $message);
    }

    //      $notification = new Notification;
    //      $notification->user_id = $user->id;
    //      $notification->message = $message;
    //      $notification->type = 'MakeProposal';
    //      $notification->status = 0;
    //      $notification->save();
    //     $optionBuilder = new OptionsBuilder();
    // $optionBuilder->setTimeToLive(60*20);

    // $notificationBuilder = new PayloadNotificationBuilder('test notification');
    // $notificationBuilder->setBody($message)
    //             ->setSound('default');

    // $dataBuilder = new PayloadDataBuilder();
    // $dataBuilder->addData(['type' => 'MakeProposal','message'=>$message]);

    // $option = $optionBuilder->build();
    // $notification = $notificationBuilder->build();
    // $data = $dataBuilder->build();

    // $downstreamResponse = FCM::sendTo($token, $option, $notification, $data);

    // $downstreamResponse->numberSuccess();
    // $downstreamResponse->numberFailure();
    // $downstreamResponse->numberModification();

    //


    $data = ['status' => 200, 'message' => "proposal added",];
    return response($data, 200);
  }
  public function getproposal(Servicerequest $servicerequest)
  {
    $c =  Proposal::with('user')->where('servicerequest_id', $servicerequest->id)->paginate(40);
    $status = 200;
    $total = $c->total();
    $perPage = 40;
    if ($total > 0)
      $message = "data found";
    else
      $message = "no data found";
    //dd($c->items());
    $serviceList = $servicerequest->service;
    $proposalsList = [];
    foreach ($c->items() as $k => $i) {
      $proposalsList[$k]['id'] = $i->id;
      $proposalsList[$k]['providerId'] = $i->user->id;
      $proposalsList[$k]['providerName'] = $i->user->userFirstName;
      $proposalsList[$k]['providerImage'] = $i->user->image;
      $proposalsList[$k]['proposalStatus'] = $i->status == 0 ? 'active' : 'inactive'; //providerstats
      $proposalsList[$k]['proposalPrice'] = $i->amount;
      $proposalsList[$k]['proposalDateTime'] = $i->created_at;
      $proposalsList[$k]['providerRating'] = $i->user->userrating();
      $proposalsList[$k]['providerTotalRating'] = $i->user->totalrating();
    }
    $nextpage = $c->nextPageUrl();
    $prevpage = $c->previousPageUrl();
    $data = ['status' => $status, 'total' => $total, 'message' => $message, 'perPage' => $perPage, 'service' => $serviceList, 'proposalsList' => $proposalsList, 'nextpage' => $nextpage, 'prevpage' => $prevpage];
    return response($data, 200);
  }
  public function fileupload(Request $request)
  {
    $request->validate(['image' => 'required']);
    $file = $request->image->store('files');
    $data = ['status' => 200, 'image' => $file];
    return response($data, 200);
  }
  public function myservice(Request $request)
  {
    //
    $lang = $request->header('X-localization');
    $user = Auth::user()->id;
    $services = Servicerequest::where(['user_id' => $user, 'user_type' => 1])->groupBy('service_id')->get();
    $s = [];
    $wqarr = array();
    foreach ($services as $key => $value) {
      //$s[$key] = $value->service;

      if ($value->service) {
        $wqarr['id'] = $value->service->id;
        $wqarr['category_id'] = $value->service->category_id;
        $wqarr['subcategory_id'] = $value->service->subcategory_id;
        if ($lang == 'en') {
          $wqarr['serviceName'] = $value->service->serviceName;
          $wqarr['serviceDescription'] = $value->service->serviceDescription;
          $wqarr['serviceAddress'] = $value->service->serviceAddress;
        } else {
          $wqarr['serviceName'] = $value->service->fr_serviceName;
          $wqarr['serviceDescription'] = $value->service->fr_serviceDescription;
          $wqarr['serviceAddress'] = $value->service->fr_serviceAddress;
        }
        $wqarr['created_at'] = $value->service->created_at;
        $wqarr['updated_at'] = $value->service->updated_at;
      }

      $s[$key] = $wqarr;

      $ser = Servicerequest::where(['service_id' => $value->service_id, 'user_type' => 1])->groupBy('user_id')->get();

      $provider = [];
      foreach ($ser as $k => $v) {
        $u = User::findorfail($v->user_id);

        $us = [];
        $us['serviceRequestID'] = $v->id;
        $us['contactID'] = $u->id;
        $us['contactName'] = $u->userFirstName . ' ' . $u->userLastName;
        $us['contactImage'] = $u->image;
        $us['contactAddress'] = $v->provideraddress;
        $us['date'] = $v->created_at;
        $us['contactTotalRating'] = $u->totalrating();
        $us['contactRating'] = $u->userrating();
        $provider[$k] = $us;
      }
      $s[$key]['provider'] = $provider;
    }
    //return $s;
    $data = ['status' => 200, 'serviceList' => $s];
    return response($data, 200);
  }
  public function sendnotification()
  {
    $optionBuilder = new OptionsBuilder();
    $optionBuilder->setTimeToLive(60 * 20);

    $notificationBuilder = new PayloadNotificationBuilder('test notification');
    $notificationBuilder->setBody('Hello world')
      ->setSound('default');

    $dataBuilder = new PayloadDataBuilder();
    $dataBuilder->addData(['a_data' => 'my_data']);

    $option = $optionBuilder->build();
    $notification = $notificationBuilder->build();
    $data = $dataBuilder->build();

    $token = "dJc9TJoykGQ:APA91bH7k4lc5CEfGlrftRrhXjHksQW3Vq8C0dR3NKm-fYtC-GSC5az3h_qs78RwfdkCAZoIEQ4nRo81jmTQ3gLpU7cQkjqc1OFGeS3Fk8RvBEHBohnbE35hR2f-S8C_4FIjayLqXD7Q";

    $downstreamResponse = FCM::sendTo($token, $option, $notification, $data);

    $downstreamResponse->numberSuccess();
    $downstreamResponse->numberFailure();
    $downstreamResponse->numberModification();
    dd($downstreamResponse);
    //   $notificationBuilder = new PayloadNotificationBuilder('Welcome');
    // $notificationBuilder->setBody('Hello world')
    // 				    ->setSound('default');
    //
    // $notification = $notificationBuilder->build();
    //
    // $topic = new Topics();
    // $topic->topic('testing');
    //
    // $topicResponse = FCM::sendToTopic($topic, null, $notification, null);
    //
    // $topicResponse->isSuccess();
    // $topicResponse->shouldRetry();
    // $topicResponse->error();
    // dd($topicResponse);
  }
  public function myprofile()
  {
    $profileDetails = Auth::user();
    $profileDetails = $profileDetails->toArray();
    //brpuhgt
    $profileDetails['bought'] = Contact::where(['user_id' => auth()->user()->id])->count();
    $profileDetails['sold'] = Contact::where(['provider_id' => auth()->user()->id])->count();
    //sold
    //response time
    $data = ['status' => 200, 'profileDetails' => $profileDetails];
    return response($data, 200);
  }
  public function providerdatail(Service $service, $providerid)
  {

    $u = User::findorfail($providerid);

    $us['contactID'] = $u->id;
    $us['contactName'] = $u->userFirstName . ' ' . $u->userLastName;
    $us['contactImage'] = $u->image;
    $servicerequest = Servicerequest::where(['service_id' => $service->id, 'user_id' => $providerid, 'user_type' => 1])->first();

    $us['contactAddress'] = $servicerequest->provideraddress;
    $us['image'] = $servicerequest->image;

    $us['service_serve'] = Contact::where('provider_id', $providerid)->count();
    $us['lastlogin'] = $u->updated_at;
    $us['contactTotalRating'] = $u->totalrating();
    $us['contactRating'] = $u->userrating();

    $questions = [];
    if ($servicerequest) {
      foreach ($servicerequest->answers as $k => $qus) {
        $q = $qus->toArray();
        $q['question'] = $qus->question->question;
        $questions[$k] = $q;
      }
    }

    $data = ['status' => 200, 'providerdetails' => $us, 'questionset' => $questions];
    return response($data, 200);
  }

  public function providerBankDetails(Request $request)
  {
    $validator = Validator::make($request->all(), ['bank_name' => 'required', 'account_holder_name' => 'required', 'account_number' => 'required', 'provider_id' => 'required']);
    if ($validator->fails()) {
      $error = $validator->messages();
      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $error];
      return response($data, 403);
    } else {
      $count = Providerbank::where('provider_id', $request->provider_id)->count();
      if ($count < 1) {
        $providerbank = new Providerbank;
      } else {
        $providerbank = Providerbank::where('provider_id', $request->provider_id)->first();
      }

      $providerbank->country = "FR";
      $providerbank->currency = "EUR";
      $providerbank->provider_id = $request->provider_id;
      $providerbank->bank_name = $request->bank_name;
      $providerbank->account_holder_name = $request->account_holder_name;
      $providerbank->account_holder_type = "individual";
      $providerbank->account_number = $request->account_number;
      $providerbank->save();

      $data = ['status' => 200, 'isSuccess' => 'true', 'message' => 'Bank Details has added successfully', 'address' => $providerbank];
      return response($data, 200);
    }
  }

  public function addaddress(Request $request)
  {
    $validator = Validator::make($request->all(), ['title' => 'required', 'name' => 'required', 'latlong' => 'required', 'zipcode' => 'required', 'phone' => 'required', 'fulladress' => 'required']);
    if ($validator->fails()) {
      $error = $validator->messages();
      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $error];
      return response($data, 403);
    }
    $address = new Address;
    $address->title = $request->title;
    $address->name = $request->name;
    $address->latlong = $request->latlong;
    $address->zipcode = $request->zipcode;
    $address->phone = $request->phone;
    $address->fulladress = $request->fulladress;
    $address->user_id = auth()->user()->id;
    $address->save();
    $data = ['status' => 200, 'isSuccess' => 'true', 'message' => 'Address added to profile', 'address' => $address];
    return response($data, 200);
  }
  public function addresslist()
  {
    $address = User::find(auth()->user()->id)->address;
    $data = ['status' => 200, 'isSuccess' => 'true', 'address' => $address];
    return response($data, 200);
  }
  public function acceptproposal(Request $request)
  {
    $validator = Validator::make($request->all(), ['proposal_id' => 'required']);
    if ($validator->fails()) {
      $error = $validator->messages();
      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $error];
      return response($data, 403);
    }
    $proposal = Proposal::findorfail($request->proposal_id);
    $servicerequest_id = $proposal->servicerequest_id;
    $provider_id = $proposal->user_id;
    $cost = $proposal->amount;
    $servicerequest = Servicerequest::find($servicerequest_id);
    $user_id = $servicerequest->user_id;
    $servicerequest->accept_proposal = $proposal->id;
    $servicerequest->save();
    $contact = new Contact;
    $contact->servicerequest_id = $servicerequest_id;
    $contact->user_id = $user_id;
    $contact->provider_id = $provider_id;
    $contact->cost = $cost;
    $contact->save();
    $message = "Your Proposal accepted";
    $token = User::find($provider_id)->userFCMToken;
    $notification = new Notification;
    $notification->user_id = $provider_id;
    $notification->message = $message;
    $notification->type = 'MakeProposal';
    $notification->status = 0;
    $notification->save();
    $optionBuilder = new OptionsBuilder();
    $optionBuilder->setTimeToLive(60 * 20);

    $notificationBuilder = new PayloadNotificationBuilder('test notification');
    $notificationBuilder->setBody($message)
      ->setSound('default');

    $dataBuilder = new PayloadDataBuilder();
    $dataBuilder->addData(['type' => 'AcceptProposal', 'message' => $message]);

    $option = $optionBuilder->build();
    $notification = $notificationBuilder->build();
    $data = $dataBuilder->build();

    // $token = "dJc9TJoykGQ:APA91bH7k4lc5CEfGlrftRrhXjHksQW3Vq8C0dR3NKm-fYtC-GSC5az3h_qs78RwfdkCAZoIEQ4nRo81jmTQ3gLpU7cQkjqc1OFGeS3Fk8RvBEHBohnbE35hR2f-S8C_4FIjayLqXD7Q";

    $downstreamResponse = FCM::sendTo($token, $option, $notification, $data);

    $downstreamResponse->numberSuccess();
    $downstreamResponse->numberFailure();
    $downstreamResponse->numberModification();

    $data = ['status' => 200, 'isSuccess' => 'true', 'contact' => $contact,  'message' => "proposal accepted"];
    return response($data, 200);
  }

  public function completeOrder(Request $request)
  {
    Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));

    $contact = Contact::findorfail($request->contact_id);
    $contact->status = 1;
    $contact->save();

    $user = User::where('id', $request->provider_id)->first();
    $payment = Paymenthistory::where('contact_id', $request->contact_id)->first();
    $bank_details = Providerbank::where('provider_id', $request->provider_id)->first();

    if ($payment->amount < 1000) {
      if ($user->stripe_id == '') {
        $create = \Stripe\Account::create([
          'type' => 'custom',
          'email' => $user->email,
          'requested_capabilities' => [
            'card_payments',
            'transfers',
          ],
        ]);

        $update = \Stripe\Account::update(
          $create->id,
          [
            "business_type" => "individual",
            "business_profile" => [
              "url" => env('APP_URL'),
            ],
            "individual" => [
              "first_name" => $user->userFirstName,
              "last_name" => $user->userLastName,
              "email" => $user->email,
              "phone" => $user->phone,
            ],
            "external_account" => [
              "object" => "bank_account",
              "country" => $bank_details->country,
              "currency" => $bank_details->currency,
              "bank_name" => $bank_details->bank_name,
              "account_holder_name" => $bank_details->account_holder_name,
              "account_holder_type" => $bank_details->account_holder_type,
              "account_number" => $bank_details->account_number
            ],
            'tos_acceptance' => [
              'date' => time(),
              'ip' => $_SERVER['REMOTE_ADDR']
            ],
          ]
        );

        $user->stripe_id = $create->id;
        $user->save();

        $transfer = \Stripe\Transfer::create([
          'amount' => $payment->amount,
          'currency' => 'GBP',
          'destination' => $create->id,
          'transfer_group' => $payment->transfer_group,
        ]);
      } else {

        $update = \Stripe\Account::update(
          $user->stripe_id,
          [
            "business_type" => "individual",
            "business_profile" => [
              "url" => env('APP_URL'),
            ],
            "individual" => [
              "first_name" => $user->userFirstName,
              "last_name" => $user->userLastName,
              "email" => $user->email,
              "phone" => $user->phone,
            ],
            "external_account" => [
              "object" => "bank_account",
              "country" => $bank_details->country,
              "currency" => $bank_details->currency,
              "bank_name" => $bank_details->bank_name,
              "account_holder_name" => $bank_details->account_holder_name,
              "account_holder_type" => $bank_details->account_holder_type,
              "account_number" => $bank_details->account_number
            ],
            'tos_acceptance' => [
              'date' => time(),
              'ip' => $_SERVER['REMOTE_ADDR']
            ],
          ]
        );

        $transfer = \Stripe\Transfer::create([
          'amount' => $payment->amount,
          'currency' => 'GBP',
          'destination' => $user->stripe_id,
          'transfer_group' => $payment->transfer_group,
        ]);
      }

      $data = ['status' => 200, 'isSuccess' => 'true', 'message' => 'Payment Transfer & Order Has Completed Successfully', 'transfer' => $transfer];
    } else {
      $data = ['status' => 200, 'isSuccess' => 'true', 'message' => 'Payment Transfer Has Not Done But Order Has Completed Successfully', 'transfer' => ''];
    }

    return response($data, 200);
  }

  public function testStripe(Request $request)
  {

    Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
    // $balance = \Stripe\Balance::retrieve();
    // print_r($balance);
    // die;

    $user = User::where('id', $request->provider_id)->first();
    $payment = Paymenthistory::where('contact_id', $request->contact_id)->first();
    if ($user->stripe_id == '') {
      $create = \Stripe\Account::create([
        'type' => 'custom',
        'email' => $user->email,
        'requested_capabilities' => [
          'card_payments',
          'transfers',
        ],
      ]);

      $update = \Stripe\Account::update(
        $create->id,
        [
          "business_type" => "individual",
          "business_profile" => [
            "url" => env('APP_URL'),
            //"mcc" => 5734
          ],
          "individual" => [
            "first_name" => $user->userFirstName,
            "last_name" => $user->userLastName,
            "email" => $user->email,
            "phone" => $user->phone,
            // "dob" => [
            //   "day" => 31,
            //   "month" => 12,
            //   "year" => 1995
            // ],
            // "address" => [
            //   "city" => "London",
            //   "line1" => "10 Downing Street",
            //   "postal_code" => "BT12 7DU",
            //   "state" => ""
            // ]
          ],
          "external_account" => [
            "object" => "bank_account",
            "country" => "FR",
            "currency" => "EUR",
            "bank_name" => "TEST STRIPE BANK",
            "account_holder_name" => 'Jane Austen',
            "account_holder_type" => 'individual',
            "account_number" => "FR89370400440532013000"
          ],
          'tos_acceptance' => [
            'date' => time(),
            'ip' => $_SERVER['REMOTE_ADDR']
          ],
        ]
      );

      $user->stripe_id = $create->id;
      $user->save();

      $transfer = \Stripe\Transfer::create([
        'amount' => $payment->amount,
        //'amount' => 1,
        'currency' => 'GBP',
        'destination' => $create->id,
        'transfer_group' => $payment->transfer_group,
      ]);
    } else {

      $update = \Stripe\Account::update(
        $user->stripe_id,
        [
          "business_type" => "individual",
          "business_profile" => [
            "url" => env('APP_URL'),
            //"mcc" => 5734
          ],
          "individual" => [
            "first_name" => $user->userFirstName,
            "last_name" => $user->userLastName,
            "email" => $user->email,
            "phone" => $user->phone,
            // "dob" => [
            //   "day" => 31,
            //   "month" => 12,
            //   "year" => 1995
            // ],
            // "address" => [
            //   "city" => "London",
            //   "line1" => "10 Downing Street",
            //   "postal_code" => "BT12 7DU",
            //   "state" => ""
            // ]
          ],
          "external_account" => [
            "object" => "bank_account",
            "country" => "FR",
            "currency" => "EUR",
            "bank_name" => "TEST STRIPE BANK",
            "account_holder_name" => 'Jane Austen',
            "account_holder_type" => 'individual',
            "account_number" => "FR89370400440532013000"
          ],
          'tos_acceptance' => [
            'date' => time(),
            'ip' => $_SERVER['REMOTE_ADDR']
          ],
        ]
      );

      // $transfer = \Stripe\Transfer::create([
      //   'amount' => $payment->amount,
      //   //'amount' => 1,
      //   'currency' => 'GBP',
      //   'destination' => $user->stripe_id,
      //   'transfer_group' => $payment->transfer_group,
      // ]);
    }

    $data = ['status' => 200, 'isSuccess' => 'true', 'message' => 'Payment Transfer Has Done Successfully'];
    return response($data, 200);
  }

  public function payment(Request $request)
  {
    $transfer_group = "phoenix_" . rand(11111, 99999);
    $contact = Contact::findorfail($request->contact_id);
    if ($contact->payment_status == 1) {
      $data = ['status' => 200, 'message' => "Payment Already Captured Before"];
      return response($data, 200);
    }
    try {
      Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
      $stripe =  Stripe\Charge::create([
        "amount" => $contact->cost,
        "currency" => "GBP",
        "source" => $request->stripeToken,
        "description" => "",
        "transfer_group" => $transfer_group
      ]);

      $payment = new Paymenthistory;
      $payment->paymentid = $stripe->id;
      $payment->contact_id = $request->contact_id;
      $payment->amount = $stripe->amount;
      $payment->balance_transaction = $stripe->balance_transaction;
      $payment->receipt_url = $stripe->receipt_url;
      $payment->transfer_group = $stripe->transfer_group;
      $payment->save();

      $contact->payment_status = 1;
      $contact->save();
      $data = ['status' => 200, 'message' => "Payment Successfully Captured"];
      return response($data, 200);
    } catch (\Exception $e) {
      $data = ['status' => 200, 'error' => $e->getMessage()];
      return response($data, 200);
    }


    $data = ['status' => 200, 'isSuccess' => 'true', 'detail' => $stripe];
    return response($data, 200);
  }
  public function editprofile(Request $request)
  {
    $user = auth()->user();
    $validator = Validator::make($request->all(), ['userEmail' => ['required', 'email', "unique:users,email,$user->id"], 'userFirstName' => 'required', 'userLastName' => 'required', 'phone' => 'required|numeric', 'image' => 'image']);
    if ($validator->fails()) {
      $error = $validator->messages();
      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $error];
      return response($data, 403);
    } else {
      $user->userFirstName = $request->userFirstName;
      $user->userLastName = $request->userLastName;
      $user->email = $request->userEmail;
      $user->phone = $request->phone;
      if ($request->image)
        $user->image = $request->image->store('files');
      $user->save();
      $data = ['status' => 200, 'isSuccess' => 'true', 'userdetail' => $user];
      return response($data, 200);
    }
  }
  public function changepassword(Request $request)
  {
    $validator = Validator::make($request->all(), ['oldpassword' => 'required', 'newpassword' => 'required']);
    if ($validator->fails()) {
      $error = $validator->messages();
      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $error];
      return response($data, 403);
    }
    if (\Illuminate\Support\Facades\Hash::check($request->oldpassword, Auth::user()->password)) {

      $user = Auth::user();
      $user->password = bcrypt($request->newpassword);
      $user->save();
      $data = ['status' => 200, 'isSuccess' => 'true', 'message' => "Password changed"];
      return response($data, 200);
    } else {
      $data = ['status' => 201, 'isSuccess' => 'false', 'message' => "Incorrect Old Password"];
      return response($data, 200);
    }
  }
  public function disconnectaccount()
  {
    $user = Auth::user();
    $user->is_active = 1;
    $user->save();
    $data = ['status' => 201, 'isSuccess' => 'true'];
    return response($data, 200);
  }
  public function deleteaccount()
  {
    $user = Auth::user();
    $user->is_active = 1;
    $user->is_delete = 1;
    $user->save();
    $data = ['status' => 201, 'isSuccess' => 'true'];
    return response($data, 200);
  }
  public function myorder()
  {
    //  $order = Contact::where('user_id',Auth::user()->id)->get();
    //
    $order =  Contact::with(
      ['user', 'provider', 'service_request.service']
    )->where('user_id', Auth::user()->id)->get();
    $data = ['status' => 201, 'orders' => $order];
    return response($data, 200);
  }
  public function providermyorder()
  {
    //$order = Contact::where('provider_id',Auth::user()->id)->get();
    //
    $order =  Contact::with(
      ['user', 'provider', 'service_request.service']
    )->where('provider_id', Auth::user()->id)->get();
    $data = ['status' => 201, 'orders' => $order];
    return response($data, 200);
  }
  public function addreview(Request $request)
  {
    $validator = Validator::make($request->all(), ['order_id' => 'required', 'review' => 'required', 'rating' => 'required']);
    if ($validator->fails()) {
      $error = $validator->messages();
      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $error];
      return response($data, 403);
    }
    $contact = Contact::findorfail($request->order_id);
    $contact->status = 1;
    $contact->save();
    $rating = new Rating;
    $rating->order_id = $request->order_id;
    $rating->review = $request->review;
    $rating->rating = $request->rating;
    $rating->rating_by = Auth::user()->id;
    $rating->rating_to = $contact->provider_id;
    $rating->save();
    $data = ['status' => 201, 'isSuccess' => 'true', 'message' => 'Order completed successfully'];
    return response($data, 200);
  }

  public function vendorreview(Request $request)
  {

    $rating = Rating::select('*')->where(['rating_to' => $request->vendor_id])->get();

    foreach ($rating as $key => $value) {
      $user = User::select('*')->where(['id' => $value->rating_by])->get();
      $value->name = $user[0]->userFirstName;
    }

    if (isset($rating) && $rating != '' && count($rating) > 0) {

      $data = ['status' => 200, 'isSuccess' => 'true', 'reviewlist' => $rating];
    } else {

      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => 'Data Not Found'];
    }

    return response($data, 200);
  }
}
