// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef DEVICE_FIDO_AUTHENTICATOR_GET_INFO_RESPONSE_H_
#define DEVICE_FIDO_AUTHENTICATOR_GET_INFO_RESPONSE_H_

#include <stdint.h>

#include <string>
#include <vector>

#include "base/component_export.h"
#include "base/containers/flat_set.h"
#include "base/macros.h"
#include "base/optional.h"
#include "device/fido/authenticator_supported_options.h"
#include "device/fido/fido_constants.h"

namespace device {

// Authenticator response for AuthenticatorGetInfo request that encapsulates
// versions, options, AAGUID(Authenticator Attestation GUID), other
// authenticator device information.
// https://fidoalliance.org/specs/fido-v2.0-rd-20170927/fido-client-to-authenticator-protocol-v2.0-rd-20170927.html#authenticatorGetInfo
class COMPONENT_EXPORT(DEVICE_FIDO) AuthenticatorGetInfoResponse {
 public:
  AuthenticatorGetInfoResponse(base::flat_set<ProtocolVersion> versions,
                               base::span<const uint8_t, kAaguidLength> aaguid);
  AuthenticatorGetInfoResponse(AuthenticatorGetInfoResponse&& that);
  AuthenticatorGetInfoResponse& operator=(AuthenticatorGetInfoResponse&& other);
  ~AuthenticatorGetInfoResponse();

  AuthenticatorGetInfoResponse& SetMaxMsgSize(uint32_t max_msg_size);
  AuthenticatorGetInfoResponse& SetPinProtocols(
      std::vector<uint8_t> pin_protocols);
  AuthenticatorGetInfoResponse& SetExtensions(
      std::vector<std::string> extensions);
  AuthenticatorGetInfoResponse& SetOptions(
      const AuthenticatorSupportedOptions& options);

  const base::flat_set<ProtocolVersion>& versions() const { return versions_; }
  const std::array<uint8_t, kAaguidLength>& aaguid() const { return aaguid_; }
  const base::Optional<uint32_t>& max_msg_size() const { return max_msg_size_; }
  const base::Optional<std::vector<uint8_t>>& pin_protocol() const {
    return pin_protocols_;
  }
  const base::Optional<std::vector<std::string>>& extensions() const {
    return extensions_;
  }
  const AuthenticatorSupportedOptions& options() const { return options_; }

 private:
  base::flat_set<ProtocolVersion> versions_;
  std::array<uint8_t, kAaguidLength> aaguid_;
  base::Optional<uint32_t> max_msg_size_;
  base::Optional<std::vector<uint8_t>> pin_protocols_;
  base::Optional<std::vector<std::string>> extensions_;
  AuthenticatorSupportedOptions options_;

  DISALLOW_COPY_AND_ASSIGN(AuthenticatorGetInfoResponse);
};

COMPONENT_EXPORT(DEVICE_FIDO)
std::vector<uint8_t> EncodeToCBOR(const AuthenticatorGetInfoResponse& response);

}  // namespace device

#endif  // DEVICE_FIDO_AUTHENTICATOR_GET_INFO_RESPONSE_H_
