/*
 * Copyright (c) 2017 Linaro Limited
 * Copyright (c) 2018-2019 Foundries.io
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#define LOG_MODULE_NAME net_lwm2m_obj_firmware_pull
#define LOG_LEVEL CONFIG_LWM2M_LOG_LEVEL

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

#include <string.h>

#include "lwm2m_pull_context.h"
#include "lwm2m_engine.h"

static void set_update_result(uint16_t obj_inst_id, int error_code)
{
	int result;

	if (!error_code) {
		lwm2m_firmware_set_update_state_inst(obj_inst_id, STATE_DOWNLOADED);
		return;
	}

	switch (error_code) {
	case -ENOMEM:
		result = RESULT_OUT_OF_MEM;
		break;
	case -ENOSPC:
		result = RESULT_NO_STORAGE;
		break;
	case -EFAULT:
		result = RESULT_INTEGRITY_FAILED;
		break;
	case -ENOMSG:
		result = RESULT_CONNECTION_LOST;
		break;
	case -ENOTSUP:
		result = RESULT_INVALID_URI;
		break;
	case -EPROTONOSUPPORT:
		result = RESULT_UNSUP_PROTO;
		break;
	default:
		result = RESULT_UPDATE_FAILED;
		break;
	}

	lwm2m_firmware_set_update_result(result);
}

static struct requesting_object req = {
	.obj_inst_id = 0,
	.is_firmware_uri = true,
	.result_cb = set_update_result,
	.verify_cb = NULL
};

/* TODO: */
int lwm2m_firmware_cancel_transfer(void)
{
	return 0;
}

int lwm2m_firmware_start_transfer(uint16_t obj_inst_id, char *package_uri)
{
	int error_code;

	req.write_cb = lwm2m_firmware_get_write_cb();

	/* start file transfer work */
	error_code = lwm2m_pull_context_start_transfer(package_uri, req, K_NO_WAIT);

	if (error_code) {
		return error_code;
	}

	lwm2m_firmware_set_update_state_inst(obj_inst_id, STATE_DOWNLOADING);

	return 0;
}
