
#include "new_http.h"
#include "../obk_config.h"

#if ENABLE_HA_DISCOVERY

#include "../cJSON/cJSON.h"
#include "../new_pins.h"
#include "../mqtt/new_mqtt.h"
#include "../cmnds/cmd_public.h"

typedef enum {
	/// @brief Switch
	RELAY = 0,

	/// @brief 
	LIGHT_ON_OFF,

	/// @brief Single PWM
	LIGHT_PWM,

	/// @brief 2 PWM setup (brightness and temperature)
	LIGHT_PWMCW,

	/// @brief RGB (3 PWM)
	LIGHT_RGB,

	/// @brief RGB + temperature (5 PWM or LED driver)
	LIGHT_RGBCW,

	/// @brief Power sensors (voltage, current, power)
	ENERGY_METER_SENSOR,

	POWER_SENSOR,

	/// @Brief Binary Sensor
	BINARY_SENSOR,

	/// @brief Temperature sensor
	TEMPERATURE_SENSOR,
	/// @brief Humidity sensor
	HUMIDITY_SENSOR,

	/// @brief Battery level sensor in perc, under battery topic
	BATTERY_SENSOR,
	/// @brief Battery votage sensor in mV
	BATTERY_VOLTAGE_SENSOR,

	/// @brief CO2 sensor in ppm
	CO2_SENSOR,
	/// @brief TVOC sensor in ppb
	TVOC_SENSOR,

	/// @brief 
	VOLTAGE_SENSOR,
	/// @brief 
	CURRENT_SENSOR,
	/// @brief 
	//POWER_SINGLE_SENSOR,
	/// @brief 
	POWERFACTOR_SENSOR,
	/// @brief 
	FREQUENCY_SENSOR,
	/// @brief 
	CUSTOM_SENSOR,
	/// @brief 
	SMOKE_SENSOR,
	/// @brief 
	READONLYLOWMIDHIGH_SENSOR,
	// lx unit
	ILLUMINANCE_SENSOR,
	/// @brief °C unit
	HASS_TEMP,
	/// @brief dBm unit
	HASS_RSSI,
	/// @brief Time firmware is alive in secs
	HASS_UPTIME,
	/// @brief Firmware build info
	HASS_BUILD,
	/// @brief 
	HASS_SSID,
	/// @brief 
	HASS_IP,
	/// @brief Wh, kWh
	ENERGY_SENSOR,
	// hPa
	PRESSURE_SENSOR,
	/// @Brief Timestamp Sensor
	TIMESTAMP_SENSOR,
	// Ph
	WATER_QUALITY_PH,
	// ORP
	WATER_QUALITY_ORP,
	// TDS
	WATER_QUALITY_TDS,
	/// @brief Battery level sensor in perc, under channel topic
	BATTERY_CHANNEL_SENSOR,
	HASS_HVAC,
	HASS_FAN,
	HASS_SELECT,
	HASS_PERCENT,
	HASS_TEXTFIELD,
	HASS_BUTTON,
	// @Brief ChType_ReadOnlyEnum, readonly with value_template
	HASS_READONLYENUM,
	HASS_GARAGE,

} ENTITY_TYPE;

typedef enum {
	HASS_CATEGORY_CONFIG = 0,
	HASS_CATEGORY_DIAGNOSTIC = 1,
} HASS_CATEGORY_TYPE;
//unique_id is defined in hass_populate_unique_id and is based on CFG_GetDeviceName() whose size is CGF_DEVICE_NAME_SIZE.
//Sample unique_id would be deviceName_entityType_index.
//Currently supported entityType is `relay` or `light` - 5 char.
#define HASS_UNIQUE_ID_SIZE     (CGF_DEVICE_NAME_SIZE + 1 + 5 + 1 + 4)

//channel is based on unique_id (see hass_populate_device_config_channel)
#define HASS_CHANNEL_SIZE       (HASS_UNIQUE_ID_SIZE + 32)

//Size of JSON (1 less than MQTT queue holding)
#define HASS_JSON_SIZE          (MQTT_PUBLISH_ITEM_VALUE_LENGTH - 1)

/// @brief HomeAssistant device discovery information
typedef struct HassDeviceInfo_s {
	char unique_id[HASS_UNIQUE_ID_SIZE];
	char channel[HASS_CHANNEL_SIZE];
	char json[HASS_JSON_SIZE];

	cJSON* root;
	cJSON* device;
	cJSON* ids;
} HassDeviceInfo;

void hass_print_unique_id(http_request_t* request, const char* fmt, ENTITY_TYPE type, int index, int asensdatasetix);
HassDeviceInfo* hass_init_relay_device_info(int index, ENTITY_TYPE type, bool bInverse);
HassDeviceInfo* hass_init_device_info(ENTITY_TYPE type, int index, const char* payload_on, const char* payload_off, int asensdatasetix, const char *title);
HassDeviceInfo* hass_init_light_device_info(ENTITY_TYPE type);
HassDeviceInfo* hass_init_energy_sensor_device_info(int index, int asensdatasetix);
HassDeviceInfo* hass_init_light_singleColor_onChannels(int toggle, int dimmer, int brightness_scale);
HassDeviceInfo* hass_init_binary_sensor_device_info(int index, bool bInverse);
HassDeviceInfo* hass_init_sensor_device_info(ENTITY_TYPE type, int channel, int decPlaces, int decOffset, int divider);
HassDeviceInfo* hass_createHVAC(float min, float max, float step, const char **fanOptions, int numFanOptions,
	const char **swingOptions, int numSwingOptions, const char **swingHOptions, int numSwingHOptions);
HassDeviceInfo* hass_createFanWithModes(const char *label, const char *stateTopic,
	const char *command, const char **options, int numOptions);
HassDeviceInfo* hass_createSelectEntity(const char* state_topic, const char* command_topic, int numoptions,
	const char* options[], const char* title);
HassDeviceInfo* hass_createSelectEntityIndexed(const char* state_topic, const char* command_topic, int numoptions,
	const char* options[], const char* title);
HassDeviceInfo* hass_createSelectEntityIndexedCustom(const char* state_topic, const char* command_topic, int numoptions,
	const char* options[], const char* title, char* value_template, char* command_template);
HassDeviceInfo* hass_createGarageEntity(const char* state_topic, const char* command_topic,
	const char *title);
HassDeviceInfo* hass_createShutter(int index);

HassDeviceInfo* hass_createToggle(const char *label, const char *stateTopic, const char *commandTopic);
HassDeviceInfo* hass_init_textField_info(int index);
const char* hass_build_discovery_json(HassDeviceInfo* info);
void hass_free_device_info(HassDeviceInfo* info); 
char *hass_generate_multiplyAndRound_template(int decimalPlacesForRounding, int decimalPointOffset, int divider);
HassDeviceInfo* hass_init_textField_info(int index);
HassDeviceInfo* hass_init_button_device_info(char* title,char* cmd_id, char* press_payload, HASS_CATEGORY_TYPE type);
#endif // ENABLE_HA_DISCOVERY
