void setup() {
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Adafruit_NeoPixel.h>

// ======================== LED-Setup =========================
#define LED_PIN    5        // ESP8266 D1 (GPIO5) -> 74HCT125 -> WS2811 DIN
#define LED_COUNT  40       // Anzahl deiner Module
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_RGB + NEO_KHZ800);

// ==================== Access Point Daten ====================
const char* ssid = "ESP8266_LED";   // Name des WLANs vom ESP
const char* password = "12345678";  // Passwort (min. 8 Zeichen)

ESP8266WebServer server(80);

// ===================== LED-Steuerwerte ======================
int red = 255, green = 0, blue = 0;   // Standardfarbe Rot
int speed = 100;                      // Geschwindigkeit in ms
int brightness = 255;                 // Helligkeit (0–255)
int dir = 1;                          // Laufrichtung: 1 = vorwärts, -1 = rückwärts

const int pulseLength = 6;            // Anzahl LEDs im Puls
int currentPos = 0;                   // Startposition des Pulses
unsigned long lastUpdate = 0;

// ===================== HTTP Handler =========================
void handleSet() {
  if (server.hasArg("r")) red = server.arg("r").toInt();
  if (server.hasArg("g")) green = server.arg("g").toInt();
  if (server.hasArg("b")) blue = server.arg("b").toInt();

  if (server.hasArg("speed")) {
    int s = server.arg("speed").toInt();
    if (s > 10) speed = s;  // mind. 10 ms, um zu schnelle Updates zu vermeiden
  }

  if (server.hasArg("brightness")) {
    int b = server.arg("brightness").toInt();
    if (b >= 0 && b <= 255) brightness = b;
  }

  if (server.hasArg("dir")) {
    int d = server.arg("dir").toInt();
    dir = (d >= 0) ? 1 : -1;  // 1 = vorwärts, -1 = rückwärts
  }

  server.send(200, "text/plain", "OK");
}

// ========================= SETUP ============================
void setup() {
  Serial.begin(115200);
  strip.begin();
  strip.show();  // alle LEDs aus

  WiFi.softAP(ssid, password);
  IPAddress IP = WiFi.softAPIP();
  Serial.print("ESP AP IP: ");
  Serial.println(IP);

  strip.setBrightness(brightness);

  server.on("/set", handleSet);
  server.begin();
}

// ========================== LOOP ============================
void loop() {
  server.handleClient();

  unsigned long now = millis();
  if (now - lastUpdate >= (unsigned long)speed) {
    lastUpdate = now;

    strip.clear(); // alle LEDs aus

    // Puls LEDs setzen
    for (int i = 0; i < pulseLength; i++) {
      int ledIndex = currentPos + i;
      if (ledIndex >= strip.numPixels()) {
        ledIndex -= strip.numPixels();  // Wrap-around
      }

      // Spiegelung, falls der Strip "falsch herum" eingebaut ist:
      int physIndex = (strip.numPixels() - 1) - ledIndex;
      strip.setPixelColor(physIndex, strip.Color(red, green, blue));
    }

    strip.setBrightness(brightness);
    strip.show();

    // Puls weiter bewegen
    currentPos += dir;
    if (currentPos >= strip.numPixels()) currentPos = 0;
    if (currentPos < 0) currentPos = strip.numPixels() - 1;
  }
}
