#ifndef IS31FL3236A_LAMP_BACKEND_H
#define IS31FL3236A_LAMP_BACKEND_H

#include "is31fl3236a.h"
#include "lamp_output_adapter.h"

typedef bool (*is31fl3236a_led_power_request_fn)(void *context, bool enabled);
typedef bool (*is31fl3236a_led_power_good_fn)(void *context);

typedef struct {
    is31fl3236a_io driver_io;
    is31fl3236a_driver drivers[IS31FL3236A_MAX_GROUP_CHIPS];
    is31fl3236a_led_power_request_fn set_led_power_request;
    is31fl3236a_led_power_good_fn led_power_good;
    void *power_context;
    lg_output output;
    uint8_t current_profile[LG_MAX_CHANNELS];
    uint8_t staged_pwm[LG_MAX_CHANNELS];
    uint8_t addresses_7bit[IS31FL3236A_MAX_GROUP_CHIPS];
    uint16_t channel_count;
    uint8_t driver_count;
    uint8_t write_blocks_expected;
    uint8_t write_blocks_received;
    is31fl3236a_pwm_frequency pwm_frequency;
    bool driver_group_initialized;
    bool frame_staged;
    bool led_power_requested;
    bool initialized;
} is31fl3236a_lamp_backend;

/*
 * Host-testable integration of the IS31 driver group with the existing lamp
 * safety output adapter. Supports only the declared 61/122-channel candidates
 * and requires an explicit per-channel output/current profile.
 */
bool is31fl3236a_lamp_backend_init(
    is31fl3236a_lamp_backend *backend,
    const is31fl3236a_io *driver_io,
    const uint8_t *addresses_7bit, size_t driver_count,
    uint16_t channel_count,
    const uint8_t *channel_control_profile, size_t profile_length,
    is31fl3236a_pwm_frequency pwm_frequency,
    is31fl3236a_led_power_request_fn set_led_power_request,
    is31fl3236a_led_power_good_fn led_power_good,
    void *power_context,
    uint32_t power_ready_timeout_ms);

lg_output_status is31fl3236a_lamp_backend_sync(
    is31fl3236a_lamp_backend *backend, const lg_guard *guard,
    uint32_t now_ms);

bool is31fl3236a_lamp_backend_recover(
    is31fl3236a_lamp_backend *backend, const lg_guard *disarmed_new_session);

#endif
