// Copyright 2019 The Fuchsia 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 SRC_UI_TOOLS_PRINT_INPUT_REPORT_PRINTER_H_
#define SRC_UI_TOOLS_PRINT_INPUT_REPORT_PRINTER_H_

#include <fidl/fuchsia.input.report/cpp/wire.h>
#include <stdarg.h>
#include <stdio.h>

#include <string>

namespace print_input_report {

static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::UnitType::kNone) == 0);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::UnitType::kOther) == 1);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::UnitType::kMeters) == 2);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::UnitType::kGrams) == 3);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::UnitType::kDegrees) == 4);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::UnitType::kEnglishAngularVelocity) ==
              5);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::UnitType::kSiLinearVelocity) == 6);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::UnitType::kSiLinearAcceleration) == 7);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::UnitType::kWebers) == 8);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::UnitType::kCandelas) == 9);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::UnitType::kPascals) == 10);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::UnitType::kLux) == 11);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::UnitType::kSeconds) == 12);

// These strings must be ordered based on the enums in fuchsia.input.report/units.fidl.
const char* const kUnitStrings[] = {
    "NONE",
    "OTHER",
    "METERS",
    "GRAMS",
    "DEGREES",
    "ENGLISH_ANGULAR_VELOCITY",
    "SI_LINEAR_VELOCITY",
    "SI_ACCELERATION",
    "WEBERS",
    "CANDELAS",
    "PASCALS",
    "LUX",
    "SECONDS",
};

static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::SensorType::kAccelerometerX) == 1);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::SensorType::kAccelerometerY) == 2);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::SensorType::kAccelerometerZ) == 3);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::SensorType::kMagnetometerX) == 4);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::SensorType::kMagnetometerY) == 5);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::SensorType::kMagnetometerZ) == 6);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::SensorType::kGyroscopeX) == 7);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::SensorType::kGyroscopeY) == 8);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::SensorType::kGyroscopeZ) == 9);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::SensorType::kLightIlluminance) == 10);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::SensorType::kLightRed) == 11);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::SensorType::kLightGreen) == 12);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::SensorType::kLightBlue) == 13);

// These strings must be ordered based on the enums in fuchsia.input.report/sensor.fidl.
const char* const kSensorTypeStrings[] = {
    "ERROR",          "ACCELEROMETER_X", "ACCELEROMETER_Y",   "ACCELEROMETER_Z",
    "MAGNETOMETER_X", "MAGNETOMETER_Y",  "MAGNETOMETER_Z",    "GYROSCOPE_X",
    "GYROSCOPE_Y",    "GYROSCOPE_Z",     "LIGHT_ILLUMINANCE", "LIGHT_RED",
    "LIGHT_GREEN",    "LIGHT_BLUE",
};

static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::TouchType::kTouchscreen) == 1);
// These strings must be ordered based on the enums in fuchsia.input.report/touch.fidl.
const char* const kTouchTypeStrings[] = {
    "ERROR",
    "TOUCHSCREEN",
};

static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::LedType::kNumLock) == 1);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::LedType::kCapsLock) == 2);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::LedType::kScrollLock) == 3);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::LedType::kCompose) == 4);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::LedType::kKana) == 5);
// These strings must be ordered based on the enums in fuchsia.input.report/led.fidl.
const char* const kLedTypeStrings[] = {
    "ERROR", "NUM_LOCK", "CAPS_LOCK", "SCROLL_LOCK", "COMPOSE", "KANA",
};

static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::ConsumerControlButton::kVolumeUp) ==
              1);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::ConsumerControlButton::kVolumeDown) ==
              2);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::ConsumerControlButton::kPause) == 3);
static_assert(
    fidl::ToUnderlying(fuchsia_input_report::wire::ConsumerControlButton::kFactoryReset) == 4);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::ConsumerControlButton::kMicMute) == 5);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::ConsumerControlButton::kReboot) == 6);
static_assert(
    fidl::ToUnderlying(fuchsia_input_report::wire::ConsumerControlButton::kCameraDisable) == 7);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::ConsumerControlButton::kFunction) ==
              8);
static_assert(fidl::ToUnderlying(fuchsia_input_report::wire::ConsumerControlButton::kPower) == 9);
// These strings must be ordered based on the enums in fuchsia.input.report/consumer_control.fidl.
const char* const kConsumerControlButtonStrings[] = {
    "ERROR",    "VOLUME_UP", "VOLUME_DOWN",    "PAUSE",    "FACTORY_RESET",
    "MIC_MUTE", "REBOOT",    "CAMERA_DISABLE", "FUNCTION", "POWER"};

class Printer {
 public:
  Printer() = default;

  // Find the string related to the unit. If we are given a value that we do not
  // recognize, the string "NONE" will be returned and printed.
  static const char* UnitTypeToString(fuchsia_input_report::wire::Unit unit) {
    uint32_t unit_index = static_cast<uint32_t>(unit.type);
    if (unit_index >= std::size(kUnitStrings)) {
      return kUnitStrings[0];
    }
    return kUnitStrings[unit_index];
  }

  // Find the string related to the sensor type. If we are given a value that we do not
  // recognize, the string "ERROR" will be returned and printed.
  static const char* SensorTypeToString(fuchsia_input_report::wire::SensorType type) {
    uint32_t unit_index = static_cast<uint32_t>(type);
    if (unit_index >= std::size(kSensorTypeStrings)) {
      return kSensorTypeStrings[0];
    }
    return kSensorTypeStrings[unit_index];
  }

  static const char* TouchTypeToString(fuchsia_input_report::wire::TouchType type) {
    uint32_t unit_index = static_cast<uint32_t>(type);
    if (unit_index >= std::size(kTouchTypeStrings)) {
      return kTouchTypeStrings[0];
    }
    return kTouchTypeStrings[unit_index];
  }

  static const char* LedTypeToString(fuchsia_input_report::wire::LedType type) {
    uint32_t unit_index = static_cast<uint32_t>(type);
    if (unit_index >= std::size(kLedTypeStrings)) {
      return kLedTypeStrings[0];
    }
    return kLedTypeStrings[unit_index];
  }

  static const char* ConsumerControlButtonToString(
      fuchsia_input_report::wire::ConsumerControlButton type) {
    uint32_t unit_index = static_cast<uint32_t>(type);
    if (unit_index >= std::size(kConsumerControlButtonStrings)) {
      return kConsumerControlButtonStrings[0];
    }
    return kConsumerControlButtonStrings[unit_index];
  }

  void PrintAxis(fuchsia_input_report::wire::Axis axis) {
    if (axis.unit.exponent) {
      this->Print("Unit: %8s * 1e%d\n", UnitTypeToString(axis.unit), axis.unit.exponent);
    } else {
      this->Print("Unit: %8s\n", UnitTypeToString(axis.unit));
    }
    this->Print("Min:  %8ld\n", axis.range.min);
    this->Print("Max:  %8ld\n", axis.range.max);
  }

  void PrintAxisIndented(fuchsia_input_report::wire::Axis axis) {
    IncreaseIndent();
    if (axis.unit.exponent) {
      this->Print("Unit: %8s * 1e%d\n", UnitTypeToString(axis.unit), axis.unit.exponent);
    } else {
      this->Print("Unit: %8s\n", UnitTypeToString(axis.unit));
    }
    this->Print("Min:  %8ld\n", axis.range.min);
    this->Print("Max:  %8ld\n", axis.range.max);
    DecreaseIndent();
  }

  void Print(const char* format, ...) {
    std::string str_format(indent_, ' ');
    str_format += format;

    va_list argptr;
    va_start(argptr, format);
    RealPrint(str_format.c_str(), argptr);
    va_end(argptr);
  }

  void SetIndent(size_t indent) { indent_ = indent; }

  void IncreaseIndent() { indent_ += 2; }

  void DecreaseIndent() { indent_ -= 2; }

 protected:
  virtual void RealPrint(const char* format, va_list argptr) { vprintf(format, argptr); }
  size_t indent_ = 0;
};

}  // namespace print_input_report

#endif  // SRC_UI_TOOLS_PRINT_INPUT_REPORT_PRINTER_H_
