#pragma once

#include "light_modes.h"

namespace esphome {
namespace xiaomi {
namespace bslamp2 {

/**
 * This abstract class is used for implementing classes that translate
 * LightColorValues into the required GPIO PWM duty cycle levels to represent
 * the requested color on the physical device.
 */
class GPIOOutputs {
 public:
  float red = 0.0f;
  float green = 0.0f;
  float blue = 0.0f;
  float white = 0.0f;
  std::string light_mode = LIGHT_MODE_OFF;

  /**
   * Sets the red, green, blue, white fields to the PWM duty cycles
   * that are required to represent the requested light color for
   * the provided LightColorValues input.
   *
   * Returns true when the input can be handled, false otherwise.
   */
  virtual bool set_light_color_values(light::LightColorValues v) = 0;

  /**
   * Copies the current output values to another GPIOOutputs object.
   */
  void copy_to(GPIOOutputs *other) {
    other->red = red;
    other->green = green;
    other->blue = blue;
    other->white = white;
    other->light_mode = light_mode;
  }

  void log(const char *prefix) { ESP_LOGD(TAG, "%s: RGB=[%f,%f,%f], white=%f", prefix, red, green, blue, white); }
};

}  // namespace bslamp2
}  // namespace xiaomi
}  // namespace esphome
