#pragma once

#include "esphome/core/component.h"
#include "esphome/components/light/light_output.h"

namespace esphome::demo {

enum class DemoLightType {
  // binary
  TYPE_1,
  // brightness
  TYPE_2,
  // RGB
  TYPE_3,
  // RGBW
  TYPE_4,
  // RGBWW
  TYPE_5,
  // CWWW
  TYPE_6,
  // RGBW + color_interlock
  TYPE_7,
};

class DemoLight final : public light::LightOutput, public Component {
 public:
  void set_type(DemoLightType type) { type_ = type; }
  light::LightTraits get_traits() override {
    light::LightTraits traits{};
    switch (type_) {
      case DemoLightType::TYPE_1:
        traits.set_supported_color_modes({light::ColorMode::ON_OFF});
        break;
      case DemoLightType::TYPE_2:
        traits.set_supported_color_modes({light::ColorMode::BRIGHTNESS});
        break;
      case DemoLightType::TYPE_3:
        traits.set_supported_color_modes({light::ColorMode::RGB});
        break;
      case DemoLightType::TYPE_4:
        traits.set_supported_color_modes({light::ColorMode::RGB_WHITE});
        break;
      case DemoLightType::TYPE_5:
        traits.set_supported_color_modes({light::ColorMode::RGB_COLOR_TEMPERATURE});
        traits.set_min_mireds(153);
        traits.set_max_mireds(500);
        break;
      case DemoLightType::TYPE_6:
        traits.set_supported_color_modes({light::ColorMode::COLD_WARM_WHITE});
        traits.set_min_mireds(153);
        traits.set_max_mireds(500);
        break;
      case DemoLightType::TYPE_7:
        traits.set_supported_color_modes({light::ColorMode::RGB, light::ColorMode::WHITE});
        break;
    }
    return traits;
  }
  void write_state(light::LightState *state) override {
    // do nothing
  }

  DemoLightType type_;
};

}  // namespace esphome::demo
