struct AddrLEDCtrlSeqPair {
  std::vector<int> targets;
  AddrLEDSequence addrLedSeq;
};

//  addrLedCtrl_0 corresponds to the WS2812 LED strip
AddrLEDControl addrLedCtrl_0;

//  LED color sequence
AddrLEDSequence addrLedSeq_pinknormal;
AddrLEDSequence addrLedSeq_redangry;
AddrLEDSequence addrLedSeq_bluesleepy;
AddrLEDSequence addrLedSeq_whitehappy;

//  for defining each group of LED(s)
std::vector<int> targets_0;

/*
  commands:
  
  addSetRGB(duration_ms,R,G,B)
  - duration_ms - in milliseconds
  - R, G, B - RGB color value, from 0 to 255
  
  addSetHSV(duration_ms,H,S,V)
  - duration_ms - in millseconds
  - H - hue, from 0 to 359
  - S - saturation, from 0 to 100
  - V - value, from 0 to 100 
  - refer to https://learn.leighcotnoir.com/artspeak/elements-color/hue-value-saturation
  
  addInterpolateRGB(duration_ms,start_R,start_G,start_B,end_R,end_G,end_B)
  - duration_ms - in milliseconds
  - start_R, start_G, start_B - starting value of R, G and B
  - end_R, end_G, end_B - ending value of R, G and B
  
  addInterpolateHSV(duration_ms,start_H,start_S,start_V,end_H,end_S,end_V)
  - duration_ms - in milliseconds
  - start_H, start_S, start_V - starting value of H, S and V
  - end_H, end_S, end_V - ending value of H, S and V
  
*/

err_t initAddrLedCtrlObjs() {
  err_t err;

  err = addrLedCtrl_0.init(5, 2, true);
  //  WS2812 is associated with IO05, and with 20 LEDs on the strip
  if (err) {
    return err;
  }

  addrLedCtrl_0.enableScheduler(0, 100, nullptr);

  return Control_OK;
}

err_t clearAddrLedCtrlObjs() {

  addrLedSeq_pinknormal.clearCommand();
  addrLedSeq_redangry.clearCommand();
  addrLedSeq_bluesleepy.clearCommand();
  addrLedSeq_whitehappy.clearCommand();
  addrLedCtrl_0.setRGB(targets_0, 0, 0, 0);

  addrLedCtrl_0.release();

  return Control_OK;
}

bool isAllFinish_addrLed() {
  if (addrLedCtrl_0.seqObjs.size() == 0) {
    return false;
  }
  bool isAddrLedFinished = true;
  for (int i = 0; i < addrLedCtrl_0.seqObjs.size(); i++) {
    if (addrLedCtrl_0.seqObjs[i] != nullptr) {
      isAddrLedFinished = false;
      return false;
    }
  }

  return true;
}

err_t setAddrLedSequences() {
  err_t err;


  //
  //  define addrLedSeq_pinknormal
  //
  err = addrLedSeq_pinknormal.addSetRGB(2000, 255, 192, 203);
  if (err) {
    return err;
  }
  err = addrLedSeq_pinknormal.addSetRGB(2000, 255, 192, 203);
  if (err) {
    return err;
  }
  
  //
  //  define addrLedSeq_redangry
  //
  err = addrLedSeq_redangry.addSetRGB(2000, 255, 0, 0);
  if (err) {
    return err;
  }
  
  //
  //  define addrLedSeq_bluesleepy
  //
  err = addrLedSeq_bluesleepy.addSetRGB(2000, 0, 100, 255);
  if (err) {
    return err;
  }
  
  //
  //  define addrLedSeq_whitehappy
  //
  err = addrLedSeq_whitehappy.addSetRGB(2000, 255, 255, 255);
  if (err) {
    return err;
  }
  

  return Control_OK;
}

void createAddrLedTargets() {

  targets_0.push_back(0);
  targets_0.push_back(1);

}