// Copyright 2017 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.

#ifndef TRUNKS_POWER_MANAGER_H_
#define TRUNKS_POWER_MANAGER_H_

#include <memory>
#include <string>
#include <vector>

#include <base/memory/weak_ptr.h>
#include <power_manager/dbus-proxies.h>

#include "trunks/resource_manager.h"

namespace trunks {

// PowerManager handles suspend-resume events in the system.
//
class PowerManager {
 public:
  // The |resource_manager| will be notified of power events. This
  // class does not take ownership of |resource_manager|.
  explicit PowerManager(ResourceManager* resource_manager = nullptr)
      : resource_manager_(resource_manager) {}
  PowerManager(const PowerManager&) = delete;
  PowerManager& operator=(const PowerManager&) = delete;

  ~PowerManager() = default;

  void set_resource_manager(ResourceManager* resource_manager) {
    resource_manager_ = resource_manager;
  }

  void set_power_manager_proxy(
      org::chromium::PowerManagerProxyInterface* proxy) {
    proxy_ = proxy;
  }

  // Registers for power events on |bus|. The class doesn't take ownership
  // of |bus|.
  void Init(const scoped_refptr<dbus::Bus>& bus);

  // Tears down: unregisters SuspendDelay handlers.
  void TearDown();

 private:
  // Registers signal handlers for *SuspendImminent and SuspendDone.
  void RegisterSignalHandlers();

  // Called when powerd service becomes available on D-Bus.
  void OnServiceAvailable(bool available);
  // Called when the owner of powerd D-Bus interface changes.
  void OnOwnerChanged(const std::string& old_owner,
                      const std::string& new_owner);

  // Starts handling SuspendDelay.
  void Start();
  // Stops handling SuspendDelay.
  void Stop();

  // Called when SuspendDone signal is received.
  // |serialized_proto| contains the serialized signal payload.
  void OnResume(const std::vector<uint8_t>& serialized_proto);
  // Called when *SuspendImminent signal is received.
  // |serialized_proto| contains the serialized signal payload.
  void OnSuspend(const std::vector<uint8_t>& serialized_proto);

  // Called when SuspendDone signal handler is connected with
  // |interface_name| and |signal_name| identifying the signal and
  // |success| telling is the connection was successful.
  void OnResumeConnect(const std::string& interface_name,
                       const std::string& signal_name,
                       bool success);
  // Called when a signal handler is connected with
  // |interface_name| and |signal_name| identifying the signal and
  // |success| telling is the connection was successful.
  void OnSignalConnect(const std::string& interface_name,
                       const std::string& signal_name,
                       bool success);

  // Called if RegisterSuspendDelayRequest is successful.
  // |serialized_proto| contains the serialized reply payload.
  void OnRegisterSuspendDelaySuccess(
      const std::vector<uint8_t>& serialized_proto);
  // Called if a request is successful.
  // |serialized_proto| contains the serialized reply payload.
  void OnRequestSuccess(const std::string& message_name);
  // Called if a request failed. |message_name| identifies the request.
  // |error| contains information on the error.
  void OnRequestError(const std::string& message_name, brillo::Error* error);

  base::WeakPtr<PowerManager> GetWeakPtr() {
    return weak_factory_.GetWeakPtr();
  }
  base::WeakPtr<PowerManager> ThisForBind() { return GetWeakPtr(); }

  // Whether SuspendDelay handler is registered.
  bool suspend_delay_registered_ = false;
  // Delay ID for SuspendDelay handler if registered.
  int32_t delay_id_ = 0;
  // Whether suspend handling is allowed (only if resume handler is
  // successfully registered, so that we have a way out of suspend).
  bool suspend_allowed_ = false;

  ResourceManager* resource_manager_;
  std::unique_ptr<org::chromium::PowerManagerProxy> dbus_proxy_;
  org::chromium::PowerManagerProxyInterface* proxy_ = nullptr;

  // Declared last so weak pointers are invalidated first on destruction.
  base::WeakPtrFactory<PowerManager> weak_factory_{this};
};

}  // namespace trunks

#endif  // TRUNKS_POWER_MANAGER_H_
