/**
 * Copyright © 2019 IBM Corporation
 *
 * 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.
 */

#pragma once
#include <filesystem>

namespace phosphor
{
namespace led
{
class SysfsLed
{
  public:
    explicit SysfsLed(std::filesystem::path&& root) : root(std::move(root))
    {}
    SysfsLed() = delete;
    SysfsLed(const SysfsLed& other) = delete;
    SysfsLed(const SysfsLed&& other) = delete;
    SysfsLed& operator=(const SysfsLed& other) = delete;
    SysfsLed&& operator=(const SysfsLed&& other) = delete;

    virtual ~SysfsLed() = default;

    virtual unsigned long getBrightness();
    virtual void setBrightness(unsigned long brightness);
    virtual unsigned long getMaxBrightness();
    virtual std::string getTrigger();
    virtual void setTrigger(const std::string& trigger);
    virtual unsigned long getDelayOn();
    virtual void setDelayOn(unsigned long ms);
    virtual unsigned long getDelayOff();
    virtual void setDelayOff(unsigned long ms);

  protected:
    static constexpr const char* attrBrightness = "brightness";
    static constexpr const char* attrMaxBrightness = "max_brightness";
    static constexpr const char* attrTrigger = "trigger";
    static constexpr const char* attrDelayOn = "delay_on";
    static constexpr const char* attrDelayOff = "delay_off";

    std::filesystem::path root;
};
} // namespace led
} // namespace phosphor
