<?php

namespace App\Modules\Mobile\Worker;

use App\Traits\UserTraits;
use App\Traits\ValidatorTraits;
use App\Traits\MobileNumberValidatorTraits;
use App\Traits\GenerateCodeTraits;
use App\Jobs\Company\ProcessEmailVerificationCode;
use App\Models\Worker;
use App\Modules\SMS\SendSMSViaTwilio;
use Illuminate\Support\Facades\Auth;

class Verification 
{
    use UserTraits, ValidatorTraits, MobileNumberValidatorTraits, GenerateCodeTraits;

    public function __construct()
    {
        $this->twilio = new SendSMSViaTwilio;
        $this->userData = Auth::user();
    }

    public function verifyNewMobileAndEmaillAddress($payload)
    {
        $userId = $this->userData->id;

        $rules = array(
            'email_address' => 'required|unique:workers,email_address,' . $userId . '|max:191',
            'phone_number' => 'required',
        );
        $validate = $this->validateRequest($payload, $rules);
        if ($validate) {
            return $validate;
        }

        $recevierNumber = "+1" . str_replace(array('-', '(', ')', ' '), '', $payload->phone_number);

        $validate = $this->validatePhoneNumber($recevierNumber);
        if ($validate) {
            return $validate;
        }

        $emailGenaratedCode = strtoupper($this->get_rand_alphanumeric());
        $mobileGenaratedCode = strtoupper($this->get_rand_alphanumeric());
        $smsMessage = '[ConX] Verification Code: ' . $mobileGenaratedCode;

        $userDataForEmail = [
            'email_address' => $this->userData->email_address,
            'first_name' => $this->userData->first_name,
            'last_name' => $this->userData->last_name,
            'code' => $emailGenaratedCode,
        ];

        $emailTranscation = $this->sendEmailVerificationCode($payload->email_address, $userDataForEmail);
        $sendSMSTransaction = $this->twilio->sendSMS($recevierNumber, $smsMessage);
        $savedCodeTransaction = $this->updateAccount($this->userData->id, ['email_code' => $emailGenaratedCode, 'mobile_code' => $mobileGenaratedCode]);

        if ($emailTranscation && $sendSMSTransaction && $savedCodeTransaction) {
            return response()->json(['success' => 'We have sent a verification code to your updated email address and mobile number. Please check your inbox or spam folder to verify it.']);
        } else {
            return false;
            return response()->json(['errors' => 'Something went wrong while sending verification code. Please try again later']);
        }
    }

    public function sendEmailVerificationCode($email_address, $user_data)
    {
        return ProcessEmailVerificationCode::dispatch($email_address, $user_data)->onConnection('jobs_emails')->onQueue('sendemail');
    }

    public function updateAccount($userId, $data)
    {
        return Worker::where('id', $userId)->update($data);
    }

    public function verifyUpdatedEmailAddress($payload)
    {
        $rules = array(
            'email_address' => 'required|unique:conx_users,email_address,' . $this->userData->id . '|max:191',
        );
        $validate = $this->validateRequest($payload, $rules);
        if ($validate) {
            return $validate;
        }

        $newlyGenaratedCode = strtoupper($this->get_rand_alphanumeric());

        $userDataForEmail = [
            'email_address' => $this->userData->email_address,
            'first_name' => $this->userData->first_name,
            'last_name' => $this->userData->last_name,
            'code' => $newlyGenaratedCode,
        ];

        $newEmailAddress = strtolower($payload->email_address);

        $emailTranscation = $this->sendEmailVerificationCode($newEmailAddress, $userDataForEmail);

        $savedCodeTransaction = $this->updateAccount($this->userData->id, ['email_code' => $newlyGenaratedCode]);

        if ($emailTranscation && $savedCodeTransaction) {
            return response()->json(['success' => 'We have sent a verification code to your updated email address. Please check your inbox or spam folder to verify it.']);
        } else {
            return response()->json(['errors' => 'Something went wrong while sending verification code. Please try again later']);
        }
    }

    public function verifyUpdatedMobile($payload)
    {
        //Validate phone number
        $rules = array(
            'phone_number' => 'required',
        );
        $validate = $this->validateRequest($payload, $rules);
        if ($validate) {
            return $validate;
        }

        $validate = $this->validatePhoneNumber($payload->phone_number);
        if ($validate) {
            return $validate;
        }

        $recevierNumber = "+1" . str_replace(array('-', '(', ')', ' '), '', $payload->phone_number);
        $newlyGenaratedCode = strtoupper($this->generateRandomSixDigitCode());
        $message = '[ConX] Verification Code: ' . $newlyGenaratedCode;

        $sendSMSTransaction = $this->twilio->sendSMS($recevierNumber, $message);
        $savedCodeTransaction = $this->updateAccount($this->userData->id, ['mobile_code' => $newlyGenaratedCode]);

        if ($sendSMSTransaction && $savedCodeTransaction) {
            return response()->json(['success' => 'We have sent a verification code to your updated mobile number. Please check your inbox or spam folder to verify it']);
        } else {
            return response()->json(['errors' => 'Something went wrong while sending verification code. Please try again later']);
        }
    }

    public function verificationNewMobileAndEmaillAddress($payload)
    {
        $rules = array(
            'emailVerificationCode' => 'required',
            'email_address' => 'required|unique:workers,email_address,' . $this->userData->id . '|max:191',
        );
        $validate = $this->validateRequest($payload, $rules);
        if ($validate) {
            return $validate;
        }

        $inputtedMobileCode = $payload->mobileVerificationCode;
        $inputteEmailCode = $payload->emailVerificationCode;

        $mobileCodeValidation = $inputtedMobileCode ? false : true;
        $emailCodeValidation = false;

        if ($inputtedMobileCode) {
            $mobileCodeValidation = Worker::where('mobile_code', $inputtedMobileCode)->first();

            if (!$mobileCodeValidation) {
                return response()->json(['errors' => 'The inputted mobile verification code is invalid.']);
            }
        }

        $emailCodeValidation = Worker::where('email_code', $inputteEmailCode)->first();

        if (!$emailCodeValidation) {
            return response()->json(['errors' => 'The inputted email verification code is invalid.']);
        }


        
        return response()->json(['success' => 'Account Successfully Verified!']);
    }

    public function verificationNewMobile($payload){
        $rules = array(
            'mobileVerificationCode' => 'required',
        );
        $validate = $this->validateRequest($payload, $rules);
        if ($validate) {
            return $validate;
        }

        $inputtedMobileCode = $payload->mobileVerificationCode;
     
        $mobileCodeValidation = Worker::where('mobile_code', $inputtedMobileCode)->first();

        if (!$mobileCodeValidation) {
            return response()->json(['errors' => 'The inputted mobile verification code is invalid.']);
        }

        return response()->json(['success' => 'Account Successfully Verified!']);
    }
}