#include <Arduino.h>

#define BLINK_INTERVAL 500
#define DEBOUNCE_DELAY 50

volatile bool Button1 = false;
volatile bool Button2 = false;

volatile unsigned long lastDebounceTimeButton1 = 0;
volatile unsigned long lastDebounceTimeButton2 = 0;

bool lastButton1State = true; 
bool lastButton2State = true;

unsigned long lastBlinkTime = 0;
bool blinkState = false;

void setup() {
  // LEDs op D5 en D6 als output
  DDRD |= _BV(DDD5) | _BV(DDD6);

  // Knoppen D10 (PB2) en D11 (PB3) als input met pull-up
  DDRB &= ~(_BV(DDB2) | _BV(DDB3));
  PORTB |= _BV(PORTB2) | _BV(PORTB3);

  // Pin Change Interrupts activeren voor PB2 en PB3
  PCICR |= _BV(PCIE0); // Enable PCINT[7:0] (PORTB)
  PCMSK0 |= _BV(PCINT2) | _BV(PCINT3);

  sei();

  Serial.begin(9600);
}

ISR(PCINT0_vect) {
  unsigned long now = millis();

  // Lees huidige toestand
  bool currentButton1 = PINB & _BV(PINB2);
  bool currentButton2 = PINB & _BV(PINB3);

  // Detecteer falling edge voor button1 (hoog -> laag)
  if (lastButton1State && !currentButton1 && (now - lastDebounceTimeButton1 > DEBOUNCE_DELAY)) {
    Button1 = !Button1; // toggle status
    lastDebounceTimeButton1 = now;
  }

  // Detecteer falling edge voor button 2
  if (lastButton2State && !currentButton2 && (now - lastDebounceTimeButton2 > DEBOUNCE_DELAY)) {
    Button2 = !Button2; // toggle status
    lastDebounceTimeButton2 = now;
  }

  // Update vorige staat
  lastButton1State = currentButton1;
  lastButton2State = currentButton2;
}

void loop() {
  if (Button1 && !Button2) {
    PORTD |= _BV(PORTD5);
    PORTD &= ~_BV(PORTD6);
  } else if (!Button1 && Button2) {
    PORTD &= ~_BV(PORTD5);
    PORTD |= _BV(PORTD6);

    static unsigned long lastHelloTime = 0;
    if (millis() - lastHelloTime > 100) {
      Serial.println("Hello World!");
      lastHelloTime = millis();
    }
  } else if (Button1 && Button2) {
    if (millis() - lastBlinkTime >= BLINK_INTERVAL) {
      blinkState = !blinkState;
      lastBlinkTime = millis();
    }

    if (blinkState) {
      PORTD |= _BV(PORTD5);
      PORTD &= ~_BV(PORTD6);
    } else {
      PORTD &= ~_BV(PORTD5);
      PORTD |= _BV(PORTD6);
    }
  } else {
    PORTD &= ~(_BV(PORTD5) | _BV(PORTD6));
  }
}
