// Copyright 2020 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 "biod/fp_info_command.h"

namespace biod {

/**
 * @return non-owning pointer which can be nullptr if command hasn't been run.
 */
SensorId* FpInfoCommand::sensor_id() {
  if (!Resp()) {
    return nullptr;
  }
  if (!sensor_id_) {
    sensor_id_ =
        std::make_unique<SensorId>(Resp()->vendor_id, Resp()->product_id,
                                   Resp()->model_id, Resp()->version);
  }
  return sensor_id_.get();
}

/**
 * @return non-owning pointer which can be nullptr if command hasn't been run.
 */
SensorImage* FpInfoCommand::sensor_image() {
  if (!Resp()) {
    return nullptr;
  }
  if (!sensor_image_) {
    sensor_image_ = std::make_unique<SensorImage>(
        Resp()->width, Resp()->height, Resp()->frame_size, Resp()->pixel_format,
        Resp()->bpp);
  }
  return sensor_image_.get();
}

/**
 * @return non-owning pointer which can be nullptr if command hasn't been run.
 */
TemplateInfo* FpInfoCommand::template_info() {
  if (!Resp()) {
    return nullptr;
  }
  if (!template_info_) {
    template_info_ = std::make_unique<TemplateInfo>(
        Resp()->template_version, Resp()->template_size, Resp()->template_max,
        Resp()->template_valid, Resp()->template_dirty);
  }
  return template_info_.get();
}

/**
 * @return number of dead pixels or kDeadPixelsUnknown
 */
int FpInfoCommand::NumDeadPixels() {
  if (!Resp()) {
    return kDeadPixelsUnknown;
  }
  uint16_t num_dead_pixels = Resp()->errors;
  if (num_dead_pixels == FP_ERROR_DEAD_PIXELS_UNKNOWN) {
    return kDeadPixelsUnknown;
  }
  return num_dead_pixels;
}

/**
 * @return FpSensorErrors
 */
FpSensorErrors FpInfoCommand::GetFpSensorErrors() {
  FpSensorErrors ret = FpSensorErrors::kNone;

  if (!Resp()) {
    return ret;
  }

  auto errors = Resp()->errors;

  if (errors & FP_ERROR_NO_IRQ) {
    ret |= FpSensorErrors::kNoIrq;
  }
  if (errors & FP_ERROR_BAD_HWID) {
    ret |= FpSensorErrors::kBadHardwareID;
  }
  if (errors & FP_ERROR_INIT_FAIL) {
    ret |= FpSensorErrors::kInitializationFailure;
  }
  if (errors & FP_ERROR_SPI_COMM) {
    ret |= FpSensorErrors::kSpiCommunication;
  }
  if ((FP_ERROR_DEAD_PIXELS(errors) != FP_ERROR_DEAD_PIXELS_UNKNOWN) &&
      (FP_ERROR_DEAD_PIXELS(errors) != 0)) {
    ret |= FpSensorErrors::kDeadPixels;
  }

  return ret;
}

}  // namespace biod
