// 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 POWER_MANAGER_POWERD_SYSTEM_PLUGGABLE_INTERNAL_BACKLIGHT_H_
#define POWER_MANAGER_POWERD_SYSTEM_PLUGGABLE_INTERNAL_BACKLIGHT_H_

#include <memory>
#include <string>

#include <base/files/file_path.h>
#include <base/macros.h>
#include <base/observer_list.h>

#include "power_manager/powerd/system/backlight_interface.h"
#include "power_manager/powerd/system/udev_subsystem_observer.h"

namespace power_manager {
namespace system {

class BacklightObserver;
class InternalBacklight;
struct UdevEvent;
class UdevInterface;

// This class wraps the InternalBacklight class, refreshing it in response to
// udev events about the backlight being added or removed.
class PluggableInternalBacklight : public BacklightInterface,
                                   public UdevSubsystemObserver {
 public:
  PluggableInternalBacklight();
  PluggableInternalBacklight(const PluggableInternalBacklight&) = delete;
  PluggableInternalBacklight& operator=(const PluggableInternalBacklight&) =
      delete;

  ~PluggableInternalBacklight() override;

  // Ownership of |udev| remains with the caller.
  void Init(UdevInterface* udev,
            const std::string& udev_subsystem,
            const base::FilePath& base_path,
            const std::string& pattern);

  // BacklightInterface:
  void AddObserver(BacklightObserver* observer) override;
  void RemoveObserver(BacklightObserver* observer) override;
  bool DeviceExists() override;
  int64_t GetMaxBrightnessLevel() override;
  int64_t GetCurrentBrightnessLevel() override;
  bool SetBrightnessLevel(int64_t level, base::TimeDelta interval) override;
  BrightnessScale GetBrightnessScale() override;
  bool TransitionInProgress() const override;

  // UdevSubsystemObserver:
  void OnUdevEvent(const UdevEvent& event) override;

 private:
  // Recreates |device_|, setting it to null if the device wasn't found.
  void UpdateDevice();

  base::ObserverList<BacklightObserver> observers_;

  UdevInterface* udev_ = nullptr;  // Not owned.

  // udev subsystem used to observe |udev_|.
  std::string udev_subsystem_;

  // Information used to find the backlight device. See the InternalBacklight
  // class for details.
  base::FilePath base_path_;
  std::string pattern_;

  // The underlying backlight device, or null when the device isn't present.
  std::unique_ptr<InternalBacklight> device_;
};

}  // namespace system
}  // namespace power_manager

#endif  // POWER_MANAGER_POWERD_SYSTEM_PLUGGABLE_INTERNAL_BACKLIGHT_H_
