<?php

namespace App\Http\Controllers\Api\v1\Auth;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Api\BaseController as BaseController;
use App\Models\User;
use App\Models\UserInfo;
use App\Models\Services;
use App\Models\Device;
use Validator;
use Exception;

class AuthController extends Controller
{

  
    protected $baseController;

    public function __construct(BaseController $baseController)
    {
        $this->baseController = $baseController;
    }

    public function register(Request $request)
    {
        $inputs = $request->all();
        $messageArr['input'] = $inputs;
        $status_code = 0;
        $success = []; 
        $successMsg=false;

    // dd($inputs);
        $customMessages = [
                'email.required' => 'Please enter email',
                'email.unique' => 'Sorry!! Email is already registered',
                'email.email' => 'Incorrect email format',
                'password.required' => 'Please enter password',
                'password.min' => 'Password must be at least 6 characters',
                'name.required' => 'Please enter your name',
                //'device_type.required' => 'Please enter device type'               
            ];
        $validator  =  Validator::make($inputs,[
            'name' => 'required|min:3',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:6',
            'confirm_password' => 'required|same:password',
            //'fcm_token'=>'required',
            //'device_type'=>'required',
            //'device_name'=>'required',
            //'os_ver'=>'required',
            'language'=>'required',
        ],$customMessages);
        
        if($validator->passes()){

        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password),
            'email_verified_at'=>date('Y-m-d H:i:s')
        ]);
         $token = $user->createToken('TutsForWeb')->accessToken;
         $user_id=$user->id;
        if(!empty($user->id) && !empty($token)){
            $languageSave =new UserInfo;
            $languageSave->user_id=$user->id;
            $languageSave->language=$request->language;
            $languageSave->save();
           $UserInfo =new Device;
           $UserInfo->user_id=$user->id;
           $UserInfo->fcm_token=$request->fcm_token;
           $UserInfo->device_type=$request->device_type;
           $UserInfo->device_name=$request->device_name;
           $UserInfo->os_ver=$request->os_ver;
           
           $UserInfo->save();
           //$UserInfo->user_id=$user->id;
          // $user->sendEmailVerificationNotification();
          }
            $successMsg=true;
            $status_code = 1;
            $success['user_token'] = $token;
            $success['name'] =$user->name;
            $success['email'] =$user->email;

            $userInfo=Device::where('user_id',$user_id)->get();
             
            $success['device_name'] =!empty($userInfo[0]['device_name']) ? ucfirst($userInfo[0]['device_name']) :"" ;
            $success['device_type'] = !empty($userInfo[0]['device_type']) ? ucfirst($userInfo[0]['device_type']) :"" ;
            $success['os_ver'] = !empty($userInfo[0]['os_ver']) ? $userInfo[0]['os_ver'] :"" ;
            $success['language'] =!empty($userInfo[0]['language']) ? $userInfo[0]['language'] :"";

            $userService=Services::where('user_id',$user_id)->get();
            $success['serviceType'] =array(
                'fire_brigade'=>!empty($userService[0]['fire_brigade']) ? $userService[0]['fire_brigade'] :"" ,
                'ambulance'=>!empty($userService[0]['ambulance']) ? $userService[0]['ambulance'] :"" ,
                'police_station'=>!empty($userService[0]['police_station']) ? $userService[0]['police_station'] :"",
                'sos'=>array(!empty($userService[0]['sos_no1']) ? $userService[0]['sos_no1'] :"",!empty($userService[0]['sos_no2']) ? $userService[0]['sos_no2'] :"",!empty($userService[0]['sos_no3']) ? $userService[0]['sos_no3'] :"",!empty($userService[0]['sos_no4']) ? $userService[0]['sos_no4'] :"")); 
        
           return $this->baseController->sendResponse($status_code, $successMsg,$success,'Success fully registered', 200, $messageArr);
          }else{
           //$error=$validator->messages();
           
           return $this->baseController->sendResponse($status_code, $successMsg,$success,$validator->messages()->first(), 200, $messageArr);
       }
    }
 

    public function login(Request $request)
    { 
      $inputs = $request->all();
      $messageArr['input'] = $inputs;
      $status_code = 0;
      $success = []; 
      $successMsg=false;
      try{ 
        $messages = [
          'email.required' => 'Please enter email',
          'email.unique' => 'Email already exist',
          'email.email' => 'Incorrect email format',
          'password.required' => 'Please enter password',
          'password.min' => 'Password must be at least 6 characters',                
//'device_type.required' => 'Please enter device type'               
        ]; 
        $validator = Validator::make($inputs,[
          'email' => 'required|email',
          "password" => 'required|string|min:6',

        ],$messages);

        if($validator->passes()){

          if(!User::where('email',$request->email)->exists()){

            return $this->baseController->sendResponse($status_code, $successMsg,$success,"Email doesn't exist", 200, $messageArr);

          }
          $credentials = [
            'email' => $request->email,
            'password' => $request->password
          ];
          if(auth()->attempt($credentials)){

            $successMsg=true;
            $status_code = 1;
            $token = auth()->user()->createToken('TutsForWeb')->accessToken;
            $success['user_token'] = $token;
            $success['name'] =auth()->user()->name;
            $success['email'] =auth()->user()->email;

            $this->device(auth()->user()->id,$request->fcm_token,$request->device_type,$request->device_name,$request->os_ver);

            $userInfo=Device::where('user_id',auth()->user()->id)->where('device_type',$request->device_type)->get();
            $success['fcm_token'] = !empty($userInfo[0]['fcm_token']) ? $userInfo[0]['fcm_token'] : "" ;
            $success['device_name'] = !empty($userInfo[0]['device_name']) ? ucfirst($userInfo[0]['device_name']) : "" ;
            $success['device_type'] = !empty($userInfo[0]['device_type']) ? ucfirst($userInfo[0]['device_type']) : "" ;
            $success['os_ver'] = !empty($userInfo[0]['os_ver']) ? $userInfo[0]['os_ver'] : "" ;

            $language=UserInfo::where('user_id',auth()->user()->id)->get(); 
            $success['language'] =!empty($language[0]['language']) ? $language[0]['language'] : "";

            $userService=Services::where('user_id',auth()->user()->id)->get();
            $success['serviceType'] =array(
              'fire_brigade'=>!empty($userService[0]['fire_brigade']) ? $userService[0]['fire_brigade'] : "" ,
              'ambulance'=>!empty($userService[0]['ambulance']) ? $userService[0]['ambulance'] : "" ,
              'police_station'=>!empty($userService[0]['police_station']) ? $userService[0]['police_station'] : "",
              'sos'=>array(!empty($userService[0]['sos_no1']) ? $userService[0]['sos_no1'] : "",!empty($userService[0]['sos_no2']) ? $userService[0]['sos_no2'] : "",!empty($userService[0]['sos_no3']) ? $userService[0]['sos_no3'] : "",!empty($userService[0]['sos_no4']) ? $userService[0]['sos_no4'] : ""));


            return $this->baseController->sendResponse($status_code, $successMsg,$success,'success', 200, $messageArr);
          }else{

            return $this->baseController->sendResponse($status_code, $successMsg,$success,"Incorrect password", 200, $messageArr);
          }

        }else{
          return $this->baseController->sendResponse($status_code, $successMsg,$success,$validator->messages()->first(), 200, $messageArr);
        }

      }catch (Exception $e){         
        return $this->baseController->sendResponse(0,false,[],$e->getMessage(), 200, $messageArr??[]);
      }


  }
    public function details()
    {
        return response()->json(['user' => auth()->user()], 200);
    }

    public function device($user_id,$fcm_token,$device_type,$device_name,$os_ver){
        if(Device::where('user_id','=',$user_id)->where('device_type',$device_type)->exists()){
        Device::where('user_id',$user_id)->where('device_type',$device_type)->Update(['fcm_token'=>$fcm_token,'device_name'=>$device_name,'os_ver'=>$os_ver]);

        }else{
           $device =new Device;
           $device->user_id=$user_id;
           $device->fcm_token=$fcm_token;
           $device->device_type=ucfirst($device_type);
           $device->device_name=ucfirst($device_name);
           $device->os_ver=$os_ver;
           $device->save();
        }

    }
}
