#include <epictuner/plugin.h>
#include <stdlib.h>

typedef struct instance { const et_host_api* host; } instance;
static et_result ET_CALL start(const et_host_api* host, void** output)
{
    instance* state;
    et_result result;
    const et_string message = {"C plugin started", 16, 0};
    if (!output) return ET_ERROR_ARGUMENT;
    *output = NULL;
    if (!host || host->struct_size < ET_HOST_API_V1_SIZE || !host->log) return ET_ERROR_ARGUMENT;
    if (ET_ABI_MAJOR(host->abi_version) != 1) return ET_ERROR_ABI;
    if (!(host->capabilities & ET_CAP_LOG)) return ET_ERROR_CAPABILITY;
    state = (instance*)malloc(sizeof(instance));
    if (!state) return ET_ERROR_LIMIT;
    state->host = host;
    result = host->log(host->context, ET_LOG_INFO, message);
    if (result != ET_OK) { free(state); return result; }
    *output = state;
    return ET_OK;
}
static et_result ET_CALL stop(void* handle)
{
    const et_string message = {"C plugin stopped", 16, 0};
    instance* state = (instance*)handle;
    if (!state) return ET_ERROR_ARGUMENT;
    state->host->log(state->host->context, ET_LOG_INFO, message);
    free(state);
    return ET_OK;
}
ET_EXPORT et_result ET_CALL et_plugin_query(const et_query* query, et_plugin_api* api)
{
    static const char id[] = "org.epictuner.examples.lifecycle-c";
    et_plugin_api result = {sizeof(et_plugin_api), ET_ABI_VERSION, ET_CAP_LOG,
        {id, sizeof(id) - 1, 0}, start, stop, NULL};
    if (!query || !api || query->struct_size < sizeof(et_query)
        || api->struct_size < sizeof(et_plugin_api)) return ET_ERROR_ARGUMENT;
    if (ET_ABI_MAJOR(query->abi_version) != 1) return ET_ERROR_ABI;
    if (query->abi_version < result.abi_version) result.abi_version = query->abi_version;
    if (!(query->capabilities & ET_CAP_LOG)) return ET_ERROR_CAPABILITY;
    *api = result;
    return ET_OK;
}
