<?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 ShmQRTokenAuth extends ShmAuthBase
{




    public function make(): array
    {

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


        return [
            'type' => Shm::structure([

                'qrCode' => Shm::string(),
                'token' => Shm::string(),


                //qrCode активирован
                'activated' => Shm::boolean(),


            ]),
            'description' => 'Авторизация через QR токен',
            'args' => Shm::structure([

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

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



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

                //Создание qrCode неавторизованного пользователя
                if (!$qrCode) {




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

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

                    mDB::collection("_qr_token_codes")->insertOne([
                        'qrCode' => $newQrCode,
                        'created_at' => time(),

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

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

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




                    //Если передали qr код и это авторизованный пользователь то добавляем 
                    //В базу owner и ownerCollection

                    if (Auth::isAuthenticated()) {

                        //Проверяем что такой qrCode есть 
                        $findQrCode = mDB::collection("_qr_token_codes")->findOne([
                            'qrCode' => $qrCode,
                            'expires_at' => ['$gt' => time()],
                        ]);

                        if (!$findQrCode) {
                            Shm::error(I18n::get('auth_qr_code_not_found'));
                        }

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

                        if ($owner && $ownerCollection) {

                            Shm::error(I18n::get('auth_qr_code_already_activated'));
                        }

                        //Активируем qrCode
                        mDB::collection("_qr_token_codes")->updateOne([
                            'qrCode' => $qrCode,
                            'owner' => ['$exists' => false],
                            'ownerCollection' => ['$exists' => false],
                            'expires_at' => ['$gt' => time()],
                        ], [
                            '$set' => [
                                'owner' => Auth::getAuthID(),
                                'ownerCollection' => Auth::getAuthCollection(),
                            ],
                        ]);

                        return [
                            'activated' => true,
                        ];
                    } else {


                        //Если это не авторизованный пользователь то проверяем что qrCode активирован
                        $findQrCode = mDB::collection("_qr_token_codes")->findOne([
                            'qrCode' => $qrCode,
                            'expires_at' => ['$gt' => time()],
                            'owner' => ['$exists' => true],
                            'ownerCollection' => ['$exists' => true],
                        ]);

                        if (!$findQrCode) {
                            return null;
                        }

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

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

                        if (!$userStructure) {
                            Shm::error(I18n::get('auth_qr_code_not_found'));
                        }

                        //Удаляем qrCode из базы данных
                        mDB::collection("_qr_token_codes")->deleteOne([
                            '_id' => $findQrCode->_id,
                        ]);


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