#pragma once

#include "effects/Common.h"
#include "helpers/ColorRGBW.h"

struct EffectStaticConfig
{
  EffectStaticConfig(const ColorRGBW &c = ColorRGBW{0, 0, 0, 0}, uint16_t beg = 0, uint16_t en = 0)
      : color(c), begin(beg), end(en) {}

  ColorRGBW color;
  uint16_t begin = 0;
  uint16_t end = 0;
};

template <typename TLedStrip>
class EffectStatic
{
public:
  static constexpr auto NUM_LEDS = numLeds<TLedStrip>();

  EffectStatic(const EffectStaticConfig &cfg, TLedStrip &ledStrip)
      : config_(cfg),
        ledStrip_(ledStrip)
  {
  }

  int operator()()
  {
    if (config_.begin == config_.end)
      setLedRGBW(ledStrip_, 0, NUM_LEDS, config_.color);
    else
      setLedRGBW(ledStrip_, config_.begin, config_.end, config_.color);

    return 10000; // nothing changing, return some large time to sleep
  }

private:
  EffectStaticConfig config_;
  TLedStrip &ledStrip_;
};

// Traits
template <>
struct EffectIdToConfig<EffectId::STATIC>
{
  using type = EffectStaticConfig;
};

template <>
struct EffectConfigToId<EffectStaticConfig>
{
  static constexpr auto id = EffectId::STATIC;
};

template <typename TLedStrip>
struct EffectIdToClass<EffectId::STATIC, TLedStrip>
{
  using type = EffectStatic<TLedStrip>;
};