/*
 * SPDX-FileCopyrightText: Copyright (c) 2023 Carl Zeiss Meditec AG
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/devicetree.h>
#include <zephyr/drivers/emul.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/sensor.h>
#include <zephyr/ztest.h>

#include "adltc2990.h"
#include "adltc2990_emul.h"
#include "adltc2990_reg.h"

/* Colllection of common assertion macros */
#define CHECK_SINGLE_ENDED_VOLTAGE(sensor_val, index, pin_voltage, r1, r2)                         \
	zassert_ok(sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE));                   \
	zassert_ok(sensor_channel_get(fixture->dev, SENSOR_CHAN_VOLTAGE, sensor_val));             \
	zassert_between_inclusive(                                                                 \
		sensor_val[index].val1 + (float)sensor_val[index].val2 / 1000000,                  \
		(pin_voltage - 0.01f) * ((r1 + r2) / (float)r2),                                   \
		(pin_voltage + 0.01f) * ((r1 + r2) / (float)r2),                                   \
		"%f Out of Range [%f,%f] input %f, [%dmΩ, %dmΩ] "                                \
		"\nCheck if the sensor node is configured correctly",                              \
		(double)(sensor_val[index].val1 + (float)sensor_val[index].val2 / 1000000),        \
		(double)((pin_voltage - 0.01f) * ((r1 + r2) / (float)r2)),                         \
		(double)((pin_voltage + 0.01f) * ((r1 + r2) / (float)r2)), (double)pin_voltage,    \
		r1, r2);

#define CHECK_CURRENT(sensor_val, index, pin_voltage, r_microohms)                                 \
	zassert_ok(sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_CURRENT));                   \
	zassert_ok(sensor_channel_get(fixture->dev, SENSOR_CHAN_CURRENT, sensor_val));             \
	zassert_between_inclusive(                                                                 \
		sensor_val[index].val1 + (float)sensor_val[index].val2 / 1000000,                  \
		(pin_voltage - 0.01f) * ADLTC2990_MICROOHM_CONVERSION_FACTOR / r_microohms,        \
		(pin_voltage + 0.01f) * ADLTC2990_MICROOHM_CONVERSION_FACTOR / r_microohms,        \
		"%f Out of Range [%f,%f] input %f, current-resistor: %dµΩ\nCheck if the sensor " \
		"node is configured correctly",                                                    \
		(double)(sensor_val[index].val1 + (float)sensor_val[index].val2 / 1000000),        \
		(double)((pin_voltage - 0.001f) * ADLTC2990_MICROOHM_CONVERSION_FACTOR /           \
			 r_microohms),                                                             \
		(double)((pin_voltage + 0.001f) * ADLTC2990_MICROOHM_CONVERSION_FACTOR /           \
			 r_microohms),                                                             \
		(double)pin_voltage, r_microohms);

#define CHECK_TEMPERATURE(sensor_val, index, expected_temperature, temperature_type)               \
	zassert_ok(sensor_sample_fetch_chan(fixture->dev, temperature_type));                      \
	zassert_ok(sensor_channel_get(fixture->dev, temperature_type, sensor_val));                \
	zassert_equal(expected_temperature,                                                        \
		      sensor_val[index].val1 + (float)sensor_val[index].val2 / 1000000,            \
		      "expected %f, got %f", (double)expected_temperature,                         \
		      (double)(sensor_val[index].val1 + (float)sensor_val[index].val2 / 1000000));

/*** TEST-SUITE: ADLTC2990 Measurement Mode 0 0***/

struct adltc2990_0_0_fixture {
	const struct device *dev;
	const struct emul *target;
};

static void *adltc2990_0_0_setup(void)
{
	static struct adltc2990_0_0_fixture fixture = {
		.dev = DEVICE_DT_GET(DT_NODELABEL(adltc2990_0_0)),
		.target = EMUL_DT_GET(DT_NODELABEL(adltc2990_0_0)),
	};

	zassert_not_null(fixture.dev);
	zassert_not_null(fixture.target);
	return &fixture;
}

static void adltc2990_0_0_before(void *f)
{
	struct adltc2990_0_0_fixture *fixture = f;

	adltc2990_emul_reset(fixture->target);
}

ZTEST_SUITE(adltc2990_0_0, NULL, adltc2990_0_0_setup, adltc2990_0_0_before, NULL, NULL);

ZTEST_F(adltc2990_0_0, test_measure_mode_internal_temperature_only)
{
	struct sensor_value value[1];

	zassert_equal(-ENOTSUP, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_MAGN_X));
	zassert_equal(-ENOTSUP, sensor_channel_get(fixture->dev, SENSOR_CHAN_MAGN_Z, value));
	zassert_equal(-EINVAL, sensor_channel_get(fixture->dev, SENSOR_CHAN_CURRENT, value));
	zassert_equal(-EINVAL, sensor_channel_get(fixture->dev, SENSOR_CHAN_AMBIENT_TEMP, value));
}

/*** TEST-SUITE: ADLTC2990 Measurement Mode 4 3***/

struct adltc2990_4_3_fixture {
	const struct device *dev;
	const struct emul *target;
};

static void *adltc2990_4_3_setup(void)
{
	static struct adltc2990_4_3_fixture fixture = {
		.dev = DEVICE_DT_GET(DT_NODELABEL(adltc2990_4_3)),
		.target = EMUL_DT_GET(DT_NODELABEL(adltc2990_4_3)),
	};

	zassert_not_null(fixture.dev);
	zassert_not_null(fixture.target);
	return &fixture;
}

static void adltc2990_4_3_before(void *f)
{
	struct adltc2990_4_3_fixture *fixture = f;

	adltc2990_emul_reset(fixture->target);
}

ZTEST_SUITE(adltc2990_4_3, NULL, adltc2990_4_3_setup, adltc2990_4_3_before, NULL, NULL);

ZTEST_F(adltc2990_4_3, test_available_channels)
{
	struct sensor_value value[3];

	zassert_equal(0, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE));
	zassert_equal(0, sensor_channel_get(fixture->dev, SENSOR_CHAN_VOLTAGE, value));
	zassert_equal(0, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_AMBIENT_TEMP));
	zassert_equal(0, sensor_channel_get(fixture->dev, SENSOR_CHAN_AMBIENT_TEMP, value));
	zassert_equal(0, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_CURRENT));
	zassert_equal(0, sensor_channel_get(fixture->dev, SENSOR_CHAN_CURRENT, value));
}

/*** TEST-SUITE: ADLTC2990 Measurement Mode 1 3***/

struct adltc2990_1_3_fixture {
	const struct device *dev;
	const struct emul *target;
};

static void *adltc2990_1_3_setup(void)
{
	static struct adltc2990_1_3_fixture fixture = {
		.dev = DEVICE_DT_GET(DT_NODELABEL(adltc2990_1_3)),
		.target = EMUL_DT_GET(DT_NODELABEL(adltc2990_1_3)),
	};

	zassert_not_null(fixture.dev);
	zassert_not_null(fixture.target);
	return &fixture;
}

static void adltc2990_1_3_before(void *f)
{
	struct adltc2990_1_3_fixture *fixture = f;

	adltc2990_emul_reset(fixture->target);
}

ZTEST_SUITE(adltc2990_1_3, NULL, adltc2990_1_3_setup, adltc2990_1_3_before, NULL, NULL);

ZTEST_F(adltc2990_1_3, test_die_temperature)
{
	/* The following values are taken from datasheet and should translate to 125°c */
	uint8_t msb = 0b00000111, lsb = 0b11010000;

	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_MSB, &msb);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_LSB, &lsb);

	struct sensor_value temp_value[1];

	CHECK_TEMPERATURE(temp_value, 0, 125.00f, SENSOR_CHAN_DIE_TEMP);

	/*0b00011101 0b10000000 –40.0000*/
	msb = 0b00011101;
	lsb = 0b10000000;

	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_MSB, &msb);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_LSB, &lsb);

	CHECK_TEMPERATURE(temp_value, 0, -40.00f, SENSOR_CHAN_DIE_TEMP);
}

ZTEST_F(adltc2990_1_3, test_ambient_temperature)
{
	/* 0b00000001 0b10010001 +25.0625 */
	uint8_t msb = 0b00000001, lsb = 0b10010001;
	struct sensor_value temp_ambient[1];

	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_MSB, &msb);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_LSB, &lsb);

	CHECK_TEMPERATURE(temp_ambient, 0, 25.06250f, SENSOR_CHAN_AMBIENT_TEMP);
}

ZTEST_F(adltc2990_1_3, test_current)
{
	/* 0b00111100 0b01011000 +0.300 */
	uint8_t msb_reg_value = 0b00111100, lsb_reg_value = 0b01011000;

	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_MSB, &msb_reg_value);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_LSB, &lsb_reg_value);

	struct sensor_value current_values[1];
	const struct adltc2990_config *dev_config = fixture->target->dev->config;

	CHECK_CURRENT(current_values, 0, 0.3f, dev_config->pins_v1_v2.pins_current_resistor);

	/* 0b00100000 0b00000000 +0.159 */
	msb_reg_value = 0b00100000, lsb_reg_value = 0b00000000;
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_MSB, &msb_reg_value);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_LSB, &lsb_reg_value);
	CHECK_CURRENT(current_values, 0, 0.159f, dev_config->pins_v1_v2.pins_current_resistor);
}

ZTEST_F(adltc2990_1_3, test_V1_MINUS_V2_VCC)
{
	uint8_t msb = 0b01100000, lsb = 0b00000000;

	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_MSB, &msb);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_LSB, &lsb);

	msb = 0b00000010;
	lsb = 0b10001111;
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_VCC_MSB, &msb);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_VCC_LSB, &lsb);

	zassert_ok(sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE));

	struct sensor_value voltage_values[2];

	zassert_ok(sensor_channel_get(fixture->dev, SENSOR_CHAN_VOLTAGE, voltage_values));

	float test_value = voltage_values[0].val1 + (float)voltage_values[0].val2 / 1000000;

	zassert_between_inclusive(test_value, -0.16f, -0.159f, "Out of Range [-0.16,-0.159]%.6f",
				  (double)test_value);

	test_value = voltage_values[1].val1 + (float)voltage_values[1].val2 / 1000000;
	zassert_between_inclusive(test_value, 2.69f, 2.7f, "Out of Range [2.69, 2.7]%.6f",
				  (double)test_value);
}

/*** TEST-SUITE: ADLTC2990 Measurement Mode 5 3***/

struct adltc2990_5_3_fixture {
	const struct device *dev;
	const struct emul *target;
};

static void *adltc2990_5_3_setup(void)
{
	static struct adltc2990_5_3_fixture fixture = {
		.dev = DEVICE_DT_GET(DT_NODELABEL(adltc2990_5_3)),
		.target = EMUL_DT_GET(DT_NODELABEL(adltc2990_5_3)),
	};

	zassert_not_null(fixture.dev);
	zassert_not_null(fixture.target);
	return &fixture;
}

static void adltc2990_5_3_before(void *f)
{
	struct adltc2990_5_3_fixture *fixture = f;

	adltc2990_emul_reset(fixture->target);
}

ZTEST_SUITE(adltc2990_5_3, NULL, adltc2990_5_3_setup, adltc2990_5_3_before, NULL, NULL);

ZTEST_F(adltc2990_5_3, test_ambient_temperature)
{
	/*Kelvin 0b00010001 0b00010010 273.1250*/
	uint8_t msb = 0b00010001, lsb = 0b00010010;

	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_MSB, &msb);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_LSB, &lsb);

	struct sensor_value temp_value[2];

	CHECK_TEMPERATURE(temp_value, 0, 273.1250f, SENSOR_CHAN_AMBIENT_TEMP);

	/*Kelvin 0b00001110 0b10010010 233.125*/
	msb = 0b00001110;
	lsb = 0b10010010;
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_MSB, &msb);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_LSB, &lsb);
	CHECK_TEMPERATURE(temp_value, 1, 233.1250f, SENSOR_CHAN_AMBIENT_TEMP);
}

ZTEST_F(adltc2990_5_3, test_die_temperature)
{
	/*0b00011000 0b11100010 398.1250*/
	uint8_t msb = 0b00011000, lsb = 0b11100010;

	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_MSB, &msb);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_LSB, &lsb);

	struct sensor_value temp_value[1];

	CHECK_TEMPERATURE(temp_value, 0, 398.1250f, SENSOR_CHAN_DIE_TEMP);
}

/*** TEST-SUITE: ADLTC2990 Measurement Mode 7 3***/

struct adltc2990_6_3_fixture {
	const struct device *dev;
	const struct emul *target;
};

static void *adltc2990_6_3_setup(void)
{
	static struct adltc2990_6_3_fixture fixture = {
		.dev = DEVICE_DT_GET(DT_NODELABEL(adltc2990_6_3)),
		.target = EMUL_DT_GET(DT_NODELABEL(adltc2990_6_3)),
	};

	zassert_not_null(fixture.dev);
	zassert_not_null(fixture.target);
	return &fixture;
}

static void adltc2990_6_3_before(void *f)
{
	struct adltc2990_6_3_fixture *fixture = f;

	adltc2990_emul_reset(fixture->target);
}

ZTEST_SUITE(adltc2990_6_3, NULL, adltc2990_6_3_setup, adltc2990_6_3_before, NULL, NULL);

ZTEST_F(adltc2990_6_3, test_current)
{
	/* 0b00111100 0b01011000 +0.300 */
	uint8_t msb_reg_value = 0b00111100, lsb_reg_value = 0b01011000;

	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_MSB, &msb_reg_value);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_LSB, &lsb_reg_value);

	struct sensor_value current_values[2];
	const struct adltc2990_config *dev_config = fixture->target->dev->config;

	CHECK_CURRENT(current_values, 0, 0.3f, dev_config->pins_v1_v2.pins_current_resistor);

	/* 0b00100000 0b00000000 +0.159 */
	msb_reg_value = 0b00100000, lsb_reg_value = 0b00000000;
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_MSB, &msb_reg_value);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_LSB, &lsb_reg_value);
	CHECK_CURRENT(current_values, 1, 0.159f, dev_config->pins_v3_v4.pins_current_resistor);
}

/*** TEST-SUITE: ADLTC2990 Measurement Mode 7 3***/
struct adltc2990_7_3_fixture {
	const struct device *dev;
	const struct emul *target;
};

static void *adltc2990_7_3_setup(void)
{
	static struct adltc2990_7_3_fixture fixture = {
		.dev = DEVICE_DT_GET(DT_NODELABEL(adltc2990_7_3)),
		.target = EMUL_DT_GET(DT_NODELABEL(adltc2990_7_3)),
	};

	zassert_not_null(fixture.dev);
	zassert_not_null(fixture.target);
	return &fixture;
}

static void adltc2990_7_3_before(void *f)
{
	struct adltc2990_7_3_fixture *fixture = f;

	adltc2990_emul_reset(fixture->target);
}

ZTEST_SUITE(adltc2990_7_3, NULL, adltc2990_7_3_setup, adltc2990_7_3_before, NULL, NULL);

ZTEST_F(adltc2990_7_3, test_available_channels)
{
	zassert_equal(-EINVAL, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_AMBIENT_TEMP));
	zassert_equal(-EINVAL, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_CURRENT));
}

ZTEST_F(adltc2990_7_3, test_is_device_busy)
{
	uint8_t is_busy = BIT(0);

	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_STATUS, &is_busy);
	zassert_equal(-EBUSY, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_ALL));
	is_busy = 0;
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_STATUS, &is_busy);
	zassert_equal(0, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_ALL));
}

ZTEST_F(adltc2990_7_3, test_die_temperature)
{
	/* The following values are taken from datasheet and should translate to 398.1250K */

	uint8_t msb = 0b00011000, lsb = 0b11100010;

	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_MSB, &msb);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_LSB, &lsb);

	struct sensor_value *die_temp_value_null = (struct sensor_value *)NULL;

	zassert_equal(-EINVAL,
		      sensor_channel_get(fixture->dev, SENSOR_CHAN_ALL, die_temp_value_null));

	struct sensor_value die_temp_value[1];

	CHECK_TEMPERATURE(die_temp_value, 0, 398.1250f, SENSOR_CHAN_DIE_TEMP);
}

ZTEST_F(adltc2990_7_3, test_V1_V2_V3_V4_VCC)
{
	/* 0b00111111 0b11111111 >5 */
	uint8_t msb_reg_value = 0b00111111, lsb_reg_value = 0b11111111;

	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_MSB, &msb_reg_value);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_LSB, &lsb_reg_value);

	/* 0b00101100 0b11001101 3.500 */
	msb_reg_value = 0b00101100;
	lsb_reg_value = 0b11001101;
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V2_MSB, &msb_reg_value);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V2_LSB, &lsb_reg_value);

	/* 0b00011111 0b11111111 2.500 */
	msb_reg_value = 0b00011111;
	lsb_reg_value = 0b11111111;
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_MSB, &msb_reg_value);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_LSB, &lsb_reg_value);

	/* 0b01111100 0b00101001 –0.300 */
	msb_reg_value = 0b01111100;
	lsb_reg_value = 0b00101001;
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V4_MSB, &msb_reg_value);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V4_LSB, &lsb_reg_value);

	/* VCC = 6V */
	msb_reg_value = 0b00101100;
	lsb_reg_value = 0b11001101;
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_VCC_MSB, &msb_reg_value);
	adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_VCC_LSB, &lsb_reg_value);

	struct sensor_value voltage_values[5];

	const struct adltc2990_config *dev_config = fixture->dev->config;

	CHECK_SINGLE_ENDED_VOLTAGE(voltage_values, 0, 5.0f,
				   dev_config->pins_v1_v2.voltage_divider_resistors.v1_r1_r2[0],
				   dev_config->pins_v1_v2.voltage_divider_resistors.v1_r1_r2[1]);

	CHECK_SINGLE_ENDED_VOLTAGE(voltage_values, 1, 3.5f,
				   dev_config->pins_v1_v2.voltage_divider_resistors.v2_r1_r2[0],
				   dev_config->pins_v1_v2.voltage_divider_resistors.v2_r1_r2[1]);

	CHECK_SINGLE_ENDED_VOLTAGE(voltage_values, 2, 2.5f,
				   dev_config->pins_v3_v4.voltage_divider_resistors.v3_r1_r2[0],
				   dev_config->pins_v3_v4.voltage_divider_resistors.v3_r1_r2[1]);

	CHECK_SINGLE_ENDED_VOLTAGE(voltage_values, 3, -0.3f,
				   dev_config->pins_v3_v4.voltage_divider_resistors.v4_r1_r2[0],
				   dev_config->pins_v3_v4.voltage_divider_resistors.v4_r1_r2[1]);

	double test_value = voltage_values[4].val1 + (double)voltage_values[4].val2 / 1000000;

	zassert_between_inclusive(test_value, 6.0, 6.1, "Out of Range [6.0,6.1] %.6f",
				  (double)test_value);

	zassert_equal(6, voltage_values[4].val1);
}

/*** TEST-SUITE: ADLTC2990 Measurement Mode Incorrect***/
struct adltc2990_incorrect_fixture {
	const struct device *dev;
	const struct emul *target;
};

static void *adltc2990_incorrect_setup(void)
{
	static struct adltc2990_incorrect_fixture fixture = {
		.dev = DEVICE_DT_GET(DT_NODELABEL(adltc2990_incorrect)),
		.target = EMUL_DT_GET(DT_NODELABEL(adltc2990_incorrect)),
	};

	zassert_not_null(fixture.dev);
	zassert_not_null(fixture.target);
	return &fixture;
}

static void adltc2990_incorrect_before(void *f)
{
	struct adltc2990_incorrect_fixture *fixture = f;

	adltc2990_emul_reset(fixture->target);
}

ZTEST_SUITE(adltc2990_incorrect, NULL, adltc2990_incorrect_setup, adltc2990_incorrect_before, NULL,
	    NULL);

ZTEST_F(adltc2990_incorrect, test_current_cannot_be_measured)
{
	struct sensor_value current[1];

	zassert_equal(-EINVAL, sensor_channel_get(fixture->dev, SENSOR_CHAN_CURRENT, current));
}
