<?php

namespace Shm\ShmBlueprints\Auth;

use Shm\ShmDB\mDB;
use Shm\Shm;
use Shm\ShmAuth\Auth;
use Shm\ShmRPC\ShmRPC;
use Shm\ShmUtils\I18n;
use Shm\ShmUtils\Response;
use Shm\ShmUtils\ShmDoctor\Utils\StructureHelper;

class ShmQRPassAuth extends ShmAuthBase
{




    public function make(): array
    {

        /**
         * Тут логика что авторизованный пользователь создает QR код
         * через который можно войти на другом устройстве
         */


        return [
            'type' => Shm::structure([
                'qrCode' => Shm::string(),
                'token' => Shm::string(),
            ]),
            'description' => 'Авторизация через QR пароль',
            'args' => Shm::structure([

                "qrCode" => Shm::nonNull(Shm::string()),
                "deviceInfo" => $this->deviceInfoStructure()

            ]),
            'resolve' => function ($root, $args) {



                $qrCode = $args['qrCode'] ?? null;

                //Создание qrCode
                if (!$qrCode) {

                    //Проверяка что есть авторизованный пользователь
                    Auth::authenticateOrThrow();

                    //Проверяем что текущая коллекция есть в _authStructures

                    $findAuthStructure = null;

                    foreach ($this->_authStructures as $authStructureItem) {

                        if ($authStructureItem->collection == Auth::getAuthCollection()) {
                            $findAuthStructure = $authStructureItem;
                            break;
                        }
                    }
                    if (!$findAuthStructure) {
                        ShmRPC::error(I18n::get('access_denied'));
                    }


                    $newQrCode = hash("sha512", time() . bin2hex(openssl_random_pseudo_bytes(64)));

                    //Время действия кода 60 секунд

                    mDB::collection("_qr_pass_codes")->insertOne([
                        'qrCode' => $newQrCode,
                        'created_at' => time(),
                        'owner' => Auth::getAuthID(),
                        'ownerCollection' => Auth::getAuthCollection(),

                        'ip' => $_SERVER['REMOTE_ADDR'] ?? null,

                        //До какого времени действует qrCode
                        'expires_at' => time() + 60,
                    ]);

                    return [
                        'qrCode' => $newQrCode,
                    ];
                } else {


                    //Проверяем что нет авторизации
                    if (Auth::isAuthenticated()) {
                        Response::validation(I18n::get('auth_already_authenticated'));
                    }

                    //Тут уже делаем авторизацию по QR коду

                    //Ищем qrCode в базе данных
                    $findQrCode = mDB::collection("_qr_pass_codes")->findOne([
                        'qrCode' => $qrCode,
                        'expires_at' => ['$gt' => time()],
                    ]);

                    if (!$findQrCode) {
                        Response::validation(I18n::get('auth_qr_code_not_found'));
                    }

                    $owner = $findQrCode->owner;
                    $ownerCollection = $findQrCode->ownerCollection;

                    $userStructure = StructureHelper::getStructureByCollection($ownerCollection);

                    if (!$userStructure) {
                        Response::validation(I18n::get('auth_qr_code_not_found'));
                    }



                    return  [
                        'token' =>   $this->authToken($userStructure, $owner, $args)
                    ];
                }
            }
        ];
    }
}