<?php

namespace App\Modules\Company\Account;

use App\Models\Worker;
use App\Models\CompanyUser;
use App\Models\Company;
use Carbon\Carbon;
use Illuminate\Support\Facades\Auth;
use App\Modules\SMS\SendSMSViaTwilio;

use App\Traits\GenerateCodeTraits;
use App\Traits\MobileNumberValidatorTraits;
use App\Traits\SendSMSTraits;
use App\Traits\ValidatorTraits;
use App\Traits\CreateUserActionTraits;

class Account{

    use ValidatorTraits, MobileNumberValidatorTraits, SendSMSTraits, GenerateCodeTraits, CreateUserActionTraits;

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

    public function verifyEmail($payload){
        $code = $payload->code;
        $isExisting = $this->fetchWorkerUsingCode($code);
        
        if ($isExisting) {
           
            $updateWorkerTransaction = $this->verifiedWorkerEmai($isExisting->worker_id);
            $updateCompanyTransaction = $this->verifiedCompanyEmail($isExisting->company_id);

            if($updateWorkerTransaction && $updateCompanyTransaction){
                return ['success' => true];
            }

            return ['success' => false];
        }
        return ['success' => false];

    }   

    public function fetchWorkerUsingCode($code){
        return Worker::select(
            'workers.id as worker_id', 
            'company_users.company_id')
        ->join('company_users', 'company_users.worker_id', 'workers.id')
        ->where('workers.email_verification_code', $code)
        ->first();
    }

    public function verifiedWorkerEmai($workerID){
        return Worker::where('id', $workerID)->update(['email_verification_code' => null, 'email_verified_at' => Carbon::now()]);
    }

    public function verifiedCompanyEmail($companyID){
        return Company::where('id', $companyID)->update(['date_email_verified' => Carbon::now()]);
    }

    public function disableTwoFactor()
    {
        $updateTransaction = $this->updateAccount($this->userData->id, ['enable_2fa' => 'false']);

        if ($updateTransaction) {
            return response()->json(['success' => 'Two Factor Authentication Successfully Disabled']);
        } else {
            return response()->json(['errors' => 'Something went wrong while disabling your two factor authentication. Please try again later']);
        }
    }

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

    public function check2faStatus(){
        return $this->userData;
    }

    public function verifyCurrentMobile()
    {
        $recevierNumber = $this->userData->phone_num;
        //Validate the saved number if valid
        $validate = $this->validatePhoneNumber($recevierNumber);
        if ($validate) {
            return $validate;
        }

        $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(['error' => 'Something went wrong while sending verification code. Please try again later']);
        }
    }

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

        $inputtedMobileCode = $payload->mobile_code;

        $emailCodeValidation = Worker::where('mobile_code', $inputtedMobileCode)->update(['enable_2fa' => 'true', 'mobile_code' => null]);

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

}