// Copyright 2014 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 POWER_MANAGER_POWERD_POLICY_INPUT_DEVICE_CONTROLLER_H_
#define POWER_MANAGER_POWERD_POLICY_INPUT_DEVICE_CONTROLLER_H_

#include <string>

#include <base/macros.h>

#include "power_manager/common/power_constants.h"
#include "power_manager/powerd/policy/backlight_controller_observer.h"
#include "power_manager/powerd/system/udev_tagged_device_observer.h"
#include "power_manager/proto_bindings/backlight.pb.h"

namespace power_manager {
class PrefsInterface;

namespace system {
class AcpiWakeupHelperInterface;
class EcWakeupHelperInterface;
class TaggedDevice;
class UdevInterface;
}  // namespace system

namespace policy {

// Configures wakeup-capable devices according to the current lid state.
class InputDeviceController : public policy::BacklightControllerObserver,
                              public system::UdevTaggedDeviceObserver {
 public:
  // Powerd tags.
  static const char kTagInhibit[];
  static const char kTagUsableWhenDocked[];
  static const char kTagUsableWhenDisplayOff[];
  static const char kTagUsableWhenLaptop[];
  static const char kTagUsableWhenTablet[];
  static const char kTagWakeup[];
  static const char kTagWakeupWhenDocked[];
  static const char kTagWakeupWhenDisplayOff[];
  static const char kTagWakeupWhenLaptop[];
  static const char kTagWakeupWhenTablet[];
  static const char kTagWakeupOnlyWhenUsable[];
  static const char kTagWakeupDisabled[];

  // Sysfs power/wakeup constants.
  static const char kWakeupEnabled[];
  static const char kWakeupDisabled[];

  static const char kInhibited[];

  // ACPI device names.
  static const char kTPAD[];
  static const char kTSCR[];
  static const char kCRFP[];

  // Describes which mode the system is currently in, depending on e.g. the
  // state of the lid.
  enum class Mode {
    CLOSED = 0,   // Lid closed, no external monitor attached.
    DOCKED,       // Lid closed, external monitor attached.
    DISPLAY_OFF,  // Internal display off, external monitor attached.
    LAPTOP,       // Lid open.
    TABLET,       // Tablet mode, e.g. lid open more than 180 degrees.
  };

  InputDeviceController();
  ~InputDeviceController() override;

  void Init(policy::BacklightController* backlight_controller,
            system::UdevInterface* udev,
            system::AcpiWakeupHelperInterface* acpi_wakeup_helper,
            system::EcWakeupHelperInterface* ec_wakeup_helper,
            LidState lid_state,
            TabletMode tablet_mode,
            DisplayMode display_mode,
            PrefsInterface* prefs);

  void SetLidState(LidState lid_state);
  void SetTabletMode(TabletMode tablet_mode);
  void SetDisplayMode(DisplayMode display_mode);

  // Implementation of TaggedDeviceObserver.
  void OnTaggedDeviceChanged(const system::TaggedDevice& device) override;
  void OnTaggedDeviceRemoved(const system::TaggedDevice& device) override;

  // Overridden from policy::BacklightControllerObserver:
  void OnBrightnessChange(double brightness_percent,
                          BacklightBrightnessChange_Cause cause,
                          BacklightController* source) override;

 private:
  // Derive the currently applicable mode according to lid state.
  Mode GetMode() const;

  // Enables or disables wakeup from S3 for this device (through power/wakeup).
  void SetWakeupFromS3(const system::TaggedDevice& device, bool enabled);

  // Configures inhibit for |device| according to our policy.
  void ConfigureInhibit(const system::TaggedDevice& device);

  // Configures wakeup for |device| according to our policy.
  void ConfigureWakeup(const system::TaggedDevice& device);

  // Re-configures ACPI wakeup.
  void ConfigureAcpiWakeup();

  // Re-configures EC wakeup.
  void ConfigureEcWakeup();

  // Re-configures all known devices to reflect a policy change.
  void UpdatePolicy();

  system::UdevInterface* udev_ = nullptr;                            // weak
  policy::BacklightController* backlight_controller_ = nullptr;      // weak
  system::AcpiWakeupHelperInterface* acpi_wakeup_helper_ = nullptr;  // weak
  system::EcWakeupHelperInterface* ec_wakeup_helper_ = nullptr;      // weak

  PrefsInterface* prefs_ = nullptr;  // weak

  LidState lid_state_ = LidState::OPEN;
  TabletMode tablet_mode_ = TabletMode::OFF;
  DisplayMode display_mode_ = DisplayMode::NORMAL;
  bool allow_docked_mode_ = false;
  bool backlight_enabled_ = false;

  // The mode calculated in the most recent invocation of UpdatePolicy().
  Mode mode_ = Mode::LAPTOP;

  bool initialized_ = false;

  DISALLOW_COPY_AND_ASSIGN(InputDeviceController);
};

}  // namespace policy
}  // namespace power_manager

#endif  // POWER_MANAGER_POWERD_POLICY_INPUT_DEVICE_CONTROLLER_H_
