/*
 * Copyright (c) 2022 Nordic Semiconductor
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#define LOG_MODULE_NAME app_led

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

#include "modules.h"

#include <zephyr/drivers/gpio.h>
#include <zephyr/net/lwm2m.h>

#define LIGHT_NAME "Test light"

/* If led0 gpios doesn't exist the relevant IPSO object will simply not be created. */
static const struct gpio_dt_spec led_gpio = GPIO_DT_SPEC_GET_OR(DT_ALIAS(led0), gpios, {});
static uint32_t led_state;

/* TODO: Move to a pre write hook that can handle ret codes once available */
static int led_on_off_cb(uint16_t obj_inst_id, uint16_t res_id, uint16_t res_inst_id, uint8_t *data,
			 uint16_t data_len, bool last_block, size_t total_size)
{
	int ret = 0;
	uint32_t led_val;

	led_val = *(uint8_t *)data;
	if (led_val != led_state) {
		ret = gpio_pin_set_dt(&led_gpio, (int)led_val);
		if (ret) {
			/*
			 * We need an extra hook in LWM2M to better handle
			 * failures before writing the data value and not in
			 * post_write_cb, as there is not much that can be
			 * done here.
			 */
			LOG_ERR("Fail to write to GPIO %d", led_gpio.pin);
			return ret;
		}

		led_state = led_val;
		/* TODO: Move to be set by an internal post write function */
		lwm2m_set_s32(&LWM2M_OBJ(3311, 0, 5852), 0);
	}

	return ret;
}

int init_led_device(void)
{
	int ret;

	if (!device_is_ready(led_gpio.port)) {
		return -ENODEV;
	}

	ret = gpio_pin_configure_dt(&led_gpio, GPIO_OUTPUT_INACTIVE);
	if (ret) {
		return ret;
	}

	lwm2m_create_object_inst(&LWM2M_OBJ(3311, 0));
	lwm2m_register_post_write_callback(&LWM2M_OBJ(3311, 0, 5850), led_on_off_cb);
	lwm2m_set_res_buf(&LWM2M_OBJ(3311, 0, 5750), LIGHT_NAME, sizeof(LIGHT_NAME),
			  sizeof(LIGHT_NAME), LWM2M_RES_DATA_FLAG_RO);

	return 0;
}
