//go:build rp2040 || rp2350

package ws2812

import (
	"image/color"
	"machine"
	"runtime"

	pio "github.com/tinygo-org/pio/rp2-pio"
	"github.com/tinygo-org/pio/rp2-pio/piolib"
)

// newWS2812Device creates a WS2812 device using PIO for hardware-timed control.
// If PIO initialization fails, it falls back to the bit-bang driver.
func newWS2812Device(pin machine.Pin) Device {
	sm, err := pio.PIO0.ClaimStateMachine()
	if err != nil {
		return Device{Pin: pin, brightness: 255, writeColorFunc: writeColorsRGB}
	}
	ws, err := piolib.NewWS2812B(sm, pin)
	if err != nil {
		return Device{Pin: pin, brightness: 255, writeColorFunc: writeColorsRGB}
	}
	return Device{
		Pin:        pin,
		brightness: 255,
		writeColorFunc: func(_ Device, buf []color.RGBA, brightness uint8) error {
			for _, c := range buf {
				r, g, b := applyBrightness(c, brightness)
				for ws.IsQueueFull() {
					runtime.Gosched()
				}
				ws.PutRGB(r, g, b)
			}
			return nil
		},
	}
}
