// 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 "diagnostics/wilco_dtc_supportd/telemetry/powerd_event_service_impl.h"

#include <base/logging.h>

using PowerEventType =
    diagnostics::PowerdEventService::Observer::PowerEventType;

namespace diagnostics {

PowerdEventServiceImpl::PowerdEventServiceImpl(PowerdAdapter* powerd_adapter)
    : powerd_adapter_(powerd_adapter) {
  DCHECK(powerd_adapter_);
  powerd_adapter_->AddPowerObserver(this);
}

PowerdEventServiceImpl::~PowerdEventServiceImpl() {
  powerd_adapter_->RemovePowerObserver(this);
}

void PowerdEventServiceImpl::AddObserver(
    PowerdEventService::Observer* observer) {
  DCHECK(observer);
  observers_.AddObserver(observer);
}

void PowerdEventServiceImpl::RemoveObserver(
    PowerdEventService::Observer* observer) {
  DCHECK(observer);
  observers_.RemoveObserver(observer);
}

void PowerdEventServiceImpl::OnPowerSupplyPollSignal(
    const power_manager::PowerSupplyProperties& power_supply) {
  if (!power_supply.has_external_power()) {
    return;
  }

  PowerEventType event_type;
  switch (power_supply.external_power()) {
    case power_manager::PowerSupplyProperties::AC:
    case power_manager::PowerSupplyProperties::USB:
      event_type = PowerEventType::kAcInsert;
      break;
    case power_manager::PowerSupplyProperties::DISCONNECTED:
      event_type = PowerEventType::kAcRemove;
      break;
    default:
      LOG(ERROR) << "Unknown external power type: "
                 << power_supply.external_power();
      return;
  }

  // Do not send event if the previous AC event was the same.
  if (external_power_ac_event_.has_value() &&
      external_power_ac_event_.value() == event_type) {
    VLOG(2) << "Received the same AC event: " << static_cast<int>(event_type);
    return;
  }

  external_power_ac_event_ = event_type;
  for (auto& observer : observers_)
    observer.OnPowerdEvent(event_type);
}

void PowerdEventServiceImpl::OnSuspendImminentSignal(
    const power_manager::SuspendImminent& suspend_imminent) {
  OnAnySuspendImminentSignal(suspend_imminent);
}

void PowerdEventServiceImpl::OnDarkSuspendImminentSignal(
    const power_manager::SuspendImminent& suspend_imminent) {
  OnAnySuspendImminentSignal(suspend_imminent);
}

void PowerdEventServiceImpl::OnSuspendDoneSignal(
    const power_manager::SuspendDone& suspend_done) {
  for (auto& observer : observers_)
    observer.OnPowerdEvent(PowerEventType::kOsResume);
}

void PowerdEventServiceImpl::OnAnySuspendImminentSignal(
    const power_manager::SuspendImminent& suspend_imminent) {
  for (auto& observer : observers_)
    observer.OnPowerdEvent(PowerEventType::kOsSuspend);
}

}  // namespace diagnostics
