#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const int moistureSensor = A0;
const int relayPin = 7;

void setup() {
  pinMode(moistureSensor, INPUT);
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, LOW);

  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
}

void loop() {
  int sensorValue = analogRead(moistureSensor);

  if (sensorValue < 400) {  // DRY soil
    display.clearDisplay();
    display.setCursor(0, 0);
    display.println("Status: Normal");
    display.setCursor(0, 10);
    display.println("Wet");
    drawFace(false); // sad face
    digitalWrite(relayPin, HIGH); // turn on pump
    delay(2000);

    // Recheck moisture
    int newValue = analogRead(moistureSensor);
    if (newValue > 500) {
      digitalWrite(relayPin, LOW); // stop pump
    }
  } else {  // WET soil
    digitalWrite(relayPin, LOW);
    display.clearDisplay();
    display.setCursor(0, 0);
    display.println("Status: Dry Soil");
    drawFace(true); // happy face
  }

  delay(1000);
}

// Draw eyes, nose, and mouth. Happy = true, Sad = false.
void drawFace(bool happy) {
  // Eyes
  display.fillCircle(40, 30, 4, WHITE);  // left eye
  display.fillCircle(80, 30, 4, WHITE);  // right eye

  // Nose
  display.drawLine(60, 32, 60, 40, WHITE); // straight vertical nose

  // Mouth
  if (happy) {
    // Smile (upward-angled lines)
    display.drawLine(50, 50, 60, 45, WHITE);
    display.drawLine(60, 45, 70, 50, WHITE);
  } else {
    // Sad (downward-angled lines)
    display.drawLine(50, 45, 60, 50, WHITE);
    display.drawLine(60, 50, 70, 45, WHITE);
  }

  display.display();
}
