#pragma once

#include <cstdint>
#include <cstddef>

// KNX Group Object Info für Web-API
struct KnxGroupObjectInfo {
    uint16_t goIndex;      // Group Object Index (1-based)
    uint16_t groupAddress; // Gruppenadresse (z.B. 1/2/3 = 0x0A03), 0 wenn nicht zugeordnet
    uint8_t dptMain;       // DPT Haupttyp
    uint8_t dptSub;        // DPT Subtyp
    bool commFlag;         // Kommunikations-Flag
    bool readFlag;         // Lese-Flag
    bool writeFlag;        // Schreib-Flag (empfangen vom Bus)
    bool transmitFlag;     // Sende-Flag (senden auf den Bus)
};

class KnxWorker {
public:
    KnxWorker();
    void init();
    void toggleProgMode();
    bool getProgMode();
    void setProgMode(bool enabled);
    void clearSettings();
    void loop();

    // KNX Gruppenadressen auslesen
    size_t getGroupObjectCount();
    bool getGroupObjectInfo(size_t index, KnxGroupObjectInfo& info);

    // KNX Telegramm senden
    bool sendSwitch(uint16_t groupAddr, bool value);

    // Gruppenadresse als String formatieren (z.B. "1/2/3")
    static void formatGroupAddress(uint16_t addr, char* buf, size_t bufSize);

private:
    volatile uint8_t knxResetState_ = 0;
    volatile uint32_t knxResetAtMs_ = 0;
};
