<?php

namespace App\Modules\Admin\Users;

use App\Models\AdminUser;
use App\Traits\MobileNumberValidatorTraits;
use App\Traits\ValidatorTraits;
use App\Traits\GoogleBucket;
use Illuminate\Support\Facades\DB;
use Intervention\Image\Facades\Image;
use App\Modules\RemoteStorage\GoogleBucketGateway;

class UpdateAdminUser
{
    use MobileNumberValidatorTraits, ValidatorTraits, GoogleBucket;

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

    public function updateUserDetails($payload, $id)
    {
        DB::beginTransaction();
        $emailAddress = strtolower($payload->email_address);
        $firstName = ucfirst($payload->first_name);
        $lastName = ucfirst($payload->last_name);
        $role = $payload->role;
        $phoneNum = "+1" . str_replace(array('-', '(', ')', ' '), '', $payload->phone_num);
        $profilePicture = $payload->profile_picture;

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

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

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

        if ($profilePicture != '') {
            $isBase64Profile = $payload->isBase64Profile == false || $payload->isBase64Profile == 'false'? false : true;
            if(!$isBase64Profile){
                $this->removeUploadedFile($payload->previousProfileLink, $this->googleBucket); //remove the previous link
            }

            $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,
            'role' => $role,
            'phone_num' => $phoneNum,
            'profile_picture' => $profilePicture,
        );

        // update user data to conx_users table
        $adminUserTransaction = AdminUser::whereId($id)->update($userData);

        // validation for admin with at least 1 Superadmin
        $validateSuperadminCount = $this->validateSuperadminCount();
        if ($validateSuperadminCount < 1) {
            return response()->json(['errors' => 'Admin should have at least 1 Super admin.'])->setStatusCode(201);
        }

        // if there's an error or queries don't do their job, rollback!
        if (!$adminUserTransaction) {
            DB::rollBack();
            return response()->json(['error' => 'Server error.']);
        } else {
            DB::commit();
            return response()->json(['success' => 'Data updated successfully.'])->setStatusCode(201);
        }
    }

    public function validateSuperadminCount()
    {
        $adminUser = AdminUser::where('role', 'Superadmin')->get();
        return $adminUser->count();
    }

    public function changeActiveStatus($payload, $id)
    {
        // update is_active column of conx_users table for a specific user
        $action = $payload->action;
        if ($action == 'activate') {
            $userData = array('is_active' => 'true');
            AdminUser::whereId($id)->update($userData);

        } else {
            $userData = array('is_active' => 'false');
            AdminUser::whereId($id)->update($userData);
        }
        return response()->json(['success' => 'Data updated successfully.'])->setStatusCode(201);
    }
}
