/*
    Menu por puerto serial
*/

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

String dias[7] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves",
                   "Viernes", "Sabado" };
String meses[12] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio",
                     "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" };

void setup() {

  Serial.begin(9600);

  if (!rtc.begin()) {
    Serial.println(F("No se encuentra el dispositivo"));
    while (1)
      ;
  }

  // Mensaje de bienvenida
  start();
}

void loop() {

  char opcion;
  
  while(true){
    if (Serial.available() > 0) {
      opcion = Serial.read();
      break;
    }
  }

  // Lee y descarta un byte de datos desde el buffer
  clearSerialBuffer();

  switch(opcion){

    case '1':
      Serial.println("Opción 1");
      mostrarTiempo();
    break;

    case '2':
      Serial.println("Opción 2");
      ajustarTiempo();
      start();
    break;

    case '3':
      Serial.println("Opción 3");
      rtc.adjust(DateTime("2022-12-18T18:00:00"));
      start();
    break;

    default:
      Serial.println("Opcion incorrecta.");
    break;
  }
}

void start(){
  Serial.println("Bienvenido al sistema. Elija una opcion:");
  Serial.println("\n1. Iniciar el sistema.");
  Serial.println("2. Ajustar fecha y hora.");
  Serial.println("3. Cargar valores por defecto e iniciar el sistema.");
}

void mostrarTiempo(){

  while(true){

    DateTime tiempo = rtc.now();
    String timestamp =  String (dias[tiempo.dayOfTheWeek()]) + String(" ") + 
                        String(tiempo.day(), DEC) + String(" de ") + 
                        String(meses[tiempo.month() - 1]) + String(" de ") +
                        String(tiempo.year(), DEC) + String(" | ") + 
                        String(tiempo.hour(), DEC) + String(':') + 
                        String(tiempo.minute(), DEC) + String(':') + 
                        String(tiempo.second(), DEC);
    
    Serial.println("Sistema en ejecucion.");
    Serial.println(timestamp);
    delay(1000);
  }
}

void ajustarTiempo(){

  char buffer[20];
  Serial.println("Ingresar fecha y hora en formato ISO8601 (2022-12-18T18:00:00):");
  
  while(true){
  
    if (Serial.available() > 0) {
        Serial.readBytesUntil('\n', buffer, 20);
        Serial.print("El dato ingresado es: ");
        Serial.println(buffer);
      break;
    }
  }

  rtc.adjust(DateTime(buffer));
  Serial.println("Sistema actualizado.");
}

void clearSerialBuffer() {
  delay(100);
  while (Serial.available()) {
    Serial.read(); 
  }
}
GND5VSDASCLSQWRTCDS1307+