#include <hwtrust/hwtrust.h>
#include <hwtrust/lib.rs.h>

using android::base::Error;
using android::base::Result;

namespace hwtrust {

struct BoxedDiceChain {
    ::rust::Box<rust::DiceChain> chain;
};

// Define with a full definition of BoxedDiceChain to satisfy unique_ptr.
DiceChain::~DiceChain() {}

DiceChain::DiceChain(std::unique_ptr<BoxedDiceChain> chain, size_t size) noexcept
      : chain_(std::move(chain)), size_(size) {}

Result<DiceChain> DiceChain::Verify(const std::vector<uint8_t>& chain, DiceChain::Kind kind) noexcept {
  rust::DiceChainKind chainKind;
  switch (kind) {
    case DiceChain::Kind::kVsr13:
      chainKind = rust::DiceChainKind::Vsr13;
      break;
    case DiceChain::Kind::kVsr14:
      chainKind = rust::DiceChainKind::Vsr14;
      break;
  }
  auto res = rust::VerifyDiceChain({chain.data(), chain.size()}, chainKind);
  if (!res.error.empty()) {
      return Error() << static_cast<std::string>(res.error);
  }
  BoxedDiceChain boxedChain = { std::move(res.chain) };
  auto diceChain = std::make_unique<BoxedDiceChain>(std::move(boxedChain));
  return DiceChain(std::move(diceChain), res.len);
}

Result<std::vector<std::vector<uint8_t>>> DiceChain::CosePublicKeys() const noexcept {
  std::vector<std::vector<uint8_t>> result;
  for (auto i = 0; i < size_; ++i) {
    auto key = rust::GetDiceChainPublicKey(*chain_->chain, i);
    if (key.empty()) {
      return Error() << "Failed to get public key from chain entry " << i;
    }
    result.emplace_back(key.begin(), key.end());
  }
  return result;
}

} // namespace hwtrust
