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

#include <algorithm>
#include <utility>
#include <vector>

#include <base/base64.h>
#include <base/memory/ptr_util.h>
#include <base/strings/string_number_conversions.h>
#include <chromeos/ec/ec_commands.h>

#include "biod/ec_command.h"
#include "biod/ec_command_async.h"
#include "biod/fp_context_command.h"

namespace biod {

namespace {

std::unique_ptr<std::vector<uint8_t>> HexStringToBytes(const std::string& hex,
                                                       size_t max_size) {
  auto ret = std::make_unique<std::vector<uint8_t>>();
  if (hex.empty()) {
    return ret;
  }

  if (!base::HexStringToBytes(hex, ret.get())) {
    return nullptr;
  }
  if (ret->size() > max_size) {
    ret->resize(max_size);
  }
  return ret;
}

}  // namespace

FpContextCommand_v0::FpContextCommand_v0() : EcCommand(EC_CMD_FP_CONTEXT, 0) {}

std::unique_ptr<FpContextCommand_v0> FpContextCommand_v0::Create(
    const std::string& user_hex) {
  struct ec_params_fp_context ctxt = {};
  auto user_id = HexStringToBytes(user_hex, sizeof(ctxt.userid));
  if (!user_id) {
    return nullptr;
  }
  memcpy(ctxt.userid, user_id->data(), user_id->size());
  // Using new to access non-public constructor. See https://abseil.io/tips/134.
  auto cmd = base::WrapUnique(new FpContextCommand_v0);
  cmd->SetReq(ctxt);
  return cmd;
}

FpContextCommand_v1::FpContextCommand_v1()
    : EcCommandAsync(EC_CMD_FP_CONTEXT, FP_CONTEXT_GET_RESULT, Options(), 1) {}

std::unique_ptr<FpContextCommand_v1> FpContextCommand_v1::Create(
    const std::string& user_hex) {
  struct ec_params_fp_context_v1 ctxt = {.action = FP_CONTEXT_ASYNC};
  auto user_id = HexStringToBytes(user_hex, sizeof(ctxt.userid));
  if (!user_id) {
    return nullptr;
  }
  memcpy(ctxt.userid, user_id->data(), user_id->size());
  // Using new to access non-public constructor. See https://abseil.io/tips/134.
  auto cmd = base::WrapUnique(new FpContextCommand_v1());
  cmd->SetReq(ctxt);
  return cmd;
}

}  // namespace biod
