#include "esc_backend.h"
#include <stddef.h>

/* Global active backend (selected at runtime or compile-time) */
static const esc_backend_t *g_active_backend = NULL;

void esc_backend_register(const esc_backend_t *backend) {
    g_active_backend = backend;
    if (backend && backend->init) {
        backend->init();
    }
}

const esc_backend_t *esc_backend_get(void) {
    return g_active_backend;
}

/* High-level convenience wrappers — call through vtable */

void esc_init(void) {
    if (g_active_backend && g_active_backend->init) {
        g_active_backend->init();
    }
}

void esc_send(int16_t speed, int16_t steer) {
    if (g_active_backend && g_active_backend->send) {
        g_active_backend->send(speed, steer);
    }
}

void esc_estop(void) {
    if (g_active_backend && g_active_backend->estop) {
        g_active_backend->estop();
    }
}

void esc_resume(void) {
    if (g_active_backend && g_active_backend->resume) {
        g_active_backend->resume();
    }
}

void esc_get_telemetry(esc_telemetry_t *out) {
    if (out) {
        /* Zero-fill by default */
        out->speed = 0;
        out->steer = 0;
        out->voltage_mv = 0;
        out->current_ma = 0;
        out->temperature_c = 0;
        out->fault = 0;

        if (g_active_backend && g_active_backend->get_telemetry) {
            g_active_backend->get_telemetry(out);
        }
    }
}
