<?php

namespace App\Modules\Admin\Users;

use App\Models\AdminUser;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Hash;
use Intervention\Image\Facades\Image;
use App\Traits\MobileNumberValidatorTraits;
use App\Traits\ValidatorTraits;
use App\Traits\GoogleBucket;
use App\Jobs\Admin\ProcessSendEmailForNewAdminUser;
use App\Modules\Admin\Users\ResetPassword;
use App\Modules\RemoteStorage\GoogleBucketGateway;

class AddAdminUser
{
    use MobileNumberValidatorTraits, ValidatorTraits, GoogleBucket;
    public $googleBucket;
    private $resetPassword;

    public function __construct(GoogleBucketGateway $googleBucket)
    {
        $this->resetPassword = new ResetPassword;
        $this->googleBucket = $googleBucket;
    }

    public function saveData($payload)
    {
        $emailAddress = strtolower($payload->email_address);
        $firstName = ucfirst($payload->first_name);
        $lastName = ucfirst($payload->last_name);
        $password = Str::random(8);
        $phoneNum = "+1" . str_replace(array('-', '(', ')', ' '), '', $payload->phone_num);
        $role = $payload->role;
        $isActive = true;
        $enable2fa = 'false';
        $profilePicture = $payload->profile_picture;

        // validate query params
        $rules = array(
            'email_address' => 'required|unique:conx_users|max:191',
            'first_name' => 'required|max:50',
            'last_name' => 'required|max:50',
            'phone_num' => 'required',
            'role' => 'required',
            'enable_2fa' => 'required',
        );

        $validate = $this->validateRequest($payload, $rules);
        if ($validate) {
            return $validate;
        }

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

        if ($profilePicture != '') {
            $image_64 = $profilePicture;
            $extension = explode('/', explode(':', substr($image_64, 0, strpos($image_64, ';')))[1])[1]; // .jpg .png
            $image = explode(',', $image_64)[1];

            $filePath = $this->createUniqueImageNameAdmin($extension);
            $this->uploadBase64Image($image, $filePath, $this->googleBucket);
            $profilePicture = $filePath;
        }

        // preparing user data to be saved on database
        $userData = array(
            'email_address' => $emailAddress,
            'first_name' => $firstName,
            'last_name' => $lastName,
            'password' => Hash::make($password),
            'role' => $role,
            'is_active' => $isActive,
            'phone_num' => $phoneNum,
            'enable_2fa' => $enable2fa,
            'profile_picture' => $profilePicture,
        );

        // save user data to conx_users table
        AdminUser::create($userData);
        $this->sendLoginCredentialToEmail($emailAddress, $firstName, $lastName);
        return response()->json(['success' => 'Data added successfully.'])->setStatusCode(201);
    }

    public function sendLoginCredentialToEmail($emailAddress, $firstName, $lastName)
    {
        $emailAddress = $emailAddress;
        $token = Str::random(60);
        $this->resetPassword->savePasswordResets($emailAddress, $token);
        $userData = [
            'email_address' => $emailAddress,
            'first_name' => $firstName,
            'last_name' => $lastName,
            'reset_password_token' => $token,
        ];
        ProcessSendEmailForNewAdminUser::dispatch($emailAddress, $userData)->onQueue('sendemail')->onConnection('jobs_emails');
    }
}
