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

#include "libec/ec_command_factory.h"

#include <array>
#include <string>
#include <utility>
#include <vector>

#include "libec/fingerprint/fp_info_command_factory.h"
#include "libec/fingerprint/fp_template_command.h"
#include "libec/flash_protect_command_factory.h"
#include "libec/rollback_info_command_factory.h"

namespace ec {

std::unique_ptr<EcCommandInterface> EcCommandFactory::FpContextCommand(
    EcCommandVersionSupportedInterface* ec_cmd_ver_supported,
    const std::string& user_id) {
  return FpContextCommandFactory::Create(ec_cmd_ver_supported, user_id);
}

std::unique_ptr<FlashProtectCommand> EcCommandFactory::FlashProtectCommand(
    EcCommandVersionSupportedInterface* ec_cmd_ver_supported,
    flash_protect::Flags flags,
    flash_protect::Flags mask) {
  return FlashProtectCommandFactory::Create(ec_cmd_ver_supported, flags, mask);
}

std::unique_ptr<FpInfoCommand> EcCommandFactory::FpInfoCommand(
    EcCommandVersionSupportedInterface* ec_cmd_ver_supported) {
  return FpInfoCommandFactory::Create(ec_cmd_ver_supported);
}

std::unique_ptr<ec::FpFrameCommand> EcCommandFactory::FpFrameCommand(
    int index, uint32_t frame_size, uint16_t max_read_size) {
  return FpFrameCommand::Create(index, frame_size, max_read_size);
}

std::unique_ptr<ec::FpSeedCommand> EcCommandFactory::FpSeedCommand(
    const brillo::SecureVector& seed, uint16_t seed_version) {
  return FpSeedCommand::Create(seed, seed_version);
}

std::unique_ptr<ec::FpTemplateCommand> EcCommandFactory::FpTemplateCommand(
    std::vector<uint8_t> tmpl, uint16_t max_write_size, bool commit) {
  return FpTemplateCommand::Create(std::move(tmpl), max_write_size, commit);
}

std::unique_ptr<ec::ChargeControlSetCommand>
EcCommandFactory::ChargeControlSetCommand(uint32_t mode,
                                          uint8_t lower,
                                          uint8_t upper) {
  return std::make_unique<ec::ChargeControlSetCommand>(mode, lower, upper);
}

std::unique_ptr<ec::ChargeCurrentLimitSetCommand>
EcCommandFactory::ChargeCurrentLimitSetCommand(uint32_t limit_mA) {
  return std::make_unique<ec::ChargeCurrentLimitSetCommand>(limit_mA);
}

std::unique_ptr<ec::DisplayStateOfChargeCommand>
EcCommandFactory::DisplayStateOfChargeCommand() {
  return std::make_unique<ec::DisplayStateOfChargeCommand>();
}

std::unique_ptr<ec::FpModeCommand> EcCommandFactory::FpModeCommand(
    FpMode mode) {
  return std::make_unique<ec::FpModeCommand>(mode);
}

std::unique_ptr<ec::GetFpModeCommand> EcCommandFactory::GetFpModeCommand() {
  return std::make_unique<ec::GetFpModeCommand>();
}

std::unique_ptr<ec::LedControlQueryCommand>
EcCommandFactory::LedControlQueryCommand(enum ec_led_id led_id) {
  return std::make_unique<ec::LedControlQueryCommand>(led_id);
}

std::unique_ptr<ec::LedControlSetCommand>
EcCommandFactory::LedControlSetCommand(
    enum ec_led_id led_id, std::array<uint8_t, EC_LED_COLOR_COUNT> brightness) {
  return std::make_unique<ec::LedControlSetCommand>(led_id, brightness);
}

std::unique_ptr<ec::LedControlAutoCommand>
EcCommandFactory::LedControlAutoCommand(enum ec_led_id led_id) {
  return std::make_unique<ec::LedControlAutoCommand>(led_id);
}

std::unique_ptr<ec::I2cReadCommand> EcCommandFactory::I2cReadCommand(
    uint8_t port, uint8_t addr8, uint8_t offset, uint8_t read_len) {
  return ec::I2cReadCommand::Create(port, addr8, offset, read_len);
}

std::unique_ptr<ec::MotionSenseCommandLidAngle>
EcCommandFactory::MotionSenseCommandLidAngle() {
  return std::make_unique<ec::MotionSenseCommandLidAngle>();
}

std::unique_ptr<ec::GetVersionCommand> EcCommandFactory::GetVersionCommand() {
  return std::make_unique<ec::GetVersionCommand>();
}

std::unique_ptr<ec::GetProtocolInfoCommand>
EcCommandFactory::GetProtocolInfoCommand() {
  return std::make_unique<ec::GetProtocolInfoCommand>();
}

std::unique_ptr<ec::GetFeaturesCommand> EcCommandFactory::GetFeaturesCommand() {
  return std::make_unique<ec::GetFeaturesCommand>();
}

std::unique_ptr<ec::PwmGetFanTargetRpmCommand>
EcCommandFactory::PwmGetFanTargetRpmCommand(uint8_t fan_idx) {
  return std::make_unique<ec::PwmGetFanTargetRpmCommand>(fan_idx);
}

std::unique_ptr<ec::PwmSetFanTargetRpmCommand>
EcCommandFactory::PwmSetFanTargetRpmCommand(uint32_t rpm, uint8_t fan_idx) {
  return std::make_unique<ec::PwmSetFanTargetRpmCommand>(rpm, fan_idx);
}

std::unique_ptr<ec::ThermalAutoFanCtrlCommand>
EcCommandFactory::ThermalAutoFanCtrlCommand(uint8_t fan_idx) {
  return std::make_unique<ec::ThermalAutoFanCtrlCommand>(fan_idx);
}

std::unique_ptr<ec::GetMemmapThermalVersionCommand>
EcCommandFactory::GetMemmapThermalVersionCommand() {
  return std::make_unique<ec::GetMemmapThermalVersionCommand>();
}

std::unique_ptr<ec::RollbackInfoCommand> EcCommandFactory::RollbackInfoCommand(
    EcCommandVersionSupportedInterface* ec_cmd_ver_supported) {
  return RollbackInfoCommandFactory::Create(ec_cmd_ver_supported);
}

std::unique_ptr<ec::GetMemmapTempCommand>
EcCommandFactory::GetMemmapTempCommand(uint8_t id) {
  return std::make_unique<ec::GetMemmapTempCommand>(id);
}

std::unique_ptr<ec::GetMemmapTempBCommand>
EcCommandFactory::GetMemmapTempBCommand(uint8_t id) {
  return std::make_unique<ec::GetMemmapTempBCommand>(id);
}

std::unique_ptr<ec::TempSensorGetInfoCommand>
EcCommandFactory::TempSensorGetInfoCommand(uint8_t id) {
  return std::make_unique<ec::TempSensorGetInfoCommand>(id);
}

}  // namespace ec
