#include <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>
#include <Preferences.h>
#include <Wire.h>
#include <driver/i2s.h>
#include "Audio.h"
#include "TAS5749M_I2C.h"
#include <IRremote.hpp>

/* =======================
   USER SETTINGS
   ======================= */

const char* ssid     = "Linksys19102";
const char* password = "lzcrcm7fas";

/* =======================
   IR RECEIVER
   ======================= */
const int RECV_PIN = 4; // IR Receiver pin


/* =======================
   I2S PINS (MATCH BOARD)
   ======================= */

#define I2S_BCLK   26
#define I2S_LRCLK  25
#define I2S_DATA   27   


/*====================
I2C PINS
======================*/

#define SDA_PIN   21
#define SCL_PIN   22

/* =======================
   OBJECTS
   ======================= */

Audio audio;
//WebServer server(80);
//Preferences prefs;

/* =======================
   STATION LIST
   ======================= */

struct Station {
  const char* name;
  const char* url;
};

Station stations[] = {
  {"BBC Radio 4", "http://stream.live.vc.bbcmedia.co.uk/bbc_radio_fourlw"},
  {"BBC World",  "http://stream.live.vc.bbcmedia.co.uk/bbc_world_service"},
  {"NPR",        "https://npr-ice.streamguys1.com/live.mp3"},
  {"Jazz24",     "https://live.wostreaming.net/direct/ppm-jazz24mp3-ibc1"}
};

const int stationCount = sizeof(stations) / sizeof(stations[0]);
int currentStation = 0;
int currentVolume  = 05;




// ---- Audio debug callbacks ----

void audio_info(const char *info) {
  Serial.print("INFO: ");
  Serial.println(info);
}

void audio_showstation(const char *info) {
  Serial.print("STATION: ");
  Serial.println(info);
}

void audio_showstreamtitle(const char *info) {
  Serial.print("NOW PLAYING: ");
  Serial.println(info);
}

void audio_bitrate(const char *info) {
  Serial.print("BITRATE: ");
  Serial.println(info);
}

void audio_error(const char *info) {
  Serial.print("ERROR: ");
  Serial.println(info);
}



//////////////////////////////////////////////





void IRTask(void *pvParameters) {
  for (;;) {
    if (IrReceiver.decode()) {

      uint32_t code = IrReceiver.decodedIRData.decodedRawData;

  switch (code)
    {
        case 4161210119: // VOL+
            currentVolume += 1;
            if (currentVolume > 70) currentVolume = 70;
           
             audio.setVolume(currentVolume);
            Serial.print("Volume Up: ");
            Serial.println(currentVolume);
            break;
        case 4094363399: // VOL-
            currentVolume -= 1;
            if (currentVolume < 0) currentVolume = 0;
           
            audio.setVolume(currentVolume);
            Serial.print("Volume Down: ");
            Serial.println(currentVolume);
            break;
    }

      IrReceiver.resume();
    }
    vTaskDelay(5);
  }
}




/* =======================
   SETUP
   ======================= */

void setup() {

  Serial.begin(9600);
  delay(1000);
  Serial.println("\nESP32 Internet Radio starting...");

  IrReceiver.begin(RECV_PIN, DISABLE_LED_FEEDBACK);

xTaskCreatePinnedToCore(
  IRTask,
  "IR Task",
  4096,
  NULL,
  1,
  NULL,
  0  //  Core 0
);

    Serial.print("Connecting to WiFi: ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("\nWiFi connected!");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

 delay(20);


Wire.begin(SDA_PIN, SCL_PIN);
 
  
TAS5749_I2C_INT();

 // Force I2S clocking
 
  i2s_set_clk(
    I2S_NUM_0,
    48000,                 // sample rate
    I2S_BITS_PER_SAMPLE_32BIT,
     I2S_CHANNEL_MONO 
  );
  
 // Audio library
 audio.setPinout(I2S_BCLK, I2S_LRCLK, I2S_DATA);
 audio.setVolume(currentVolume);
 audio.connecttohost("http://vis.media-ice.musicradio.com/CapitalMP3");//("http://stream.live.vc.bbcmedia.co.uk/bbc_world_service");//

}

/* =======================
   LOOP
   ======================= */

void loop() {
  audio.loop();

 
}
