#include <Arduino.h>
#include "BluetoothSerial.h"
#include <Adafruit_NeoPixel.h>

#define PIN_LEDs_strip 17  // arduino pin to send data to the LED_strip
#define NUMPIXELS_strip 40 // amount of LEDs on the strip
#define ONBOARD_LED 12

BluetoothSerial SerialBT;

// initialize the LED strip
Adafruit_NeoPixel pixels1(NUMPIXELS_strip, PIN_LEDs_strip, NEO_GRB + NEO_KHZ800);

int IN1 = 32;
int IN2 = 33;
int IN3 = 25;
int IN4 = 26;
int state = 0; // 0 = Bereit, 1 = Foto machen, 3 = nicht aktiv
bool fristrun = true;

void setPixel(int Pixel, byte red, byte green, byte blue)
{

  pixels1.setPixelColor(Pixel, pixels1.Color(red, green, blue));
}
void setAll(byte red, byte green, byte blue)
{

  pixels1.clear();
  for (int i = 0; i < NUMPIXELS_strip; i++)
  {

    setPixel(i, red, green, blue);
  }
  pixels1.show();
  delay(100);
}

// ----- Effekte -----

void staticStripColor()
{

  // if (pinState1 != buttonState1) {   // status of the button has changed

  //   if (pinState1 == LOW) {          // asks if the is pressed

  //     buttonCounter1++;              // variable buttonCounter counts up by 1
  //     Serial.print("Color: ");
  //     Serial.println(buttonCounter1);
  //   }

  // }
  // buttonState1 = pinState1;      // save the status

  // switch (buttonCounter1) {

  //   case 1: setAll(255, 0, 0); //red
  //     break;
  //   case 2: setAll(0, 255, 0); //green
  //     break;
  //   case 3: setAll(0, 0, 255); //blue
  //     break;
  //   case 4: setAll(255, 0, 255); //magenta
  //     break;
  //   case 5: setAll(0, 255, 255); //cyan
  //     break;
  //   case 6: setAll(255, 255, 255); //whitw
  //     break;
  //   default: setAll(255, 255, 0); //yellow
  //     buttonCounter1 = 0;
  //     break;

  // }
}

void RGBLoop()
{

  for (int j = 0; j < 3; j++)
  {
    // Fade IN
    for (int k = 0; k < 256; k++)
    {
      switch (j)
      {
      case 0:
        setAll(k, 0, 0);
        break;
      case 1:
        setAll(0, k, 0);
        break;
      case 2:
        setAll(0, 0, k);
        break;
      }
      pixels1.show();
      delay(3);
    }
    // Fade OUT
    for (int k = 255; k >= 0; k--)
    {
      switch (j)
      {
      case 0:
        setAll(k, 0, 0);
        break;
      case 1:
        setAll(0, k, 0);
        break;
      case 2:
        setAll(0, 0, k);
        break;
      }
      pixels1.show();
      delay(3);
    }
  }
}

void CylonBounce(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay)
{

  for (int i = 0; i < NUMPIXELS_strip - EyeSize - 2; i++)
  {
    setAll(0, 0, 0);
    setPixel(i, red / 10, green / 10, blue / 10);
    for (int j = 1; j <= EyeSize; j++)
    {
      setPixel(i + j, red, green, blue);
    }
    setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10);
    pixels1.show();
    delay(SpeedDelay);
  }

  delay(ReturnDelay);

  for (int i = NUMPIXELS_strip - EyeSize - 2; i > 0; i--)
  {
    setAll(0, 0, 0);
    setPixel(i, red / 10, green / 10, blue / 10);
    for (int j = 1; j <= EyeSize; j++)
    {
      setPixel(i + j, red, green, blue);
    }
    setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10);
    pixels1.show();
    delay(SpeedDelay);
  }

  delay(ReturnDelay);
}

void SnowSparkle(byte red, byte green, byte blue, int SparkleDelay, int SpeedDelay)
{

  setAll(red, green, blue);
  int Pixel = random(NUMPIXELS_strip);
  setPixel(Pixel, 0xff, 0xff, 0xff);
  pixels1.show();
  delay(SparkleDelay);
  setPixel(Pixel, red, green, blue);
  pixels1.show();
  delay(SpeedDelay);
}

void RunningLights(byte red, byte green, byte blue, int WaveDelay)
{

  int Position = 0;

  for (int j = 0; j < NUMPIXELS_strip * 2; j++)
  {
    Position++; // = 0; //Position + Rate;
    for (int i = 0; i < NUMPIXELS_strip; i++)
    {

      setPixel(i, ((sin(i + Position) * 127 + 128) / 255) * red,
               ((sin(i + Position) * 127 + 128) / 255) * green,
               ((sin(i + Position) * 127 + 128) / 255) * blue);
    }

    pixels1.show();
    delay(WaveDelay);
  }
}

void setup()
{
  // Add your initialization code here
  Serial.begin(115200);
  SerialBT.onAuthComplete([](bool success)
                          {
    if (success) {
        Serial.println("Bluetooth Authentifizierung erfolgreich");
        setAll(0, 255, 0); //green
    } else {
        Serial.println("Bluetooth Authentifizierung fehlgeschlagen");
    } });

  SerialBT.begin("FotoBoxButton"); // Bluetooth device name

  // Setup for LED strip
  pixels1.begin();           // start the LED strip
  pixels1.setBrightness(10); // set the brightness 0....255

  Serial1.println("******************************");
  Serial1.println("*    FotoBox Button V1.0     *");
  Serial1.println("*   (c) 2026 by Mike Haid    *");
  Serial1.println("******************************");
  setAll(255, 0, 0); // red
  // RGBLoop();
  Serial.println("Button Bereit. Warte auf Verbindung... Bitte mit Bluetooth verbinden. FotoBoxButton");
  pinMode(ONBOARD_LED, OUTPUT);
  pinMode(IN1, INPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  state = 9;                      // nicht aktiv
  digitalWrite(ONBOARD_LED, LOW); // Turn the LED on (HIGH is the voltage level)
  Serial.println("Hallo");
}

// The loop function is called in an endless loop
void loop()
{
  // Add your repeated code here

  if (!SerialBT.hasClient())
  {
    Serial.println("Erster Durchlauf im Loop");
    setAll(255, 0, 0);
    digitalWrite(ONBOARD_LED, LOW);
    do
    {
      Serial.println("Warte auf Bluetooth Verbindung...");
      delay(1000);
    } while (!SerialBT.hasClient());
    Serial.println("Bluetooth verbunden!");
    SerialBT.println("Verbunden mit FotoBoxButton - der Spass kann beginnen :-)");
    state = 0; // zurück in den Bereit Zustand
    fristrun = false;
    RunningLights(255, 0, 0, 50);
    setAll(0, 255, 0); // green
  }
  else
  {

    if (SerialBT.hasClient())
    {
      int buttonState = digitalRead(IN1); // Liest den Zustand des Tasters

      if (buttonState == HIGH && state == 0)
      { // Taster gedrückt (bei INPUT_PULLUP)
        Serial.println("Taster gedrückt!");

        Serial.println("Bluetooth verbunden, sende Signal...");
        SerialBT.println("BP#");
        state = 1; // in den Foto machen Zustand
       /*  for (int i = 0; i < 10; i++)
        {
          setAll(0, 0, 255);               // blue
          digitalWrite(ONBOARD_LED, HIGH); // LED ausschalten
          delay(100);
          digitalWrite(ONBOARD_LED, LOW); // LED einschalten
          setAll(255, 192, 203);          // pink
          delay(100);
        };
        //setAll(0, 255, 0); // green */
        setAll(255, 192, 203);
      }
      else
      {
        switch (state)

        {
        case 0:
          /* nothing */
          /* code */
          digitalWrite(ONBOARD_LED, HIGH);
          break;

        case 1:                // Foto machen
          setAll(0, 0, 255); // blue
          digitalWrite(ONBOARD_LED, HIGH); // LED ausschalten
          state = 10;          // zurück in den Bereit Zustand
          delay(100);          // kurze Pause
          break;
        case 10:           // Foto gemacht
          setAll(255, 192, 203); // pink
          state = 1;       // wieder in den Foto machen Zustand
          digitalWrite(ONBOARD_LED, LOW);
          delay(100);      // kurze Pause
          break;

        default:
          break;
        }

        // Serial.println("Kein Bluetooth Client verbunden.");
      }
    }
    else
    {
      Serial.println("Kein Bluetooth Client verbunden.");
      digitalWrite(ONBOARD_LED, LOW);
      setAll(255, 0, 0); // red
    }
  }

  // Hier weitere Aktionen einfügen (z.B. LED einschalten)
  delay(50); // Kurzes Delay zum Entprellen (einfachste Methode)

  if (Serial.available())
  {
    SerialBT.write(Serial.read());
  }
  if (SerialBT.available())
  {
    String incoming = SerialBT.readStringUntil('\n');

    if (incoming == "ok")
    {
      state = 0;
      setAll(0, 255, 0); // green
    }

    if (incoming == "off")
    {
      state = -1;
      digitalWrite(ONBOARD_LED, LOW);
      setAll(0,0,0); 
    }

    if (incoming == "stop")
    {
      setAll(255, 0, 0); // red
      digitalWrite(ONBOARD_LED, LOW);
      state = 9;
    }

    Serial.print("Empfangen über Bluetooth: ");
    Serial.println(incoming);
    Serial.print("Status gesetzt auf: ");
    Serial.println(state);
  }
  delay(20);
}
