/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef SYSTEM_PERIPHERALMANAGER_DAEMON_LED_DRIVER_H_
#define SYSTEM_PERIPHERALMANAGER_DAEMON_LED_DRIVER_H_

#include <stdint.h>

#include <memory>
#include <string>

#include <base/macros.h>

namespace android {

class LedDriverInterface {
 public:
  LedDriverInterface() {}
  virtual ~LedDriverInterface() {}

  // TODO(leecam): Init should have generic params.
  virtual bool Init(const std::string& name) = 0;

  virtual bool SetBrightness(uint32_t val) = 0;

  virtual bool GetBrightness(uint32_t* val) = 0;

  virtual bool GetMaxBrightness(uint32_t* val) = 0;
};

class LedDriverInfoBase {
 public:
  LedDriverInfoBase() {}
  virtual ~LedDriverInfoBase() {}

  virtual std::string Compat() = 0;
  virtual std::unique_ptr<LedDriverInterface> Probe() = 0;
};

template <class T, class PARAM>
class LedDriverInfo : public LedDriverInfoBase {
 public:
  explicit LedDriverInfo(PARAM param) : param_(param) {}
  ~LedDriverInfo() override {}

  std::string Compat() override { return T::Compat(); }

  std::unique_ptr<LedDriverInterface> Probe() override {
    return std::unique_ptr<LedDriverInterface>(new T(param_));
  }

 private:
  PARAM param_;
};

}  // namespace android

#endif  // SYSTEM_PERIPHERALMANAGER_DAEMON_LED_DRIVER_H_
