// 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 <base/logging.h>
#include <base/macros.h>
#include <base/notreached.h>

#include <libmems/common_types.h>

#include "mems_setup/sensor_kind.h"

namespace mems_setup {

namespace {
constexpr char kOthersName[] = "";

constexpr char kAccelDeviceName[] = "cros-ec-accel";
constexpr char kGyroDeviceName[] = "cros-ec-gyro";
constexpr char kLightDeviceName[] = "cros-ec-light";
constexpr char kAlsDeviceName[] = "acpi-als";
constexpr char kSyncDeviceName[] = "cros-ec-sync";
constexpr char kMagnDeviceName[] = "cros-ec-mag";
constexpr char kLidAngleDeviceName[] = "cros-ec-lid-angle";
constexpr char kBaroDeviceName[] = "cros-ec-baro";

constexpr char kHidDeviceNames[][13] = {
    "accel_3d",    "gyro_3d",  "magn_3d",     "als",
    "temperature", "incli_3d", "dev_rotation"};
}  // namespace

std::string SensorKindToString(SensorKind kind) {
  switch (kind) {
    case SensorKind::ACCELEROMETER:
      return libmems::kAccelName;
    case SensorKind::GYROSCOPE:
      return libmems::kGyroName;
    case SensorKind::LIGHT:
      return libmems::kLightName;
    case SensorKind::SYNC:
      return libmems::kSyncName;
    case SensorKind::MAGNETOMETER:
      return libmems::kMagnName;
    case SensorKind::LID_ANGLE:
      return libmems::kLidAngleName;
    case SensorKind::BAROMETER:
      return libmems::kBaroName;
    case SensorKind::HID_OTHERS:
    case SensorKind::OTHERS:
      return kOthersName;  // Shouldn't be used
  }

  NOTREACHED();
}

SensorKind SensorKindFromString(const std::string& name) {
  if (name == kAccelDeviceName)
    return SensorKind::ACCELEROMETER;
  if (name == kGyroDeviceName)
    return SensorKind::GYROSCOPE;
  if (name == kLightDeviceName || name == kAlsDeviceName)
    return SensorKind::LIGHT;
  if (name == kSyncDeviceName)
    return SensorKind::SYNC;
  if (name == kMagnDeviceName)
    return SensorKind::MAGNETOMETER;
  if (name == kLidAngleDeviceName)
    return SensorKind::LID_ANGLE;
  if (name == kBaroDeviceName)
    return SensorKind::BAROMETER;

  for (const auto& hid_device_name : kHidDeviceNames) {
    if (name.compare(hid_device_name) == 0)
      return SensorKind::HID_OTHERS;
  }

  return SensorKind::OTHERS;
}

}  // namespace mems_setup
