#include <Arduino.h>
#include "config.h"
#include "state.h"

// Suivi anti-rebond pour un bouton
struct Bouton {
    uint8_t pin;
    bool    lectureRaw;    // dernière lecture brute
    bool    etatConfirme;  // état validé après anti-rebond
    unsigned long tChangement;
};

static Bouton di1 = { PIN_DI1, HIGH, HIGH, 0 };
static Bouton di2 = { PIN_DI2, HIGH, HIGH, 0 };

// Retourne true une seule fois au moment où l'appui est confirmé (front descendant)
static bool detecterAppui(Bouton &b) {
    bool lecture = digitalRead(b.pin);

    if (lecture != b.lectureRaw) {
        b.lectureRaw    = lecture;
        b.tChangement   = millis();
    }

    if ((millis() - b.tChangement) >= DEBOUNCE_BOUTON && lecture != b.etatConfirme) {
        b.etatConfirme = lecture;
        return (b.etatConfirme == LOW);  // LOW = contact fermé = appui
    }
    return false;
}

void initBoutons() {
    // GPIO36 et GPIO39 sont input-only — pas de pull-up interne possible sur ESP32
    pinMode(PIN_DI1, INPUT);
    pinMode(PIN_DI2, INPUT);
    Serial.println("Boutons DI1/DI2 initialisés");
}

void gererBoutons() {
    bool appui1 = detecterAppui(di1);
    bool appui2 = detecterAppui(di2);

    if (appui1) Serial.println("[DI] DI1 appui détecté");
    if (appui2) Serial.println("[DI] DI2 appui détecté");

    // Mise à jour état pour l'interface web et les règles
    state.di1 = (di1.etatConfirme == LOW);
    state.di2 = (di2.etatConfirme == LOW);
}
