<?php

declare (strict_types=1);
/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2014-2021 Spomky-Labs
 *
 * This software may be modified and distributed under the terms
 * of the MIT license.  See the LICENSE file for details.
 */
namespace RSSProVendor\Webauthn;

use RSSProVendor\Assert\Assertion;
use JsonSerializable;
use function RSSProVendor\Safe\json_decode;
class AuthenticatorSelectionCriteria implements JsonSerializable
{
    public const AUTHENTICATOR_ATTACHMENT_NO_PREFERENCE = null;
    public const AUTHENTICATOR_ATTACHMENT_PLATFORM = 'platform';
    public const AUTHENTICATOR_ATTACHMENT_CROSS_PLATFORM = 'cross-platform';
    public const USER_VERIFICATION_REQUIREMENT_REQUIRED = 'required';
    public const USER_VERIFICATION_REQUIREMENT_PREFERRED = 'preferred';
    public const USER_VERIFICATION_REQUIREMENT_DISCOURAGED = 'discouraged';
    public const RESIDENT_KEY_REQUIREMENT_NONE = null;
    public const RESIDENT_KEY_REQUIREMENT_REQUIRED = 'required';
    public const RESIDENT_KEY_REQUIREMENT_PREFERRED = 'preferred';
    public const RESIDENT_KEY_REQUIREMENT_DISCOURAGED = 'discouraged';
    /**
     * @var string|null
     */
    private $authenticatorAttachment;
    /**
     * @var bool
     */
    private $requireResidentKey;
    /**
     * @var string
     */
    private $userVerification;
    /**
     * @var string|null
     */
    private $residentKey;
    public function __construct(?string $authenticatorAttachment = null, ?bool $requireResidentKey = null, ?string $userVerification = null, ?string $residentKey = null)
    {
        if (null !== $authenticatorAttachment) {
            @trigger_error('The argument "authenticatorAttachment" is deprecated since version 3.3 and will be removed in 4.0. Please use the method "setAuthenticatorAttachment".', \E_USER_DEPRECATED);
        }
        if (null !== $requireResidentKey) {
            @trigger_error('The argument "requireResidentKey" is deprecated since version 3.3 and will be removed in 4.0. Please use the method "setRequireResidentKey".', \E_USER_DEPRECATED);
        }
        if (null !== $userVerification) {
            @trigger_error('The argument "userVerification" is deprecated since version 3.3 and will be removed in 4.0. Please use the method "setUserVerification".', \E_USER_DEPRECATED);
        }
        if (null !== $residentKey) {
            @trigger_error('The argument "residentKey" is deprecated since version 3.3 and will be removed in 4.0. Please use the method "setResidentKey".', \E_USER_DEPRECATED);
        }
        $this->authenticatorAttachment = $authenticatorAttachment;
        $this->requireResidentKey = $requireResidentKey ?? \false;
        $this->userVerification = $userVerification ?? self::USER_VERIFICATION_REQUIREMENT_PREFERRED;
        $this->residentKey = $residentKey ?? self::RESIDENT_KEY_REQUIREMENT_NONE;
    }
    public static function create(): self
    {
        return new self();
    }
    public function setAuthenticatorAttachment(?string $authenticatorAttachment): self
    {
        $this->authenticatorAttachment = $authenticatorAttachment;
        return $this;
    }
    public function setRequireResidentKey(bool $requireResidentKey): self
    {
        $this->requireResidentKey = $requireResidentKey;
        return $this;
    }
    public function setUserVerification(string $userVerification): self
    {
        $this->userVerification = $userVerification;
        return $this;
    }
    public function setResidentKey(?string $residentKey): self
    {
        $this->residentKey = $residentKey;
        return $this;
    }
    public function getAuthenticatorAttachment(): ?string
    {
        return $this->authenticatorAttachment;
    }
    public function isRequireResidentKey(): bool
    {
        return $this->requireResidentKey;
    }
    public function getUserVerification(): string
    {
        return $this->userVerification;
    }
    public function getResidentKey(): ?string
    {
        return $this->residentKey;
    }
    public static function createFromString(string $data): self
    {
        $data = json_decode($data, \true);
        Assertion::isArray($data, 'Invalid data');
        return self::createFromArray($data);
    }
    /**
     * @param mixed[] $json
     */
    public static function createFromArray(array $json): self
    {
        return self::create()->setAuthenticatorAttachment($json['authenticatorAttachment'] ?? null)->setRequireResidentKey($json['requireResidentKey'] ?? \false)->setUserVerification($json['userVerification'] ?? self::USER_VERIFICATION_REQUIREMENT_PREFERRED)->setResidentKey($json['residentKey'] ?? self::RESIDENT_KEY_REQUIREMENT_NONE);
    }
    /**
     * @return mixed[]
     */
    public function jsonSerialize(): array
    {
        $json = ['requireResidentKey' => $this->requireResidentKey, 'userVerification' => $this->userVerification];
        if (null !== $this->authenticatorAttachment) {
            $json['authenticatorAttachment'] = $this->authenticatorAttachment;
        }
        if (null !== $this->residentKey) {
            $json['residentKey'] = $this->residentKey;
        }
        return $json;
    }
}
