/*
 * Copyright (c) 2017 Linaro Limited
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/*
 * Copyright (c) 2015, Yanzi Networks AB.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * Original Authors:
 *         Joakim Eriksson <joakime@sics.se>
 *         Niclas Finne <nfi@sics.se>
 */

/*
 * Zephyr Contribution by Michael Scott <michael.scott@linaro.org>
 * - Zephyr code style changes / code cleanup
 * - Move to Zephyr APIs where possible
 * - Convert to Zephyr int/uint types
 * - Remove engine dependency (replace with writer context)
 * - Add write int64 function
 */

/*
 * TODO:
 * - Type cleanups
 * - Cleanup integer parsing
 */

#define SYS_LOG_DOMAIN "lib/lwm2m_plain_text"
#define SYS_LOG_LEVEL CONFIG_SYS_LOG_LWM2M_LEVEL
#include <logging/sys_log.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include "lwm2m_object.h"
#include "lwm2m_rw_plain_text.h"
#include "lwm2m_engine.h"

size_t plain_text_put_float32fix(u8_t *outbuf, size_t outlen,
				 float32_value_t *value)
{
	int n, o = 0;

	if (outlen == 0) {
		return 0;
	}

	if (value->val1 < 0) {
		*outbuf++ = '-';
		outlen--;
		o = 1;
		value->val1 = -value->val1;
	}

	n = snprintk(outbuf, outlen, "%d.%d", value->val1, value->val2);

	if (n < 0 || n >= outlen) {
		return 0;
	}

	return n + o;
}

size_t plain_text_put_float64fix(u8_t *outbuf, size_t outlen,
				 float64_value_t *value)
{
	int n, o = 0;

	if (outlen == 0) {
		return 0;
	}

	if (value->val1 < 0) {
		*outbuf++ = '-';
		outlen--;
		o = 1;
		value->val1 = -value->val1;
	}

	n = snprintk(outbuf, outlen, "%lld.%lld", value->val1, value->val2);

	if (n < 0 || n >= outlen) {
		return 0;
	}

	return n + o;
}

static size_t put_s32(struct lwm2m_output_context *out,
		      struct lwm2m_obj_path *path, s32_t value)
{
	int len;

	len = snprintk(&out->outbuf[out->outlen], out->outsize - out->outlen,
		       "%d", value);
	if (len < 0 || len >= (out->outsize - out->outlen)) {
		return 0;
	}

	out->outlen += len;
	return (size_t)len;
}

static size_t put_s8(struct lwm2m_output_context *out,
		     struct lwm2m_obj_path *path, s8_t value)
{
	return put_s32(out, path, (s32_t)value);
}

static size_t put_s16(struct lwm2m_output_context *out,
		      struct lwm2m_obj_path *path, s16_t value)
{
	return put_s32(out, path, (s32_t)value);
}

static size_t put_s64(struct lwm2m_output_context *out,
		      struct lwm2m_obj_path *path, s64_t value)
{
	int len;

	len = snprintk(&out->outbuf[out->outlen], out->outsize - out->outlen,
		       "%lld", value);
	if (len < 0 || len >= (out->outsize - out->outlen)) {
		return 0;
	}

	out->outlen += len;
	return (size_t)len;
}

static size_t put_float32fix(struct lwm2m_output_context *out,
			     struct lwm2m_obj_path *path,
			     float32_value_t *value)
{
	size_t len;

	len = plain_text_put_float32fix(&out->outbuf[out->outlen],
					out->outsize - out->outlen,
					value);
	out->outlen += len;
	return len;
}

static size_t put_float64fix(struct lwm2m_output_context *out,
			     struct lwm2m_obj_path *path,
			     float64_value_t *value)
{
	size_t len;

	len = plain_text_put_float64fix(&out->outbuf[out->outlen],
					out->outsize - out->outlen,
					value);
	out->outlen += len;
	return len;
}

static size_t put_string(struct lwm2m_output_context *out,
			 struct lwm2m_obj_path *path,
			 char *buf, size_t buflen)
{
	if (buflen >= (out->outsize - out->outlen)) {
		return 0;
	}

	memmove(&out->outbuf[out->outlen], buf, buflen);
	out->outbuf[buflen] = '\0';
	out->outlen += buflen;
	return buflen;
}

static size_t put_bool(struct lwm2m_output_context *out,
		       struct lwm2m_obj_path *path,
		       bool value)
{
	if ((out->outsize - out->outlen) > 0) {
		if (value) {
			out->outbuf[out->outlen] = '1';
		} else {
			out->outbuf[out->outlen] = '0';
		}

		out->outlen += 1;
		return 1;
	}

	return 0;
}

static size_t get_s32(struct lwm2m_input_context *in, s32_t *value)
{
	int i;
	bool neg = false;

	*value = 0;
	for (i = 0; i < in->insize; i++) {
		if (isdigit(in->inbuf[i])) {
			*value = *value * 10 + (in->inbuf[i] - '0');
		} else if (in->inbuf[i] == '-' && i == 0) {
			neg = true;
		} else {
			break;
		}
	}

	if (neg) {
		*value = -*value;
	}

	return i;
}

static size_t get_s64(struct lwm2m_input_context *in, s64_t *value)
{
	int i;
	bool neg = false;

	*value = 0;
	for (i = 0; i < in->insize; i++) {
		if (isdigit(in->inbuf[i])) {
			*value = *value * 10 + (in->inbuf[i] - '0');
		} else if (in->inbuf[i] == '-' && i == 0) {
			neg = true;
		} else {
			break;
		}
	}

	if (neg) {
		*value = -*value;
	}

	return i;
}

static size_t get_string(struct lwm2m_input_context *in,
			 u8_t *value, size_t buflen)
{
	/* The outbuffer can't contain the full string including ending zero */
	if (buflen <= in->insize) {
		return 0;
	}

	memcpy(value, in->inbuf, in->insize);
	value[in->insize] = '\0';
	return in->insize;
}

static size_t get_float32fix(struct lwm2m_input_context *in,
			     float32_value_t *value)
{
	int i;
	bool dot = false, neg = false;
	s32_t counter = 0;

	value->val1 = 0;
	value->val2 = 0;
	for (i = 0; i < in->insize; i++) {
		if (isdigit(in->inbuf[i])) {
			counter = counter * 10 + (in->inbuf[i] - '0');
		} else if (in->inbuf[i] == '-' && i == 0) {
			neg = true;
		} else if (in->inbuf[i] == '.' && !dot) {
			value->val1 = counter;
			counter = 0;
			dot = true;
		} else {
			break;
		}
	}

	if (!dot) {
		value->val1 = counter;
	} else {
		value->val2 = counter;
	}

	SYS_LOG_DBG("READ FLOATFIX: '%s'(%d) => %d.%d",
		    in->inbuf, in->insize, value->val1, value->val2);
	if (neg) {
		value->val1 = -value->val1;
	}

	return i;
}

static size_t get_float64fix(struct lwm2m_input_context *in,
			     float64_value_t *value)
{
	int i;
	bool dot = false, neg = false;
	s64_t counter = 0;

	value->val1 = 0;
	value->val2 = 0;
	for (i = 0; i < in->insize; i++) {
		if (isdigit(in->inbuf[i])) {
			counter = counter * 10 + (in->inbuf[i] - '0');
		} else if (in->inbuf[i] == '-' && i == 0) {
			neg = true;
		} else if (in->inbuf[i] == '.' && !dot) {
			value->val1 = counter;
			counter = 0;
			dot = true;
		} else {
			break;
		}
	}

	if (!dot) {
		value->val1 = counter;
	} else {
		value->val2 = counter;
	}

	SYS_LOG_DBG("READ FLOATFIX: '%s'(%d) => %lld.%lld",
		    in->inbuf, in->insize, value->val1, value->val2);
	if (neg) {
		value->val1 = -value->val1;
	}

	return i;
}

static size_t get_bool(struct lwm2m_input_context *in,
		       bool *value)
{
	if (in->insize > 0) {
		if (*in->inbuf == '1' || *in->inbuf == '0') {
			*value = (*in->inbuf == '1') ? true : false;
			return 1;
		}
	}

	return 0;
}

const struct lwm2m_writer plain_text_writer = {
	NULL,
	NULL,
	NULL,
	NULL,
	put_s8,
	put_s16,
	put_s32,
	put_s64,
	put_string,
	put_float32fix,
	put_float64fix,
	put_bool
};

const struct lwm2m_reader plain_text_reader = {
	get_s32,
	get_s64,
	get_string,
	get_float32fix,
	get_float64fix,
	get_bool
};

int do_write_op_plain_text(struct lwm2m_engine_obj *obj,
			   struct lwm2m_engine_context *context)
{
	struct lwm2m_obj_path *path = context->path;
	struct lwm2m_engine_obj_inst *obj_inst = NULL;
	struct lwm2m_engine_obj_field *obj_field;
	struct lwm2m_engine_res_inst *res = NULL;
	int ret, i;
	u8_t created = 0;

	ret = lwm2m_get_or_create_engine_obj(context, &obj_inst, &created);
	if (ret < 0) {
		return ret;
	}

	obj_field = lwm2m_get_engine_obj_field(obj, path->res_id);
	if (!obj_field) {
		return -ENOENT;
	}

	if ((obj_field->permissions & LWM2M_PERM_W) != LWM2M_PERM_W) {
		return -EPERM;
	}

	if (!obj_inst->resources || obj_inst->resource_count == 0) {
		return -EINVAL;
	}

	for (i = 0; i < obj_inst->resource_count; i++) {
		if (obj_inst->resources[i].res_id == path->res_id) {
			res = &obj_inst->resources[i];
			break;
		}
	}

	if (!res) {
		return -ENOENT;
	}

	context->path->level = 3;
	context->in->inpos = 0;
	return lwm2m_write_handler(obj_inst, res, obj_field, context);
}
