#include <WiFi.h>
#include "time.h"
#include <ESP32Servo.h>

//const char* ssid       = "SSID";
//const char* password   = "PASS";

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 25200;
const int   daylightOffset_sec = 3600;
const int servoPin = 18;

#define p1_ledPin 15 // LED Red
#define p2_ledPin 2 // LED Green
#define p3_BUZ 4 // LED Blue or Buzzer

int detik = 0;
int menit = 0;
int jam = 0;
int pos = 0;
int i = 0;

int state = 0;

//Change alarm here
int alm1j = 12; //hour
int alm1m = 40; //minutes
int alm1d = 30; //seconds

int alm2j = 12; //hour
int alm2m = 43; //minutes
int alm2d = 30; //seconds

int alm3j = 12; //hour
int alm3m = 45; //minutes
int alm3d = 30; //seconds

struct tm timeinfo;
Servo servo;

void feed() {
  Serial.println("FEEDINGS");
  if (pos == 0) {
    for (pos = 0; pos <= 120; pos += 1) {
      servo.write(pos);
      delay(15);
    }
  }
}

void unfeed() {
  Serial.println("STOP FEEDINGS");
  if (pos == 120) {
    for (pos = 120; pos >= 0; pos -= 1) {
      servo.write(pos);
      delay(15);
    }
  }
}

void alarm() {
  detik = timeinfo.tm_sec;
  menit = timeinfo.tm_min;
  jam = timeinfo.tm_hour;

  Serial.print(jam);
  Serial.print("-");
  Serial.print(menit);
  Serial.print("-");
  Serial.println(detik);
  if (jam == alm1j && menit == alm1m && detik < alm1d) {
    feed();
    while (i < 29 ) {
      Serial.println("FEEDING");
      digitalWrite(p3_BUZ, HIGH);
      delay(500);
      digitalWrite(p3_BUZ, LOW);
      delay(500);
      i += 1;
    }
    unfeed();
    i = 0;
  }
  if (jam == alm2j && menit == alm2m && detik < alm2d) {
    feed();
    while (i < 29 ) {
      Serial.println("FEEDING");
      digitalWrite(p3_BUZ, HIGH);
      delay(500);
      digitalWrite(p3_BUZ, LOW);
      delay(500);
      i += 1;
    }
    unfeed();
    i = 0;
  }
  if (jam == alm3j && menit == alm3m && detik < alm3d) {
    feed();
    while (i < 29 ) {
      Serial.println("FEEDING");
      digitalWrite(p3_BUZ, HIGH);
      delay(500);
      digitalWrite(p3_BUZ, LOW);
      delay(500);
      i += 1;
    }
    unfeed();
    i = 0;
  }
}

void printLocalTime() {
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Failed to obtain time");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

void setup() {
  servo.attach(servoPin, 500, 2400);
  Serial.begin(115200);
  pinMode(p1_ledPin, OUTPUT);
  pinMode(p2_ledPin, OUTPUT);
  pinMode(p3_BUZ, OUTPUT);

  //Uncomment if USING WOKWI SIMULATOR
  WiFi.begin("Wokwi-GUEST", "", 6);
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  //Uncomment if USING your WIFI
  //Serial.printf("Connecting to %s ", ssid);
  //WiFi.begin(ssid, password);
  //while (WiFi.status() != WL_CONNECTED) {
  //  delay(500);
  //  Serial.print(".");
  //  digitalWrite(p1_ledPin, HIGH);
  //  digitalWrite(p2_ledPin, LOW);
  //}
  Serial.println(" CONNECTED");
  digitalWrite(p3_BUZ, HIGH);
  delay(500);

  //init and get the time
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime();
  //disconnect WiFi as it's no longer needed
  //WiFi.disconnect(true);
  //WiFi.mode(WIFI_OFF);
}

void loop() {
  digitalWrite(p3_BUZ, LOW);
  digitalWrite(p1_ledPin, HIGH);
  digitalWrite(p2_ledPin, LOW);
  delay(500);
  digitalWrite(p1_ledPin, LOW);
  digitalWrite(p2_ledPin, HIGH);
  delay(500);
  printLocalTime();
  alarm();
}