#include <SoftwareSerial.h>
#include <EEPROM.h>

SoftwareSerial BTSerial(10, 11); // RX, TX

String message = ""; // Stockage du dernier message reçu
bool messageRecu = false; // Indicateur si un message est stocké
const int EEPROM_START_ADDR = 0; // Adresse de début dans l'EEPROM

const int boutonReset = 2;  // Bouton branché sur D2
const int resetDuration = 5000; // 5 secondes en millisecondes

void setup() {
    Serial.begin(9600);
    BTSerial.begin(9600);
    pinMode(boutonReset, INPUT_PULLUP);

    Serial.println("HC-05 prêt !");
    
    // Lire le message stocké dans l'EEPROM au démarrage
    message = readMessageFromEEPROM();
    if (message.length() > 0) {
        messageRecu = true;
        Serial.println("Message récupéré de l'EEPROM : " + message);
    }
}

void loop() {
    // Vérifier si des données arrivent via Bluetooth
    if (BTSerial.available()) {
        String data = BTSerial.readStringUntil(']'); // Lire jusqu'à la fin du message
        data.trim(); // Nettoyer les espaces et sauts de ligne

        if (data.startsWith("[Message : ")) {
            message = data.substring(11, data.length()); // Extraire le message
            Serial.println("Nouveau message reçu : " + message);
            messageRecu = true;
            writeMessageToEEPROM(message); // Sauvegarder dans l'EEPROM
        } 
        else if (data == "[Demande_de_lecture") {
            if (messageRecu) {
                BTSerial.println("[Message : \"" + message + "\"]");
                Serial.println("Message envoyé via Bluetooth.");
            } else {
                BTSerial.println("[Aucun message disponible]");
                Serial.println("Aucun message en mémoire.");
            }
        }
    }

    // Vérifier si le bouton est maintenu pendant 5 secondes
    if (digitalRead(boutonReset) == LOW) {
        long startTime = millis();
        while (digitalRead(boutonReset) == LOW) {
            if (millis() - startTime >= resetDuration) {
                resetEEPROM(); // Effacer l'EEPROM
                Serial.println("EEPROM réinitialisée !");
                return;
            }
        }
    }
}

// Fonction pour écrire le message dans l'EEPROM
void writeMessageToEEPROM(String msg) {
    int len = msg.length();
    EEPROM.write(EEPROM_START_ADDR, len); // Stocker la longueur du message
    for (int i = 0; i < len; i++) {
        EEPROM.write(EEPROM_START_ADDR + 1 + i, msg[i]); // Écrire chaque caractère
    }
    EEPROM.write(EEPROM_START_ADDR + 1 + len, '\0'); // Ajouter un caractère de fin
    Serial.println("Message sauvegardé en EEPROM.");
}

// Fonction pour lire un message depuis l'EEPROM
String readMessageFromEEPROM() {
    int len = EEPROM.read(EEPROM_START_ADDR); // Lire la longueur du message
    if (len <= 0 || len > 100) return ""; // Éviter les erreurs

    String msg = "";
    for (int i = 0; i < len; i++) {
        char c = EEPROM.read(EEPROM_START_ADDR + 1 + i);
        if (c == '\0') break;
        msg += c;
    }
    return msg;
}

// Fonction pour réinitialiser l'EEPROM
void resetEEPROM() {
    for (int i = 0; i < 100; i++) { // Effacer 100 octets
        EEPROM.write(i, 0);
    }
    message = "";
    messageRecu = false;
    Serial.println("EEPROM effacée !");
}
