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

#include "settings_test.h"
#include "settings/settings_fcb.h"
#include <zephyr/sys/printk.h>

#define NAME_DELETABLE "4/deletable"

struct flash_sector fcb_small_sectors[2] = {
	[0] = {
		.fs_off = 0x00000000,
		.fs_size = 4 * 1024
	},
	[1] = {
		.fs_off = 0x00001000,
		.fs_size = 4 * 1024
	}
};

struct deletable_s {
	bool valid;
	uint32_t val32;
} deletable_val;

uint32_t val4v2;

int c4_handle_export(int (*cb)(const char *name, const void *value, size_t val_len));
int c4_handle_set(const char *name, size_t len, settings_read_cb read_cb,
		  void *cb_arg);

struct settings_handler c4_test_handler = {
	.name = "4",
	.h_get = NULL,
	.h_set = c4_handle_set,
	.h_commit = NULL,
	.h_export = c4_handle_export
};

int c4_handle_set(const char *name, size_t len, settings_read_cb read_cb,
		  void *cb_arg)
{
	return 0;
}

int c4_handle_export(int (*cb)(const char *name, const void *value, size_t val_len))
{
	if (deletable_val.valid) {
		(void)cb(NAME_DELETABLE, &deletable_val.val32,
			 sizeof(deletable_val.val32));
	} else {
		(void)cb(NAME_DELETABLE, NULL, 0);
	}

	(void)cb("4/dummy", &val4v2, sizeof(val4v2));

	return 0;
}

static int check_compressed_cb(struct fcb_entry_ctx *entry_ctx, void *arg)
{
	char buf[SETTINGS_MAX_NAME_LEN + SETTINGS_MAX_VAL_LEN +
		 SETTINGS_EXTRA_LEN];
	int rc;
	int len;

	len = entry_ctx->loc.fe_data_len;
	if (len >= sizeof(buf)) {
		len = sizeof(buf) - 1;
	}

	rc = flash_area_read(entry_ctx->fap,
			     FCB_ENTRY_FA_DATA_OFF(entry_ctx->loc), buf, len);

	if (rc) {
		return 0;
	}
	buf[len] = '\0';

	rc = strncmp(buf, NAME_DELETABLE, sizeof(NAME_DELETABLE)-1);
	zassert_true(rc != 0, "The deleted settings shouldn be compressed.");

	return 0;
}

ZTEST(settings_config_fcb, test_config_compress_deleted)
{
	int rc;
	struct settings_fcb cf;
	int i;

	config_wipe_srcs();
	config_wipe_fcb(fcb_small_sectors, ARRAY_SIZE(fcb_small_sectors));

	cf.cf_fcb.f_magic = CONFIG_SETTINGS_FCB_MAGIC;
	cf.cf_fcb.f_sectors = fcb_small_sectors;
	cf.cf_fcb.f_sector_cnt = ARRAY_SIZE(fcb_small_sectors);

	rc = settings_fcb_src(&cf);
	zassert_true(rc == 0, "can't register FCB as configuration source");
	settings_mount_fcb_backend(&cf);

	rc = settings_fcb_dst(&cf);
	zassert_true(rc == 0,
		     "can't register FCB as configuration destination");

	rc = settings_register(&c4_test_handler);
	zassert_true(rc == 0, "settings_register fail");

	deletable_val.valid = true;
	deletable_val.val32 = 2018U;
	val4v2 = 0U;

	rc = settings_save();
	zassert_true(rc == 0, "fcb write error");

	deletable_val.valid = false;

	for (i = 0; ; i++) {
		val4v2++;

		rc = settings_save();
		zassert_true(rc == 0, "fcb write error");

		if (cf.cf_fcb.f_active.fe_sector == &fcb_small_sectors[1]) {
			/*
			 * The compression should happened while the active
			 * sector was changing.
			 */
			break;
		}
	}

	rc = fcb_walk(&cf.cf_fcb, &fcb_small_sectors[1], check_compressed_cb,
		      NULL);
	settings_unregister(&c4_test_handler);
}
