#pragma once
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_AHTX0.h>

/**
 * @brief Драйвер цифрового датчика влажности и температуры AHT20 (Aosong).
 * Обёртка над Adafruit_AHTX0 с единым для репозитория API: Data/isAlive()/DI.
 */
class Aht20Driver {
public:
    struct Data {
        float temperatureC;    // Температура, °C
        float humidityPercent; // Относительная влажность, %RH
    };

    /**
     * @param wire Ссылка на интерфейс I2C (Dependency Injection)
     */
    explicit Aht20Driver(TwoWire &wire = Wire);

    /**
     * @brief Инициализация датчика на шине I2C.
     * @param sda Пин SDA
     * @param scl Пин SCL
     * @return true если датчик найден и откликнулся на своём адресе
     */
    bool begin(int sda = 21, int scl = 22);

    /**
     * @brief Опрос датчика. Блокирует выполнение на время измерения
     * (внутри Adafruit_AHTX0, обычно до ~80 мс — см. AHT20 datasheet, п.7.4).
     * @return true если чтение успешно, данные обновлены
     */
    bool update();

    /// Последние успешно прочитанные данные.
    const Data& getData() const { return _data; }

    /// Пришли ли новые данные с датчика за последние timeoutMs (жива ли физическая связь по I2C).
    bool isAlive(unsigned long timeoutMs = 2000) const {
        return (millis() - _lastUpdateTime) < timeoutMs;
    }

private:
    TwoWire* _wire;
    Adafruit_AHTX0 _sensor;
    Data _data{};
    unsigned long _lastUpdateTime = 0;

    // Фиксированный 7-битный адрес I2C AHT20, не настраивается аппаратно.
    // Источник: Aosong AHT20 datasheet V1.0 (05/2021), п.7.3 "Send Command", рис. адреса на стр.12.
    static constexpr uint8_t I2C_ADDRESS = 0x38;
};
