#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel Herz(71, 3, NEO_GRB + NEO_KHZ800); //Anzahl Pixel | Pin //3
Adafruit_NeoPixel Schulterteil(10, 2, NEO_GRB + NEO_KHZ800); //4
Adafruit_NeoPixel Rueckenteil(12, 4, NEO_GRB + NEO_KHZ800); //5

Adafruit_NeoPixel Lichter_Array[3] = {Herz, Schulterteil, Rueckenteil};

int blau[3] = {0, 40, 255};
int rot[3] = {255, 10, 0};

int Rueckenteil_farben[12][3];
int Herz_farben[4][3];
int Herz_farben_2[8][3];

int farben_dif_ruecken[3];
int farben_dif_herz[3];

void setup() {
  Serial.begin(9600);

  for (int i = 0; i < 3; i++) {
    Lichter_Array[i].begin();
    Lichter_Array[i].show();
  }
  Rueckenteil.setBrightness(100);
  Herz.setBrightness(70);
  Schulterteil.setBrightness(100);
  delay(500);
  Test();

  Rueckenteil_Start();
  Herz_Start();
}

void Test() {
  for (int i = 0; i < 3; i++) {
    Lichter_Array[i].setPixelColor(0, Lichter_Array[i].Color(0, 255, 0));
    Lichter_Array[i].show();
    delay(300);
    Lichter_Array[i].setPixelColor(0, Lichter_Array[i].Color(0, 0, 0));
    Lichter_Array[i].show();
  }
}

void Rueckenteil_Start() {
  for (int i = 0; i < 3; i++) {
    farben_dif_ruecken[i] = rot[i] - blau[i];
  }
  for (int i = 0; i < 3; i++) {
    farben_dif_ruecken[i] = farben_dif_ruecken[i] / 11;
  }
  for (int i = 0; i < 12; i++) {
    for (int s = 0; s < 3; s++) {
      if (i < 4) {
        Rueckenteil_farben[i][s] = (rot[s] - 0.6 * (i * farben_dif_ruecken[s]));
      } else {
        Rueckenteil_farben[i][s] = (rot[s] - (i * farben_dif_ruecken[s]));
      }
      Serial.print(Rueckenteil_farben[i][s]);
      Serial.print(" , ");
    }
    Serial.println();
  }
  for (int i = 0; i < 12; i++) {
    Rueckenteil.setPixelColor(i, Rueckenteil.Color(Rueckenteil_farben[i][0], Rueckenteil_farben[i][1], Rueckenteil_farben[i][2]));
    Rueckenteil.show();
    delay(150);
  }
}

void Herz_Start() {
  for (int i = 0; i < 3; i++) {
    farben_dif_herz[i] = rot[i] - blau[i];
  }
  for (int i = 0; i < 3; i++) {
    farben_dif_herz[i] = farben_dif_herz[i] / 3;
  }
  for (int i = 0; i < 4; i++) {
    for (int s = 0; s < 3; s++) {
      Herz_farben[i][s] = (rot[s] - (i * farben_dif_herz[s]));
      Serial.print(Herz_farben[i][s]);
      Serial.print(" , ");
    }
    Serial.println();
  }
  for (int i = 0; i < 71; i++) {
    if (i < 7) {
      Herz.setPixelColor(i, Herz.Color(Herz_farben[0][0], Herz_farben[0][1], Herz_farben[0][2]));
    } else if (i < 23) {
      Herz.setPixelColor(i, Herz.Color(Herz_farben[1][0], Herz_farben[1][1], Herz_farben[1][2]));
    } else if (i < 47) {
      Herz.setPixelColor(i, Herz.Color(Herz_farben[2][0] - 20, Herz_farben[2][1], Herz_farben[2][2] + 50));
    } else {
      Herz.setPixelColor(i, Herz.Color(Herz_farben[3][0], Herz_farben[3][1], Herz_farben[3][2]));
    }
    Herz.show();
    delay(80);
  }
}

void Herz_Main() {
  for (int i = 0; i < 8; i++) {
    if (i < 4) {
      Herz_farben_2[i][0] = Herz_farben[i][0];
      Herz_farben_2[i][1] = Herz_farben[i][1];
      Herz_farben_2[i][2] = Herz_farben[i][2];
    } else {
      Herz_farben_2[i][0] = Herz_farben[i - 4][0];
      Herz_farben_2[i][1] = Herz_farben[i - 4][1];
      Herz_farben_2[i][2] = Herz_farben[i - 4][2];
    }
  }
  
  for (int s = 3; s > 0; s--) {
    for (int i = 0; i < 71; i++) {
      if (i < 7) {
        Herz.setPixelColor(i, Herz.Color(Herz_farben_2[s][0], Herz_farben_2[s][1], Herz_farben_2[s][2]));
      } else if (i < 23) {
        Herz.setPixelColor(i, Herz.Color(Herz_farben_2[s + 1][0], Herz_farben_2[s + 1][1], Herz_farben_2[s + 1][2]));
      } else if (i < 47) {
        Herz.setPixelColor(i, Herz.Color(Herz_farben_2[s + 2][0], Herz_farben_2[s + 2][1], Herz_farben_2[s + 2][2]));
      } else {
        Herz.setPixelColor(i, Herz.Color(Herz_farben_2[s + 3][0], Herz_farben_2[s + 3][1], Herz_farben_2[s + 3][2]));
      }
    }
    Herz.show();
    delay(320);
  }
  
  for (int s = 0; s < 3; s++) {
    for (int i = 0; i < 71; i++) {
      if (i < 7) {
        Herz.setPixelColor(i, Herz.Color(Herz_farben_2[s][0], Herz_farben_2[s][1], Herz_farben_2[s][2]));
      } else if (i < 23) {
        Herz.setPixelColor(i, Herz.Color(Herz_farben_2[s + 1][0], Herz_farben_2[s + 1][1], Herz_farben_2[s + 1][2]));
      } else if (i < 47) {
        Herz.setPixelColor(i, Herz.Color(Herz_farben_2[s + 2][0], Herz_farben_2[s + 2][1], Herz_farben_2[s + 2][2]));
      } else {
        Herz.setPixelColor(i, Herz.Color(Herz_farben_2[s + 3][0], Herz_farben_2[s + 3][1], Herz_farben_2[s + 3][2]));
      }
    }
    Herz.show();
    delay(320);
  }
}

void loop() {
  Herz_Main();
}
