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

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

RTC_DS1307 rtc;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// جدول الحصص العادي
const char* regularTimetable[5][8] = {
  {"Arabic", "English", "French", "Maths", "Rel.", "Arabic", "P.E.", ""},
  {"Arabic", "Arabic", "Science", "Science", "English", "Maths", "Social", "Social"},
  {"Art", "Arabic", "Maths", "French", "English", "English", "ICT", "French"},
  {"English", "English", "Arabic", "Arabic", "Rel.", "Maths", "Science", "Science"},
  {"Social", "English", "English", "Arabic", "Arabic", "French", "Social", "Maths"}
};

// جدول رمضان
const char* ramadanTimetable[5][8] = {
  {"Arabic", "English", "French", "Maths", "Rel.", "Arabic", "P.E.", ""},
  {"Arabic", "Arabic", "Science", "Science", "English", "Maths", "Social", "Social"},
  {"Art", "Arabic", "Maths", "French", "English", "English", "ICT", "French"},
  {"English", "English", "Arabic", "Arabic", "Rel.", "Maths", "Science", "Science"},
  {"Social", "English", "English", "Arabic", "Arabic", "French", "Social", "Maths"}
};

// مواعيد الحصص العادية بالدقائق
const int regularSessionStartTimes[8] = {480, 525, 570, 615, 660, 720, 760, 800}; // 8:00 - 1:20
const int regularSessionDurations[8] = {45, 45, 45, 45, 40, 40, 40, 40};

// مواعيد الحصص في رمضان بالدقائق
const int ramadanSessionStartTimes[8] = {480, 520, 560, 600, 640, 700, 730, 760}; // 8:00 - 12:40
const int ramadanSessionDurations[8] = {40, 40, 40, 40, 40, 30, 30, 35};

// مواعيد بداية ونهاية رمضان 2025
const DateTime ramadanStart(2025, 2, 28);
const DateTime ramadanEnd(2025, 3, 30);

void setup() {
  Wire.begin();
  rtc.begin();
  if (!rtc.isrunning()) {
    //rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // ضبط الوقت على وقت الكومبايل
    rtc.adjust(DateTime(2025, 2, 28, 12, 36, 0)); // Year, Month, Day, Hour, Minute, Second
  }

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextColor(WHITE);
}

void loop() {
  display.clearDisplay();

  // الحصول على الوقت الحالي
  DateTime now = rtc.now();
  int currentTimeInMinutes = now.hour() * 60 + now.minute(); // تحويل الوقت إلى دقائق منذ منتصف الليل
  bool isRamadan = (now >= ramadanStart && now <= ramadanEnd);

  // اختيار الجدول المناسب
  const char* (*timetable)[8] = isRamadan ? ramadanTimetable : regularTimetable;
  const int* sessionStartTimes = isRamadan ? ramadanSessionStartTimes : regularSessionStartTimes;
  const int* sessionDurations = isRamadan ? ramadanSessionDurations : regularSessionDurations;

  // عرض الوقت الحالي بصيغة 12 ساعة
  int hour12 = now.hour() % 12;
  hour12 = (hour12 == 0) ? 12 : hour12; // تحويل 0 إلى 12
  char am_pm[] = "AM";
  if (now.hour() >= 12) am_pm[0] = 'P';

  char timeStr[9]; // "h:mm AM"
  snprintf(timeStr, sizeof(timeStr), "%d:%02d %s", hour12, now.minute(), am_pm);
  display.setTextSize(2);
  int16_t x = (SCREEN_WIDTH - (strlen(timeStr) * 12)) / 2;
  display.setCursor(x, 1);
  display.print(timeStr);

  // تحديد الحصة الحالية والوقت المتبقي
  int dayOfWeek = now.dayOfTheWeek();
  String sessionInfo = getCurrentSession(dayOfWeek, currentTimeInMinutes, timetable, sessionStartTimes, sessionDurations);
  String remainingTime = getRemainingTime(dayOfWeek, currentTimeInMinutes, sessionStartTimes, sessionDurations);

  display.setTextSize(1);
  display.setCursor(0, 30);
  display.print("Session: " + sessionInfo);
  display.setCursor(0, 45);
  display.print("Remaining: " + remainingTime);

  display.display();
  delay(1000);
}

// دالة تحديد الحصة الحالية
String getCurrentSession(int dayOfWeek, int currentTimeInMinutes, const char* (*timetable)[8], const int* sessionStartTimes, const int* sessionDurations) {
  if (dayOfWeek >= 5) return "No session";

  for (int i = 0; i < 8; i++) {
    if (currentTimeInMinutes >= sessionStartTimes[i] && currentTimeInMinutes < sessionStartTimes[i] + sessionDurations[i]) {
      return String(timetable[dayOfWeek][i]);
    }
  }
  return "No session";
}

// دالة حساب الوقت المتبقي
String getRemainingTime(int dayOfWeek, int currentTimeInMinutes, const int* sessionStartTimes, const int* sessionDurations) {
  if (dayOfWeek >= 5) return "No time";

  for (int i = 0; i < 8; i++) {
    if (currentTimeInMinutes >= sessionStartTimes[i] && currentTimeInMinutes < sessionStartTimes[i] + sessionDurations[i]) {
      int remainingTime = sessionStartTimes[i] + sessionDurations[i] - currentTimeInMinutes;
      return formatTime(remainingTime);
    }
  }
  return "No time";
}

// دالة تنسيق الوقت المتبقي
String formatTime(int timeInMinutes) {
  if (timeInMinutes < 60) {
    return String(timeInMinutes) + "m";
  } else {
    int hours = timeInMinutes / 60;
    int minutes = timeInMinutes % 60;
    return String(hours) + "h:" + String(minutes) + "m";
  }
}
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
GND5VSDASCLSQWRTCDS1307+
rtc1:GND
rtc1:5V
rtc1:SDA
rtc1:SCL
rtc1:SQW
Loading
ssd1306