#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SDA_PIN 13
#define SCL_PIN 15
#define OLED_RESET -1
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32  // Change this if you have a different size display

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define EYE_HEIGHT display.height() / 2
#define DEFAULT_EYE_RADIUS 12
#define DEFAULT_LEFT_EYE_CENTER_POS display.width() / 4
#define DEFAULT_RIGHT_EYE_CENTER_POS display.width() * 3/4
#define DEFAULT_LEFT_EYE_CLOSED_CENTER_POS DEFAULT_LEFT_EYE_CENTER_POS - DEFAULT_EYE_RADIUS
#define DEFAULT_RIGHT_EYE_CLOSED_CENTER_POS DEFAULT_RIGHT_EYE_CENTER_POS - DEFAULT_EYE_RADIUS
#define DEFAULT_EYE_CLOSED_WIDTH DEFAULT_EYE_RADIUS * 2

void setup() {
  pinMode(17, OUTPUT);  // Set GPIO 18 as an output
  digitalWrite(17, HIGH);  // Set GPIO 18 to HIGH
  Wire.begin(SDA_PIN, SCL_PIN);
  // Initialize OLED
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);  // Freeze if OLED fails to initialize
  }
  
  // display.setRotation(2);
  display.clearDisplay();  // Clear the display
  display.setTextSize(1);  // Set text size
  display.setTextColor(SSD1306_WHITE);  // Set text color
  display.setCursor(0, 0);  // Set cursor position
}

void loop() {
  animateEyes();
}

void animateEyes(void) {
  animate(neutralEyes, 0, 0, 2000);
  animate(blink, 0, 0, 200);
  animate(neutralEyes, 0, 0, 2000);
  animate(blink, 0, 0, 200);
  animate(neutralEyes, 0, 0, 2000);
  animate(neutralEyes, DEFAULT_EYE_RADIUS, 0, 2000);
  animate(neutralEyes, -DEFAULT_EYE_RADIUS, 0, 2000);
  animate(blink, -DEFAULT_EYE_RADIUS, 200);
  animate(neutralEyes, -DEFAULT_EYE_RADIUS, 0, 2000);
  animate(neutralEyes, 0, 0, 2000);
  animate(blink, 0, 0, 200);
  animate(neutralEyes, 0, 0, 2000);
  animate(smileyEyes, 0, 0, 2000);
}

void animate(void(*animation)(int, int), int xOffset, int yOffset, int delayTime) {
  if (xOffset == NULL) {
    xOffset = 0;
  }
  if (yOffset == NULL) {
    yOffset = 0;
  }

  display.clearDisplay();
  animation(xOffset, yOffset);
  display.display();
  delay(delayTime);
}


void blink(int xOffset, int yOffset){
  display.drawRect(DEFAULT_LEFT_EYE_CLOSED_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_CLOSED_WIDTH, 2, SSD1306_WHITE);
  display.fillRect(DEFAULT_LEFT_EYE_CLOSED_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_CLOSED_WIDTH, 2, SSD1306_WHITE);

  display.drawRect(DEFAULT_RIGHT_EYE_CLOSED_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_CLOSED_WIDTH, 2, SSD1306_WHITE);
  display.fillRect(DEFAULT_RIGHT_EYE_CLOSED_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_CLOSED_WIDTH, 2, SSD1306_WHITE);
}


void neutralEyes(int xOffset, int yOffset) {
  display.drawCircle(DEFAULT_LEFT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
  display.fillCircle(DEFAULT_LEFT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);

  display.drawCircle(DEFAULT_RIGHT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
  display.fillCircle(DEFAULT_RIGHT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
}

void smileyEyes(int xOffset, int yOffset){
  display.drawCircle(DEFAULT_LEFT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
  display.fillCircle(DEFAULT_LEFT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
  display.drawCircle(DEFAULT_LEFT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset+4, DEFAULT_EYE_RADIUS, SSD1306_BLACK);
  display.fillCircle(DEFAULT_LEFT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset+4, DEFAULT_EYE_RADIUS, SSD1306_BLACK);

  display.drawCircle(DEFAULT_RIGHT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
  display.fillCircle(DEFAULT_RIGHT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
  display.drawCircle(DEFAULT_RIGHT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset+4, DEFAULT_EYE_RADIUS, SSD1306_BLACK);
  display.fillCircle(DEFAULT_RIGHT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset+4, DEFAULT_EYE_RADIUS, SSD1306_BLACK);
}