// Copyright 2021 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 "power_manager/powerd/system/fake_sensor_device.h"

#include <utility>

#include "power_manager/powerd/system/ambient_light_sensor_delegate_mojo.h"

#include <base/check.h>

namespace power_manager {
namespace system {

FakeSensorDevice::FakeSensorDevice(bool is_color_sensor,
                                   base::Optional<std::string> name,
                                   base::Optional<std::string> location)
    : is_color_sensor_(is_color_sensor) {
  if (name.has_value())
    attributes_[cros::mojom::kDeviceName] = name.value();

  if (location.has_value())
    attributes_[cros::mojom::kLocation] = location.value();
}

void FakeSensorDevice::AddReceiver(
    mojo::PendingReceiver<cros::mojom::SensorDevice> pending_receiver) {
  receiver_set_.Add(this, std::move(pending_receiver));
}

bool FakeSensorDevice::HasReceivers() const {
  return !receiver_set_.empty();
}

void FakeSensorDevice::GetAttributes(const std::vector<std::string>& attr_names,
                                     GetAttributesCallback callback) {
  CHECK(!attr_queried_);
  attr_queried_ = true;

  std::vector<base::Optional<std::string>> attr_values;
  attr_values.reserve(attr_names.size());
  for (const auto& attr_name : attr_names) {
    auto it = attributes_.find(attr_name);
    if (it != attributes_.end())
      attr_values.push_back(it->second);
    else
      attr_values.push_back(base::nullopt);
  }

  std::move(callback).Run(std::move(attr_values));
}

void FakeSensorDevice::SetFrequency(double frequency,
                                    SetFrequencyCallback callback) {
  std::move(callback).Run(frequency);
}

void FakeSensorDevice::StartReadingSamples(
    mojo::PendingRemote<cros::mojom::SensorDeviceSamplesObserver> observer) {
  observers_.emplace(receiver_set_.current_receiver(), std::move(observer));
}

void FakeSensorDevice::StopReadingSamples() {
  observers_.erase(receiver_set_.current_receiver());
}

void FakeSensorDevice::GetAllChannelIds(GetAllChannelIdsCallback callback) {
  std::vector<std::string> channel_ids(1, cros::mojom::kLightChannel);
  if (is_color_sensor_) {
    for (const ColorChannelInfo& channel : kColorChannelConfig) {
      channel_ids.push_back(
          AmbientLightSensorDelegateMojo::GetChannelIlluminanceColorId(
              channel.rgb_name));
    }
  }
  channel_ids.push_back(cros::mojom::kTimestampChannel);
  std::move(callback).Run(std::move(channel_ids));
}

void FakeSensorDevice::SetChannelsEnabled(
    const std::vector<int32_t>& iio_chn_indices,
    bool en,
    SetChannelsEnabledCallback callback) {
  std::move(callback).Run(std::move(std::vector<int32_t>{}));
}

void FakeSensorDevice::GetChannelsEnabled(
    const std::vector<int32_t>& iio_chn_indices,
    GetChannelsEnabledCallback callback) {
  std::move(callback).Run(
      std::move(std::vector<bool>(iio_chn_indices.size(), true)));
}

void FakeSensorDevice::GetChannelsAttributes(
    const std::vector<int32_t>& iio_chn_indices,
    const std::string& attr_name,
    GetChannelsAttributesCallback callback) {
  std::move(callback).Run(std::move(std::vector<base::Optional<std::string>>(
      iio_chn_indices.size(), base::nullopt)));
}

}  // namespace system
}  // namespace power_manager
