/**
 * @file lwm2m_event_log.c
 * @brief
 *
 * Copyright (c) 2022 Kickmaker
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/*
 * Event Log
 * https://raw.githubusercontent.com/OpenMobileAlliance/lwm2m-registry/prod/20.xml
 */

#define LOG_MODULE_NAME net_lwm2m_event_log
#define LOG_LEVEL CONFIG_LWM2M_LOG_LEVEL

#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(LOG_MODULE_NAME);

#include <string.h>
#include <zephyr/init.h>

#include "lwm2m_object.h"
#include "lwm2m_engine.h"
#include "lwm2m_obj_event_log.h"

#define EVENT_LOG_VERSION_MAJOR 1
#define EVENT_LOG_VERSION_MINOR 0
#define EVENT_LOG_MAX_ID 6

/*
 * Calculate resource instances as follows:
 * start with EVENT_LOG_MAX_ID
 * subtract EXEC resources (2)
 */
#define RESOURCE_INSTANCE_COUNT (EVENT_LOG_MAX_ID - 2)

struct lwm2m_event_log_obj {
	uint8_t log_class;
	uint8_t log_status;
	uint8_t log_data_format;
};

static struct lwm2m_engine_obj lwm2m_event_log;
static struct lwm2m_engine_obj_field fields[] = {
	OBJ_FIELD_DATA(LWM2M_EVENT_LOG_CLASS_ID, RW_OPT, U8),
	OBJ_FIELD_EXECUTE_OPT(LWM2M_EVENT_LOG_START_ID),
	OBJ_FIELD_EXECUTE_OPT(LWM2M_EVENT_LOG_STOP_ID),
	OBJ_FIELD_DATA(LWM2M_EVENT_LOG_STATUS_ID, R_OPT, U8),
	OBJ_FIELD_DATA(LWM2M_EVENT_LOG_DATA_ID, R, OPAQUE),
	OBJ_FIELD_DATA(LWM2M_EVENT_LOG_DATAFORMAT_ID, RW_OPT, U8),
};

static struct lwm2m_engine_obj_inst inst;
static struct lwm2m_engine_res res[EVENT_LOG_MAX_ID];
static struct lwm2m_engine_res_inst res_inst[RESOURCE_INSTANCE_COUNT];

static struct lwm2m_engine_obj_inst *lwm2m_event_log_create(uint16_t obj_inst_id)
{
	int i = 0, j = 0;

	init_res_instance(res_inst, ARRAY_SIZE(res_inst));

	/* initialize instance resource data */
	INIT_OBJ_RES_OPTDATA(LWM2M_EVENT_LOG_CLASS_ID, res, i, res_inst, j);
	INIT_OBJ_RES_EXECUTE(LWM2M_EVENT_LOG_START_ID, res, i, NULL);
	INIT_OBJ_RES_EXECUTE(LWM2M_EVENT_LOG_STOP_ID, res, i, NULL);
	INIT_OBJ_RES_OPTDATA(LWM2M_EVENT_LOG_STATUS_ID, res, i, res_inst, j);
	INIT_OBJ_RES_OPT(LWM2M_EVENT_LOG_DATA_ID, res, i, res_inst, j, 1,
			 false, true, NULL, NULL, NULL, NULL, NULL);
	INIT_OBJ_RES_OPTDATA(LWM2M_EVENT_LOG_DATAFORMAT_ID, res, i, res_inst, j);

	inst.resources = res;
	inst.resource_count = i;

	LOG_DBG("Created LWM2M event log instance: %d", obj_inst_id);
	return &inst;
}

static int lwm2m_event_log_init(const struct device *dev)
{
	struct lwm2m_engine_obj_inst *obj_inst = NULL;
	int ret = 0;

	/* initialize the Event Log field data */
	lwm2m_event_log.obj_id = LWM2M_OBJECT_EVENT_LOG_ID;
	lwm2m_event_log.version_major = EVENT_LOG_VERSION_MAJOR;
	lwm2m_event_log.version_minor = EVENT_LOG_VERSION_MINOR;
	lwm2m_event_log.is_core = false;
	lwm2m_event_log.fields = fields;
	lwm2m_event_log.field_count = ARRAY_SIZE(fields);
	lwm2m_event_log.max_instance_count = 1U;
	lwm2m_event_log.create_cb = lwm2m_event_log_create;
	lwm2m_register_obj(&lwm2m_event_log);

	/* auto create the first instance */
	ret = lwm2m_create_obj_inst(LWM2M_OBJECT_EVENT_LOG_ID, 0, &obj_inst);
	if (ret < 0) {
		LOG_ERR("Create LWM2M Event Log instance 0 error: %d", ret);
	}

	return ret;
}

SYS_INIT(lwm2m_event_log_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);
