#pragma once
#include <Adafruit_NeoPixel.h>

// ПРОДВИНУТЫЙ СЛОЙ
// Полноценный класс для управления RGBW-лентой SK6812 и приёмом кадров
// от Python-скрипта по протоколу: 'A','d','a' + N*4 байта(G,R,B,W) + 1 байт checksum(XOR).
//
// Почему Adafruit_NeoPixel, а не FastLED + WS2812B-хак:
// SK6812 - честный 4-канальный чип. Adafruit_NeoPixel поддерживает RGBW нативно
// (флаг NEO_GRBW), без приведения CRGB* к uint8_t* и без подбора "магического"
// NUM_LEDS, которое ломается при смене количества светодиодов.
class Sk6812AmbilightStrip {
public:
    Sk6812AmbilightStrip(uint16_t numLeds, uint8_t pin);
    ~Sk6812AmbilightStrip();

    // receiveTimeoutMs - сколько ждать очередной байт кадра, прежде чем считать
    // кадр оборванным. При 460800 бод один байт идёт ~22 мкс, 25 мс - запас на
    // джиттер USB-CDC драйвера, а не "магическое" число.
    void begin(uint16_t receiveTimeoutMs = 25);

    void clear();
    void show();

    void setPixelRGBW(uint16_t index, uint8_t r, uint8_t g, uint8_t b, uint8_t w);
    void setBrightness(uint8_t brightness); // 0..255, программный лимит яркости/тока

    // Пытается прочитать один кадр из Serial. Возвращает true, только если кадр
    // целиком получен И контрольная сумма совпала (в этом случае уже вызван show()).
    bool receiveFrame();

    // true, если валидный кадр не приходил дольше timeoutMs (например, Python-скрипт упал)
    bool isConnectionStale(uint32_t timeoutMs = 2000) const;

private:
    Adafruit_NeoPixel _strip;
    uint16_t _numLeds;
    uint16_t _payloadLen;   // numLeds * 4 (G,R,B,W)
    uint8_t* _payloadBuf;   // выделяется один раз в конструкторе, а не на каждый кадр
    uint32_t _lastValidFrameMs = 0;
};
