// #include <TimerOne.h>

const int ampelou[] = {1, 2, 3};  // Ampel oben/unten (1)
const int ampellr[] = {4, 5, 6};  // Ampel links/rechts (2)

bool phase = true;  // toggle zwischen Ampel 1 und 2
bool pauseState = false;

unsigned long pauseStartTime = 0;
unsigned long shortPauseStart = 0;
unsigned long wechselPauseStart = 0;

void setup() {
  Serial.begin(9600);

  for (int i = 0; i < 3; i++) {
    pinMode(ampelou[i], OUTPUT);  // Deklaration der pins für Ampel als Output
    pinMode(ampellr[i], OUTPUT);  // Deklaration der pins für Ampel als Output
  }

  // Timer1.initialize(1000000);
  // Timer1.attachInterrupt(schaltung);  // Interrupt wird der Funktion "schaltung" hinzugefügt
  digitalWrite(ampelou[2], HIGH);
  digitalWrite(ampellr[0], HIGH);
}

void loop() {
  if (pauseState) {
    checkPause();
  }
}

void schaltung() {
  const int* ampel; // Zeiger für den toggle zwischen Ampel 1 und 2
  if (phase) {
    ampel = ampelou;
  } else {
    ampel = ampellr;
  }
  for (int i = 0; i < 3; i++) {
    digitalWrite(ampel[i], HIGH);
    wechselPause(); // Funktion für die 1 Sekunde Pause zwischen den Umschalten bspw. von Grün auf Gelb.
    if (i == 2) {
      for(int i = 1; i < 3; i++){
        digitalWrite(ampel[i], LOW);
      }
      startPause(); // Entsprechende Pause der Ampeln
    }
  }

  for (int i = 2; i >= 0; i--) {
    digitalWrite(ampel[i], HIGH);
    if (i == 2) {
      digitalWrite(ampel[i], LOW);
    }
    wechselPause(); 
    digitalWrite(ampel[i], LOW);
  }
  shortPause(); // 5 Sekunden Pause, wo beide Ampeln Rot sind
  phase = !phase;
}

void startPause() {
  pauseState = true;
  pauseStartTime = millis();
  // Timer1.detachInterrupt();
}

void checkPause() {
  int pause;  // Variable für die unterschiedlich lange Grün-Phasen
  if (phase) {
    pause = 20000;
  } else {
    pause = 15000;
  }

  if (millis() - pauseStartTime >= pause) {
    pauseState = false;
    // Timer1.attachInterrupt(schaltung);
  }
}

void shortPause() {
  int pause = 5000;
  shortPauseStart = millis(); // Startzeit setzen
  while (millis() - shortPauseStart < pause);  // Warte 5 Sekunden
}

void wechselPause() {
  int pause = 1000;
  wechselPauseStart = millis(); // Startzeit setzen
  while (millis() - wechselPauseStart < pause);  // Warte 1 Sekunden
}