#include <IRremote.hpp>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET    -1 // Reset pin # (or -1 if sharing Arduino reset)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const int RECV_PIN = 2;   // IR imtuvo OUT
const int OUT_PIN4 = 4;   // volume UP
const int OUT_PIN5 = 5;   // volume DOWN
const int OUT_PIN6 = 6;   // kanalas 1
const int OUT_PIN7 = 7;   // kanalas 2
const int OUT_PIN8 = 8;   // kanalas 3
const int OUT_PIN9 = 9;   // kanalas 4
const int OUT_PIN11 = 11; // valdomas išėjimas (stiprintuvo ON/OFF)
const int SPK_PIN = 10;  // deklaruojamas SPK išėjimo PIN
const int BTN_PIN = A0;   // priekyje esantis ON/OFF klavišas
const int BTN_CH1 = A1;   // CH1
const int BTN_CH2 = A2;   // CH2
const int BTN_CH3 = A3;   // CH3
const int BTN_CH4 = 3;   // CH4 nes A4 ir A5 užimti LCD indikacijos (I2C)

bool outState = LOW; // dabartinė OUT_PIN11 būsena
bool spkState = LOW;
bool spkDelayActive = false;
unsigned long spkDelayStart = 0;
unsigned long lastCode = 0;
unsigned long lastReceivedTime = 0;
int buttonHash;
const unsigned long timeout = 200; // ms

// Pultelio mygtukų HEX kodai,nukopijuoti iš serial monitor
const unsigned long BTN_VOL1 = 0xFD02FB04;
const unsigned long BTN_VOL2 = 0xFC03FB04;

// Pultelio Kanalų mygtukai
const unsigned long BTN_IR_CH1 = 0xEE11FB04;
const unsigned long BTN_IR_CH2 = 0xED12FB04;
const unsigned long BTN_IR_CH3 = 0xEC13FB04;
const unsigned long BTN_IR_CH4 = 0xEB14FB04;

void setup() {
 // Inicializuojam LCD
  // lcd.init();
  // lcd.backlight();
  Serial.begin(9600);

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't continue
  }

  display.clearDisplay();
  display.display();

  pinMode(OUT_PIN11, OUTPUT);
  digitalWrite(OUT_PIN11, LOW);

  pinMode(OUT_PIN4, OUTPUT);
  pinMode(OUT_PIN5, OUTPUT);
  pinMode(OUT_PIN6, OUTPUT);
  pinMode(OUT_PIN7, OUTPUT);
  pinMode(OUT_PIN8, OUTPUT);
  pinMode(OUT_PIN9, OUTPUT);
  pinMode(SPK_PIN, OUTPUT);

  // Fiziniai klavišai su vidiniu pull-up
  pinMode(BTN_PIN, INPUT_PULLUP);
  pinMode(BTN_CH1, INPUT_PULLUP);
  pinMode(BTN_CH2, INPUT_PULLUP);
  pinMode(BTN_CH3, INPUT_PULLUP);
  pinMode(BTN_CH4, INPUT_PULLUP);

  Serial.begin(9600);
  IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK);
}

void loop() {

  if (IrReceiver.decode()) {
    uint32_t value = IrReceiver.decodedIRData.decodedRawData;

    if (value != 0xFFFFFFFF) {
      lastCode = value;
      Serial.print("Gautas kodas: 0x");
      Serial.println(value, HEX);
    }

    lastReceivedTime = millis();

    // Stiprintuvo ON/OFF
    if (value == 0xF708FB04) {
      toggleOutState();
    }

    // Kanalų valdymas per IR
    if (value == BTN_IR_CH1) setChannel(1);
    if (value == BTN_IR_CH2) setChannel(2);
    if (value == BTN_IR_CH3) setChannel(3);
    if (value == BTN_IR_CH4) setChannel(4);

    IrReceiver.resume();
  }

  // Volume mygtukų laikymo logika
  if (millis() - lastReceivedTime < timeout) {
    if (lastCode == BTN_VOL1) {
      digitalWrite(OUT_PIN4, HIGH);
      digitalWrite(OUT_PIN5, LOW);
    } else if (lastCode == BTN_VOL2) {
      digitalWrite(OUT_PIN4, LOW);
      digitalWrite(OUT_PIN5, HIGH);
    }
  } else {
    digitalWrite(OUT_PIN4, LOW);
    digitalWrite(OUT_PIN5, LOW);
  }

  // --- Fiziniai klavišai ---
  handleButton(BTN_PIN);   // A0 = ON/OFF toggle
  handleChannelButton(BTN_CH1, 1);
  handleChannelButton(BTN_CH2, 2);
  handleChannelButton(BTN_CH3, 3);
  handleChannelButton(BTN_CH4, 4);

  // SPK užlaikymas
  if (spkDelayActive) {
    if (millis() - spkDelayStart >= 3000) {
      digitalWrite(SPK_PIN, HIGH);
      spkDelayActive = false;
    }
  }
}

void toggleOutState() {
  outState = !outState;
  digitalWrite(OUT_PIN11, outState);

  if (outState == HIGH) {
    // Įjungiam 1 kanalą kartu su stiprintuvu
    digitalWrite(OUT_PIN6, HIGH);

    // startuojam 3 s laikmatį SPK
    spkDelayActive = true;
    spkDelayStart = millis();
  } else {
    // jei OUT išjungtas – SPK iškart išjungiam
    spkDelayActive = false;
    digitalWrite(SPK_PIN, LOW);
    // Išjungiam visus kanalus
    digitalWrite(OUT_PIN6, LOW);
    digitalWrite(OUT_PIN7, LOW);
    digitalWrite(OUT_PIN8, LOW);
    digitalWrite(OUT_PIN9, LOW);
  }

}

// Kanalų nustatymas

void setChannel(int ch) {
  if (outState == LOW) {
    // Jei stiprintuvas išjungtas, neišjungiame kanalų, tik užtikriname, kad visi išjungti
    digitalWrite(OUT_PIN6, LOW);
    digitalWrite(OUT_PIN7, LOW);
    digitalWrite(OUT_PIN8, LOW);
    digitalWrite(OUT_PIN9, LOW);
    return;
  }
  digitalWrite(OUT_PIN6, ch == 1 ? HIGH : LOW);
  digitalWrite(OUT_PIN7, ch == 2 ? HIGH : LOW);
  digitalWrite(OUT_PIN8, ch == 3 ? HIGH : LOW);
  digitalWrite(OUT_PIN9, ch == 4 ? HIGH : LOW);

  Serial.print("Aktyvus kanalas: ");
  Serial.println(ch);
}

// ON/OFF mygtukas
void handleButton(int pin) {
  static bool lastState = HIGH;
  bool state = digitalRead(pin);

  if (lastState == HIGH && state == LOW) {
    toggleOutState();
    Serial.println("Fizinis ON/OFF klavišas");
  }
  lastState = state;
}

// Kanalų mygtukai
void handleChannelButton(int pin, int ch) {
  static bool lastState[20];
  bool state = digitalRead(pin);

  if (lastState[pin] == HIGH && state == LOW) {
    setChannel(ch);
  }
  lastState[pin] = state;

int OUT_PIN11State = digitalRead(OUT_PIN11);
   int OUT_PIN6State = digitalRead(OUT_PIN6);
   int OUT_PIN7State = digitalRead(OUT_PIN7);
   int OUT_PIN8State = digitalRead(OUT_PIN8);
   int OUT_PIN9State = digitalRead(OUT_PIN9);
   int SPK_PINState = digitalRead(SPK_PIN);
   int tmpHash = 0;

  tmpHash |= (OUT_PIN6State << 0) | (OUT_PIN7State << 1) | (OUT_PIN8State << 2) | (OUT_PIN9State << 3) | (SPK_PINState << 4);
  if (buttonHash != tmpHash) {
    buttonHash = tmpHash;
    
  }
// displėjus inicijuojamas
 display.display();
display.setTextSize(1);      // smulkus tekstas
  display.setTextColor(SSD1306_WHITE);

  display.display();
  display.setCursor(0,0);       // Viršutinis kairys kampas
display.clearDisplay(); // Nuvalome ekraną
  if (OUT_PIN6State == HIGH) {
    display.setCursor(20, 5);
    display.print("STREAMER INPUT 1");
    // piešiame rėmelį aplink tekstą
    display.drawRect(0, 0, display.width() - 1, display.height() - 1, WHITE);
  }

  if (OUT_PIN7State == HIGH) {
    display.setCursor(30, 5);
    display.clearDisplay(); // Nuvalome ekraną
    display.print("AUX INPUT 2");
    display.drawRect(0, 0, display.width() - 1, display.height() - 1, WHITE);
  }
  if (OUT_PIN8State == HIGH) {
    display.setCursor(10, 5);
    display.clearDisplay(); 
    display.print("TAPE REC. INPUT 3");
    display.drawRect(0, 0, display.width() - 1, display.height() - 1, WHITE);
  }
  if (OUT_PIN9State == HIGH) {
    display.setCursor(12, 5);
    display.clearDisplay(); 
    display.print("CD PLAYER INPUT 4");
    display.drawRect(0, 0, display.width() - 1, display.height() - 1, WHITE);
  }

  if (SPK_PINState == HIGH) {
    display.setTextSize(1); 
    display.setCursor(30, 18);
    display.print("SPEAKERS ON");
  }
   else if (SPK_PINState == LOW) {
    display.setTextSize(1); 
    display.setCursor(30, 18); 
    display.print("SPEAKERS OFF");
   
  }
  
    if (OUT_PIN11State == LOW) {
       display.clearDisplay(); // Išjungiame ekraną
  
  } 
  
}
