<?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\Faq;
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 {
        $cards = array();
        $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->image = $request->image;
        $user->save();
        $token = Str::random(60);
        $user->api_token = hash('sha256', $token);
        $user->save();
        $userdetail = $user->toArray();
        $userdetail['authorizationToke'] = $token;

        if (isset($user->stripe_cust_id) && $user->stripe_cust_id != '') {
          Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
          $cards = \Stripe\Customer::allSources(
            $user->stripe_cust_id,
            ['object' => 'card', 'limit' => 5]
          );
        }

        if (isset($user->lang) && $user->lang != 'fr') {
          $message = 'Login Successful';
        } else {
          $message = 'Connexion réussie';
        }

        $data = ['status' => 200, 'isSuccess' => 'true', 'message' => $message, 'userdetail' => $userdetail, 'cards' => $cards];
        return response($data, 200);
      }
    } else {
      $cards = array();
      $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->lang = "en";
      $user->image = $request->image;
      $user->save();
      $token = Str::random(60);
      $user->api_token = hash('sha256', $token);
      $user->save();
      $userdetail = $user->toArray();
      $userdetail['authorizationToke'] = $token;

      if (isset($user->stripe_cust_id) && $user->stripe_cust_id != '') {
        Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
        $cards = \Stripe\Customer::allSources(
          $user->stripe_cust_id,
          ['object' => 'card', 'limit' => 5]
        );
      }

      if (isset($user->lang) && $user->lang != 'fr') {
        $message = 'Login Successful';
      } else {
        $message = 'Connexion réussie';
      }

      $data = ['status' => 200, 'isSuccess' => 'true', 'message' => $message, 'userdetail' => $userdetail, 'cards' => $cards];
      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)) {
        $cards = array();
        $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;

        if (isset($user->lang) && $user->lang != 'fr') {
          $message = 'Login Successful';
        } else {
          $message = 'Connexion réussie';
        }

        if (isset($user->stripe_cust_id) && $user->stripe_cust_id != '') {
          Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
          $cards = \Stripe\Customer::allSources(
            $user->stripe_cust_id,
            ['object' => 'card', 'limit' => 5]
          );
        }

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

        if (isset($user->lang) && $user->lang != 'fr') {
          $message = "Login Error";
        } else {
          $message = "Erreur d'identification";
        }

        $data = ['status' => 201, 'isSuccess' => 'flase', 'message' => $message, '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) {
      if ($lang == 'en') {
        $message = "data found";
      } else {
        $message = "données trouvées";
      }
    } else {
      if ($lang == 'en') {
        $message = "no data found";
      } else {
        $message = "Aucune donnée disponible";
      }
    }
    //$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) {
      if ($lang == 'en') {
        $message = "data found";
      } else {
        $message = "données trouvées";
      }
    } else {
      if ($lang == 'en') {
        $message = "no data found";
      } else {
        $message = "Aucune donnée disponible";
      }
    }
    // 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) {
      if ($lang == 'en') {
        $message = "data found";
      } else {
        $message = "données trouvées";
      }
    } else {
      if ($lang == 'en') {
        $message = "no data found";
      } else {
        $message = "Aucune donnée disponible";
      }
    }
    $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) {
      if ($lang == 'en') {
        $message = "data found";
      } else {
        $message = "données trouvées";
      }
    } else {
      if ($lang == 'en') {
        $message = "no data found";
      } else {
        $message = "Aucune donnée disponible";
      }
    }
    $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) {
      if ($lang == 'en') {
        $message = "data found";
      } else {
        $message = "données trouvées";
      }
    } else {
      if ($lang == 'en') {
        $message = "no data found";
      } else {
        $message = "Aucune donnée disponible";
      }
    }
    //$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]['questions'] = count($val->questions);
        $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;
            if ($val->answer != '') {
              $questionSetprovider[$key]['array_answer'] = implode(",", json_decode($val->answer));
              $questionSetprovider[$key]['json_answer'] = json_decode($val->answer);
            } else {
              $questionSetprovider[$key]['array_answer'] = "";
              $questionSetprovider[$key]['json_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;
        }
      }



      if ($lang == 'en') {
        $message = "data found";
      } else {
        $message = "données trouvées";
      }
      $data = ['status' => 200, 'totalQuestionSets' => $total, 'message' => $message,  'questionSetforprovider' => $questionSetprovider, 'questionSetforusers' => $questionSetusers];
    } else {
      if ($lang == 'en') {
        $message = "no data found";
      } else {
        $message = "Aucune donnée disponible";
      }
      $data = ['status' => 201, 'total' => $total, 'message' => $message];
    }

    return response($data, 200);
  }
  public function subcategorysearch(Request $request)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    $c = Subcategory::orWhere('subcategoryName', 'like', $request->searchText . '%')
      ->orWhere('subcategoryName', 'like', '%' . $request->searchText)
      ->orWhere('subcategoryName', 'like', '%' . $request->searchText . '%')
      ->get();

    $total = $c->count();
    if ($total > 0) {
      if ($lang == 'en') {
        $message = "data found";
      } else {
        $message = "données trouvées";
      }
      $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();*/

      if ($lang == 'en') {
        $message = "no data found";
      } else {
        $message = "Aucune donnée disponible";
      }
      $data = ['status' => 201, 'total' => $total, 'message' => $message];
    }

    return response($data, 200);
  }

  public function subcategorynotification(Request $request)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    $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);

    if ($lang == 'en') {
      $message = "Data Updated Successfully";
    } else {
      $message = "Les données ont été mises à jour avec succès";
    }
    $data = ['status' => 200, 'notificationUpdate' => true, 'message' => $message];


    return response($data, 200);
  }

  public function servicesearch(Request $request)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;
    $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) {
      if ($lang == 'en') {
        $message = "data found";
      } else {
        $message = "données trouvées";
      }
    } else {
      if ($lang == 'en') {
        $message = "no data found";
      } else {
        $message = "Aucune donnée disponible";
      }
    }
    $data = ['status' => $status, 'total' => $total, 'message' => $message, 'serviceList' => $c,];
    return response($data, 200);
  }
  public function skill()
  {
    $user1 = auth()->user();
    $lang = $user1->lang;
    if ($lang == 'en') {
      $c =  Skill::orderBy('skillName', 'ASC')->groupBy('skillName')->paginate(40);
    } else {
      $c =  Skill::orderBy('fr_skillName', 'ASC')->groupBy('fr_skillName')->paginate(40);
    }
    $status = 200;
    $total = $c->total();
    $perPage = 40;
    if ($total > 0) {
      if ($lang == 'en') {
        $message = "data found";
      } else {
        $message = "données trouvées";
      }
    } else {
      if ($lang == 'en') {
        $message = "no data found";
      } else {
        $message = "Aucune donnée disponible";
      }
    }
    $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 checkService(Request $request)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    $wqServiceRequest = Servicerequest::where([
      'service_id' => $request->service_id,
      'user_id' => $request->user_id,
      'user_type' => '1'
    ])->whereNotNull('accept_proposal')->first();
    if ($wqServiceRequest === null) {
      if ($lang == 'en') {
        $message = "No Service Request Found";
      } else {
        $message = "Aucune demande de service trouvée";
      }
      $data = ['status' => true, 'message' => $message];
      return response($data, 200);
    } else {
      if ($lang == 'en') {
        $message = "You are already registered with this service";
      } else {
        $message = "Vous êtes déjà inscrit à ce service";
      }
      $data = ['status' => false, 'message' => $message];
      return response($data, 403);
    }
  }

  public function addskill(Request $request)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    $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();
      if ($lang == 'en') {
        $message = "skill added";
      } else {
        $message = "compétence ajoutée";
      }
      $data = ['status' => 200, 'message' => $message];
      return response($data, 200);
    } else {
      if ($lang == 'en') {
        $message = "Skill already exist";
      } else {
        $message = "La compétence existe déjà";
      }
      $data = ['status' => 201, 'message' => $message];
      return response($data, 403);
    }
  }

  public function removeskill(Request $request)
  {
    $wqarr = array();
    $user1 = auth()->user();
    $lang = $user1->lang;

    $skill = $request->skill_id;
    $user_id = Auth::user()->id;

    $wqSkill = Skill::where([
      'id' => $skill,
    ])->first();
    $service = $wqSkill->service_id;

    $contacts = Contact::where([
      'provider_id' => $user_id,
    ])->get();
    if (count($contacts) > 0) {
      foreach ($contacts as $key => $val) {
        $servicereq = Servicerequest::where([
          'id' => $val->servicerequest_id,
        ])->first();
        array_push($wqarr, $servicereq->service_id);
      }
    }
    $wqarr = array_unique($wqarr);

    if (in_array($service, $wqarr)) {
      if ($lang == 'en') {
        $message = "Oops! this skill has ongoing services";
      } else {
        $message = "Oops! cette compétence a des services continus";
      }
      $data = ['status' => 400, 'message' => $message];
      return response($data, 400);
    } else {
      Userskill::where(['user_id' => $user_id, 'skill_id' => $skill])->delete();
      if ($lang == 'en') {
        $message = "skill deleted successfully";
      } else {
        $message = "compétence supprimée avec succès";
      }
      $data = ['status' => 200, 'message' => $message];
      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);

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

    $status = 200;
    $total = $c->total();
    $perPage = 40;
    if ($total > 0) {
      if ($lang == 'en') {
        $message = "data found";
      } else {
        $message = "données trouvées";
      }
    } else {
      if ($lang == 'en') {
        $message = "no data found";
      } else {
        $message = "Aucune donnée disponible";
      }
    }
    //$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;
        if (isset($val->skill) && $val->skill != "") {
          $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!');
      });

      $lang = $user->lang;
      if ($lang == 'en') {
        $message = "an email sent to registered mail";
      } else {
        $message = "un e-mail envoyé par courrier recommandé";
      }

      $data = ['status' => 200, 'isSuccess' => 'true', 'message' => $message];
      return response($data, 200);
    } else {
      $data = ['status' => 201, 'isSuccess' => 'false', 'message' => 'email not found'];
      return response($data, 200);
    }
  }

  public function faqlist(Request $request)
  {
    $lang = $request->header('X-localization');
    $result = array();
    $faqs = Faq::orderBy('id', 'DESC')->get();

    if (count($faqs) > 0) {
      foreach ($faqs as $key => $val) {
        if ($lang == 'en') {
          $result[$key]['question'] = $val->question;
          $result[$key]['answer'] = $val->answer;
        } else {
          $result[$key]['question'] = $val->fr_question;
          $result[$key]['answer'] = $val->fr_answer;
        }
      }
    }

    $data = ['status' => 200, 'faqs' => $result];
    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;
      $privacy = $intro->privacy;
      $terms = $intro->terms;
      $message = "Introduction Details";
    } else {
      $introductionText = $intro->fr_text;
      $privacy = $intro->fr_privacy;
      $terms = $intro->fr_terms;
      $message = "Détails d'introduction";
    }

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

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

  public function contact()
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    $contact = Contact::where(['user_id' => auth()->user()->id])->orderBy('id', 'DESC')->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]['contactPhone'] = $user->phone;
      $us[$k]['contactImage'] = $user->image;
      $us[$k]['contactTotalRating'] = $user->totalrating();
      $us[$k]['contactRating'] = $user->userrating();
      $us[$k]['servicerequest_id'] = $u->servicerequest_id;

      $wqproviderservice = Servicerequest::where('id', $u->servicerequest_id)->first();
      $us[$k]['service_id'] = $wqproviderservice->service_id;
    }
    if ($lang == 'en') {
      $message = "data found";
    } else {
      $message = "données trouvées";
    }
    $data = ['status' => 201, 'contactList' => $us, 'message' => $message];
    return response($data, 200);
  }

  public function contactdetails(Request $request)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    $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['contactPhone'] = $u->phone;
      $us['contactTotalRating'] = $u->totalrating();
      $us['contactRating'] = $u->userrating();

      if ($lang == 'en') {
        $message = "data found";
      } else {
        $message = "données trouvées";
      }

      $data = ['status' => 201, 'contactList' => $us, 'message' => $message];
      return response($data, 200);
    }
  }
  public function validatepostalcode(Request $request)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    $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") {
      if ($lang == 'en') {
        $message = "Postal code verified";
      } else {
        $message = "Code postal vérifié";
      }
      $data = ['status' => 200, 'isVerified' => true, 'message' => $message];
      return response($data, 200);
    } else {
      if ($lang == 'en') {
        $message = "Postal code not found";
      } else {
        $message = "Code postal introuvable";
      }
      $data = ['status' => 201, 'isVerified' => false, 'message' => $message];
      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, $type)
  {
    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, "type" => $type];

    $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, $type)
  {
    //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, "type" => $type];

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

    $headers = [
      'Authorization: key=AIzaSyAP5ObweLIeVOWCZTUjiebFsNaMvtePGfI',
      '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)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;
    $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);
          }
          $userarray = array_unique($userarray);
        }

        // 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) {
          $tokens[$key1] = User::find($value1)->userFCMToken;
          if (User::find($value1)->userFCMToken != '') {
            $token = User::find($value1)->userFCMToken;
            if (User::find($value1)->lang == 'en') {
              $subject = "New Service";
              $message = "New Service Posted";
            } else {
              $subject = "Nouveau service";
              $message = "Nouveau service publié";
            }
            $this->sendSinglePushNotifications($token, $subject, $message, 'NewService');
            $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, 'NewService');
      // $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

      if ($lang == 'en') {
        $wqmessage = "Your request has been sent";
      } else {
        $wqmessage = "Votre demande à été envoyé";
      }

      $data = ['status' => 200, 'isServiceFound' => true, 'message' => $wqmessage];
      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 updatebulknotificationstatus()
  {
    // $notifications = $request->notifications;
    // foreach ($notifications as $notification) {
    $user = auth()->user();
    Notification::where('user_id',  $user->id)->update(['status' => 1]);
    //}
    return ['status' => 200, 'isNotificationUpdated' => true];
  }

  public function rejectmypostedservice($id)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;
    if ($lang == 'en') {
      $message = "Data Updated Successfully";
    } else {
      $message = "Les données ont été mises à jour avec succès";
    }
    Servicerequest::where('id', $id)->update(['is_active' => '0']);
    return ['status' => 200, 'message' => $message];
  }

  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) {
      if ($lang == 'en') {
        $message = "data found";
      } else {
        $message = "données trouvées";
      }
    } else {
      if ($lang == 'en') {
        $message = "no data found";
      } else {
        $message = "Aucune donnée disponible";
      }
    }
    //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;
    $user1 = auth()->user();
    $lang = $user1->lang;
    $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) {
      if ($lang == 'en') {
        $message = "data found";
      } else {
        $message = "données trouvées";
      }
    } else {
      if ($lang == 'en') {
        $message = "no data found";
      } else {
        $message = "Aucune donnée disponible";
      }
    }
    //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;
          $q['type'] = Proposal::where(['servicerequest_id' => $d->id, 'user_id' => Auth::user()->id])->first()->type;
        }
        $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(Request $request, Servicerequest $servicerequest)
  {
    $lang = $request->header('X-localization');
    $wqarr = $questions = array();
    $service = $servicerequest->service->toArray();

    $wqarr['id'] = $service['id'];
    $wqarr['category_id'] = $service['category_id'];
    $wqarr['subcategory_id'] = $service['subcategory_id'];
    if ($lang == 'en') {
      $wqarr['serviceName'] = $service['serviceName'];
      $wqarr['serviceDescription'] = $service['serviceDescription'];
      $wqarr['serviceAddress'] = $service['serviceAddress'];
    } else {
      $wqarr['serviceName'] = $service['fr_serviceName'];
      $wqarr['serviceDescription'] = $service['fr_serviceDescription'];
      $wqarr['serviceAddress'] = $service['fr_serviceAddress'];
    }
    $wqarr['created_at'] = date('Y-m-d h:i:s a', strtotime($service['created_at']));
    $wqarr['updated_at'] = date('Y-m-d h:i:s a', strtotime($service['updated_at']));

    foreach ($servicerequest->answers as $k => $qus) {
      if ($qus) {
        $q = $qus->toArray();
        if ($qus->question) {
          if ($lang == 'en') {
            $q['question'] = $qus->question->question;
            $q['array_answer'] = implode(",", json_decode($qus->question->answer));
            $q['json_answer'] = json_decode($qus->question->answer);
          } else {
            $q['question'] = $qus->question->fr_question;
            $q['array_answer'] = implode(",", json_decode($qus->question->fr_answer));
            $q['json_answer'] = json_decode($qus->question->fr_answer);
          }
          $questions[$k] = $q;
        }
      }
    }

    $data = ['status' => 200, 'service' => $wqarr, 'questionset' => $questions, 'image' => $servicerequest->image, 'latlong' => $servicerequest->latlong, 'created_at' => date('Y-m-d h:i:s a', strtotime($servicerequest->created_at))];
    return response($data, 200);

    // $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)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    $validator = Validator::make($request->all(), ['servicerequestid' => 'required', 'type' => 'required', 'proposalamount' => 'required']);
    if ($validator->fails()) {
      $error = $validator->messages();
      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $error];
      return response($data, 403);
    }

    $count = Providerbank::where('provider_id', Auth::user()->id)->count();
    if ($count > 0) {

      $proposal = new Proposal;
      $proposal->servicerequest_id = $request->servicerequestid;
      $proposal->type = $request->type;
      $proposal->amount = $request->proposalamount;
      $proposal->user_id = Auth::user()->id;
      $proposal->save();
      //
      $servicereq = Servicerequest::find($request->servicerequestid);
      $user = User::find($servicereq->user_id);

      if ($user->lang == 'en') {
        $subject = "New Proposal";
        $message = "New Proposal received from " . Auth::user()->userFirstName . " Amount " . $proposal->amount;
      } else {
        $subject = "Nouvelle proposition";
        $message = "Nouvelle proposition reçue de " . Auth::user()->userFirstName . " montante " . $proposal->amount;
      }

      if ($user->userFCMToken != '') {
        $token = $user->userFCMToken;
        $this->sendSinglePushNotifications($token, $subject, $message, 'MakeProposal');
        $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();

      //
      if ($lang == 'en') {
        $wqmessage = "proposal added";
      } else {
        $wqmessage = "proposition ajoutée";
      }
    } else {
      if ($lang == 'en') {
        $wqmessage = "Please add your bank details";
      } else {
        $wqmessage = "Veuillez ajouter vos coordonnées bancaires";
      }
    }

    $data = ['status' => 200, 'message' => $wqmessage,];
    return response($data, 200);
  }

  public function getproposal(Servicerequest $servicerequest)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    $c =  Proposal::with('user')->where(['servicerequest_id' => $servicerequest->id, 'status' => 0])->paginate(40);
    $status = 200;
    $total = $c->total();
    $perPage = 40;
    if ($total > 0) {
      if ($lang == 'en') {
        $message = "data found";
      } else {
        $message = "données trouvées";
      }
    } else {
      if ($lang == 'en') {
        $message = "no data found";
      } else {
        $message = "Aucune donnée disponible";
      }
    }
    //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]['proposalType'] = $i->type;
      $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()
  {
    $cards = array();
    $user = auth()->user();
    $profileDetails = Auth::user();
    $profileDetails = $profileDetails->toArray();

    if (isset($user->stripe_cust_id) && $user->stripe_cust_id != '') {
      Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
      $cards = \Stripe\Customer::allSources(
        $user->stripe_cust_id,
        ['object' => 'card', 'limit' => 5]
      );
    }
    $profileDetails['cards'] = $cards;

    //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 deleteStripeCard(Request $request)
  {
    $user = auth()->user();
    $lang = $user->lang;
    Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));

    if (isset($user->stripe_cust_id) && $user->stripe_cust_id != '') {

      $deleteCard = \Stripe\Customer::deleteSource(
        $user->stripe_cust_id,
        $request->card_id,
        []
      );

      $cards = \Stripe\Customer::allSources(
        $user->stripe_cust_id,
        ['object' => 'card', 'limit' => 5]
      );
    }

    if ($lang == 'en') {
      $message = "Your card has deleted successfully";
    } else {
      $message = "Votre carte a bien été supprimée";
    }

    $data = ['status' => 200, 'message' => $message, 'cards' => $cards];
    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['latlong'] = $servicerequest->latlong;
    $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 bankDetails()
  {
    $providerbank = Providerbank::where('provider_id', Auth::user()->id)->first();
    return ['status' => 200, 'details' => $providerbank];
  }

  public function providerBankDetails(Request $request)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;
    $wqphone = $user1->phone;

    $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;

        $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();

        if ($lang == 'en') {
          $message = "Bank Details has added successfully";
        } else {
          $message = "Les détails bancaires ont été ajoutés avec succès";
        }
      } else {
        if (isset($request->otp)) {
          $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();

          if ($lang == 'en') {
            $message = "Bank Details has updated successfully";
          } else {
            $message = "Les détails bancaires ont été mis à jour avec succès";
          }
        } else {
          $otp = rand(1111, 9999);
          if ($wqphone != '') {
            $this->sendOTPsms($wqphone, $otp);
            if ($lang == 'en') {
              $message = "OTP has sent to your registered mobile no";
            } else {
              $message = "OTP a envoyé à votre mobile enregistré non";
            }
            $data = ['status' => 200, 'isSuccess' => 'true', 'otp' => $otp, 'message' => $message,];
            return response($data, 200);
          } else {
            if ($lang == 'en') {
              $message = "Please add your phone no";
            } else {
              $message = "Veuillez ajouter votre téléphone non";
            }
            $data = ['status' => 400, 'isSuccess' => 'false', 'message' => $message,];
            return response($data, 400);
          }
        }
      }

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

  public function sendOTPsms($phone, $otp)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    if ($lang == 'en') {
      $curl = curl_init();

      curl_setopt_array($curl, array(
        CURLOPT_URL => "http://2factor.in/API/V1/b89ef14e-98fe-11ea-9fa5-0200cd936042/SMS/+" . $phone . "/" . $otp . "/Phoenix OTP",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_POSTFIELDS => "",
        CURLOPT_HTTPHEADER => array(
          "content-type: application/x-www-form-urlencoded"
        ),
      ));

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

      curl_close($curl);
    } else {

      $curl = curl_init();

      curl_setopt_array($curl, array(
        CURLOPT_URL => "http://2factor.in/API/V1/b89ef14e-98fe-11ea-9fa5-0200cd936042/SMS/+" . $phone . "/" . $otp . "/Phoenix_French_OTP",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_POSTFIELDS => "",
        CURLOPT_HTTPHEADER => array(
          "content-type: application/x-www-form-urlencoded"
        ),
      ));

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

      curl_close($curl);
    }
  }

  public function addaddress(Request $request)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    $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();
    if ($lang == 'en') {
      $message = "Address has added to profile";
    } else {
      $message = "L'adresse a été ajoutée au profil";
    }
    $data = ['status' => 200, 'isSuccess' => 'true', 'message' => $message, 'address' => $address];
    return response($data, 200);
  }

  public function addresslist()
  {
    //$address = User::find(auth()->user()->id)->address;
    $address = Address::where('user_id', Auth::user()->id)->orderBy('created_at', 'DESC')->get();
    $data = ['status' => 200, 'isSuccess' => 'true', 'address' => $address];
    return response($data, 200);
  }

  public function acceptproposal(Request $request)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    $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();

    $proposal->status = 1;
    $proposal->save();

    $contact = new Contact;
    $contact->servicerequest_id = $servicerequest_id;
    $contact->user_id = $user_id;
    $contact->provider_id = $provider_id;
    $contact->type = $proposal->type;
    $contact->cost = $cost;
    $contact->save();

    $token = User::find($provider_id)->userFCMToken;
    if (User::find($provider_id)->lang == 'en') {
      $subject = "Accept Proposal";
      $message = "Your Proposal accepted";
    } else {
      $subject = "Accepter la proposition";
      $message = "Votre proposition acceptée";
    }

    if ($token != '') {
      $this->sendSinglePushNotifications($token, $subject, $message, 'AcceptProposal');
      $notification = new Notification;
      $notification->user_id = $provider_id;
      $notification->message = $message;
      $notification->type = 'AcceptProposal';
      $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();
    if ($lang == 'en') {
      $wqmessage = "proposal accepted";
    } else {
      $wqmessage = "proposition acceptée";
    }

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

  public function completeOrder(Request $request)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
    $currency = "";
    $contact = Contact::findorfail($request->contact_id);
    if ($contact->type == 1) {
      $currency = "USD";
    } elseif ($contact->type == 2) {
      $currency = "EUR";
    } elseif ($contact->type == 3) {
      $currency = "GBP";
    } else {
      $currency = "USD";
    }

    $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' => $currency,
          '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' => $currency,
          'destination' => $user->stripe_id,
          'transfer_group' => $payment->transfer_group,
        ]);
      }

      if ($lang == 'en') {
        $message = "Payment Transfer & Order Has Completed Successfully";
      } else {
        $message = "Transfert de paiement et commande terminés avec succès";
      }

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

      if ($lang == 'en') {
        $message = "Payment Transfer Has Not Done But Order Has Completed Successfully";
      } else {
        $message = "Le transfert de paiement n'a pas été effectué mais la commande s'est terminée avec succès";
      }

      $data = ['status' => 200, 'isSuccess' => 'true', 'message' => $message, '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)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;
    $transfer_group = "phoenix_" . rand(11111, 99999);
    $contact = Contact::findorfail($request->contact_id);

    if ($contact->payment_status == 1) {
      if ($lang == 'en') {
        $message = "Payment Already Captured Before";
      } else {
        $message = "Paiement déjà capté avant";
      }
      $data = ['status' => 200, 'message' => $message];
      return response($data, 200);
    }
    try {
      Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));

      if ($user1->stripe_cust_id == '') {
        $customer = \Stripe\Customer::create([
          'source' => $request->stripeToken,
          'email' => $user1->email,
        ]);
        $cust_id = $customer->id;

        $user1->stripe_cust_id = $cust_id;
        $user1->save();
      } else {
        $cust_id = $user1->stripe_cust_id;
        $stripe_card_update = \Stripe\Customer::update($cust_id, [
          'source' => $request->stripeToken,
        ]);
      }

      if (isset($cust_id) && $cust_id != '') {
        $stripe = \Stripe\Charge::create([
          'amount' => $contact->cost,
          'currency' => 'GBP',
          'customer' => $cust_id,
          'source' => $request->stripeToken,
          "transfer_group" => $transfer_group
        ]);
      }

      // $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();

      $token = User::find($contact->provider_id)->userFCMToken;
      if (User::find($contact->provider_id)->lang == 'en') {
        $wqsubject = "Service Accept";
        $wqmessage = "Your service has been accepted";
      } else {
        $wqsubject = "Service accepté";
        $wqmessage = "Votre service a été accepté";
      }

      if ($token != '') {
        $this->sendSinglePushNotifications($token, $wqsubject, $wqmessage, 'AcceptService');
      }


      if ($lang == 'en') {
        $message = "Payment Successfully Done";
      } else {
        $message = "Paiement effectué avec succès";
      }
      $data = ['status' => 200, 'message' => $message];
      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 languageChange(Request $request)
  {
    $user = auth()->user();
    $user->lang = $request->lang;
    $user->save();
    $data = ['status' => 200, 'isSuccess' => 'true', 'userdetail' => $user];
    return response($data, 200);
  }

  public function editprofile(Request $request)
  {
    $user = auth()->user();
    $otp = rand(1111, 9999);
    $validator = Validator::make($request->all(), ['userEmail' => ['required', 'email', "unique:users,email,$user->id"], 'userFirstName' => 'required', 'userLastName' => 'required', 'image' => 'image']);
    if ($validator->fails()) {
      $error = $validator->messages();
      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $error];
      return response($data, 403);
    } else {
      if ($request->is_changed == 1) {
        $this->sendOTPsms($request->phone, $otp);
        $data = ['status' => 200, 'isSuccess' => 'true', 'otp' => $otp];

        return response($data, 200);
      } 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)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    $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();
      if ($lang == 'en') {
        $message = "Password has changed successfully";
      } else {
        $message = "Le mot de passe a changé avec succès";
      }
      $data = ['status' => 200, 'isSuccess' => 'true', 'message' => $message];
      return response($data, 200);
    } else {
      if ($lang == 'en') {
        $message = "Incorrect Old Password";
      } else {
        $message = "Ancien mot de passe incorrect";
      }
      $data = ['status' => 201, 'isSuccess' => 'false', 'message' => $message];
      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)->orderBy('created_at', 'DESC')->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)->orderBy('created_at', 'DESC')->get();
    $data = ['status' => 201, 'orders' => $order];
    return response($data, 200);
  }
  public function addreview(Request $request)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;

    $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();
    if ($lang == 'en') {
      $message = "Order completed successfully";
    } else {
      $message = "Commande terminée avec succès";
    }
    $data = ['status' => 201, 'isSuccess' => 'true', 'message' => $message];
    return response($data, 200);
  }

  public function vendorreview(Request $request)
  {
    $user1 = auth()->user();
    $lang = $user1->lang;
    $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 {
      if ($lang == 'en') {
        $message = "no data found";
      } else {
        $message = "Aucune donnée disponible";
      }
      $data = ['status' => 201, 'isSuccess' => 'false', 'error' => $message];
    }

    return response($data, 200);
  }
}
