// 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/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 kProxDeviceName[] = "cros-ec-prox";
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::PROXIMITY:
      return libmems::kProxName;
    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 == kProxDeviceName)
    return SensorKind::PROXIMITY;
  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
