#include <IRremote.hpp>

const int receiverPin = 7;   // Pin connected to IR receiver
const int ledWhitePin = 8;   // Pin connected to LED 1 (White)
const int ledRedPin = 9;     // Pin connected to LED 2 (Red)
const int ledYellowPin = 10; // Pin connected to LED 3 (Yellow)
const int ledOrange4Pin = 11;// Pin connected to LED 4 (Orange)
const int ledOrange5Pin = 12;// Pin connected to LED 5 (Orange)

bool ledWhiteState = false;
bool ledRedState = false;
bool ledYellowState = false;
bool ledOrange4State = false;
bool ledOrange5State = false;
bool syncBlinkState = false;

unsigned long previousMillis = 0;
const long interval = 500;  // Interval for blinking (500 ms)

void setup() {
  pinMode(ledWhitePin, OUTPUT);
  pinMode(ledRedPin, OUTPUT);
  pinMode(ledYellowPin, OUTPUT);
  pinMode(ledOrange4Pin, OUTPUT);
  pinMode(ledOrange5Pin, OUTPUT);

  IrReceiver.begin(receiverPin, ENABLE_LED_FEEDBACK);  // Initialize the IR receiver
  Serial.begin(9600);  // Initialize serial communication for debugging
}

void loop() {
  if (IrReceiver.decode()) {  // Check if a signal is received
    unsigned long keyValue = IrReceiver.decodedIRData.command;  // Get the command from the IR signal
    Serial.println(keyValue, HEX);  // Print the value received for debugging

    switch (keyValue) {
      case 0x30:  // Code for button "1"
        ledWhiteState = !ledWhiteState;
        digitalWrite(ledWhitePin, ledWhiteState);
        break;
      case 0x18:  // Code for button "2"
        ledRedState = !ledRedState;
        digitalWrite(ledRedPin, ledRedState);
        break;
      case 0x7A:  // Code for button "3"
        ledYellowState = !ledYellowState;
        digitalWrite(ledYellowPin, ledYellowState);
        break;
      case 0x10:  // Code for button "4"
        ledOrange4State = !ledOrange4State;  // Toggle blinking of LED 4
        break;
      case 0x38:  // Code for button "5"
        ledOrange5State = !ledOrange5State;  // Toggle blinking of LED 5
        break;
      case 0x5A:  // Code for button "6"
        syncBlinkState = !syncBlinkState;  // Toggle synchronized blinking of LEDs 4 and 5
        break;
    }

    IrReceiver.resume();  // Prepare for the next value
  }

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    if (syncBlinkState) {
      digitalWrite(ledOrange4Pin, !digitalRead(ledOrange4Pin));
      digitalWrite(ledOrange5Pin, !digitalRead(ledOrange5Pin));
    } else {
      if (ledOrange4State) {
        digitalWrite(ledOrange4Pin, !digitalRead(ledOrange4Pin));  // Toggle LED 4
      } else {
        digitalWrite(ledOrange4Pin, LOW);
      }

      if (ledOrange5State) {
        digitalWrite(ledOrange5Pin, !digitalRead(ledOrange5Pin));  // Toggle LED 5
      } else {
        digitalWrite(ledOrange5Pin, LOW);
      }
    }
  }
}