/*
 * MeterDriver.c
 *
 *  Created on: 2021/6/4
 *      Author: foluswen
 */
#include 	"meterComm.h"
#include 	"curlApi.h"
#include 	"SystemLogMessage.h"
#include	"json-c/json.h"

#define is_error(ptr) 			((unsigned long)ptr > (unsigned long)-4000L)

unsigned char 	meterModel = 0;
char			meterApiAddress[128];


/**
 * Meter model initialize
 * @param model
 */
void meterInitialize(uint8_t model)
{
	meterModel = model;
}

/**
 * Meter api address assign
 * @param meterIndex
 */
void meterApiAssign(uint8_t meterIndex)
{
	switch(meterModel)
	{
		case METER_MODEL_LEM_L18005A:
		default:
			/*
			 * TODO:
			 * 	1. Check meter actual API address.
			 */
			sprintf(meterApiAddress, "http://192.168.0.%d/v1/livemeasure", (31 + meterIndex));
			//sprintf(meterApiAddress, "http://192.168.0.31/livemeasure");
			//sprintf(meterApiAddress, "https://foluswen.com/tmate/livemeasure.php"); // Simulator by web server

			break;
	}
}

/**
 * Output voltage read
 * @param meter_info
 * @return
 */
int readVoltage(Meter_Info *meter_info)
{
	int result = FAIL;
	uint8_t	data[4096];

	switch(meterModel)
	{

		case METER_MODEL_LEM_L18005A:
		default:
			if(httpGet((uint8_t*)meterApiAddress, data))
			{
				//printf("data: %s\n", data);
				//printf("meterApiAddress: %s\n", meterApiAddress);
				json_object *livemeasure;
				livemeasure = json_tokener_parse((char*)data);
				if(!is_error(livemeasure))
				{
					if(json_object_object_get(livemeasure, "voltage") != NULL)
						meter_info->presetVoltage = json_object_get_double(json_object_object_get(livemeasure, "voltage"));

					if(json_object_object_get(livemeasure, "current") != NULL)
						meter_info->presentCurrent = json_object_get_double(json_object_object_get(livemeasure, "current"));

					if(json_object_object_get(livemeasure, "power") != NULL)
						meter_info->presentPower = json_object_get_double(json_object_object_get(livemeasure, "power"));

					if(json_object_object_get(livemeasure, "energyImportTotal") != NULL)
						meter_info->totlizeImportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyImportTotal"));

					if(json_object_object_get(livemeasure, "energyExportTotal") != NULL)
						meter_info->totlizeExportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyExportTotal"));

					result = PASS;
				}
				json_object_put(livemeasure);
			}

			break;
	}

	return result;
}

/**
 * Output current read
 * @param meter_info
 * @return
 */
int readCurrent(Meter_Info *meter_info)
{
	int result = FAIL;
	uint8_t	data[4096];

	switch(meterModel)
	{
		case METER_MODEL_LEM_L18005A:
		default:
			if(httpGet((uint8_t*)meterApiAddress, data))
			{
				json_object *livemeasure;
				livemeasure = json_tokener_parse((char*)data);
				if(!is_error(livemeasure))
				{
					if(json_object_object_get(livemeasure, "voltage") != NULL)
						meter_info->presetVoltage = json_object_get_double(json_object_object_get(livemeasure, "voltage"));

					if(json_object_object_get(livemeasure, "current") != NULL)
						meter_info->presentCurrent = json_object_get_double(json_object_object_get(livemeasure, "current"));

					if(json_object_object_get(livemeasure, "power") != NULL)
						meter_info->presentPower = json_object_get_double(json_object_object_get(livemeasure, "power"));

					if(json_object_object_get(livemeasure, "energyImportTotal") != NULL)
						meter_info->totlizeImportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyImportTotal"));

					if(json_object_object_get(livemeasure, "energyExportTotal") != NULL)
						meter_info->totlizeExportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyExportTotal"));

					result = PASS;
				}
				json_object_put(livemeasure);
			}
			break;
	}

	return result;
}

/**
 * Output power read
 * @param meter_info
 * @return
 */
int readPower(Meter_Info *meter_info)
{
	int result = FAIL;
	uint8_t	data[4096];

	switch(meterModel)
	{
		case METER_MODEL_LEM_L18005A:
		default:
			if(httpGet((uint8_t*)meterApiAddress, data))
			{
				json_object *livemeasure;
				livemeasure = json_tokener_parse((char*)data);
				if(!is_error(livemeasure))
				{
					if(json_object_object_get(livemeasure, "voltage") != NULL)
						meter_info->presetVoltage = json_object_get_double(json_object_object_get(livemeasure, "voltage"));

					if(json_object_object_get(livemeasure, "current") != NULL)
						meter_info->presentCurrent = json_object_get_double(json_object_object_get(livemeasure, "current"));

					if(json_object_object_get(livemeasure, "power") != NULL)
						meter_info->presentPower = json_object_get_double(json_object_object_get(livemeasure, "power"));

					if(json_object_object_get(livemeasure, "energyImportTotal") != NULL)
						meter_info->totlizeImportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyImportTotal"));

					if(json_object_object_get(livemeasure, "energyExportTotal") != NULL)
						meter_info->totlizeExportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyExportTotal"));

					result = PASS;
				}
				json_object_put(livemeasure);
			}
			break;
	}

	return result;
}

/**
 * Export & import totalize energy read
 * @param meter_info
 * @return
 */
int readEnergy(Meter_Info *meter_info)
{
	int result = FAIL;
	uint8_t	data[4096];

	switch(meterModel)
	{
		case METER_MODEL_LEM_L18005A:
		default:
			if(httpGet((uint8_t*)meterApiAddress, data))
			{
				json_object *livemeasure;
				livemeasure = json_tokener_parse((char*)data);
				if(!is_error(livemeasure))
				{
					if(json_object_object_get(livemeasure, "voltage") != NULL)
						meter_info->presetVoltage = json_object_get_double(json_object_object_get(livemeasure, "voltage"));

					if(json_object_object_get(livemeasure, "current") != NULL)
						meter_info->presentCurrent = json_object_get_double(json_object_object_get(livemeasure, "current"));

					if(json_object_object_get(livemeasure, "power") != NULL)
						meter_info->presentPower = json_object_get_double(json_object_object_get(livemeasure, "power"));

					if(json_object_object_get(livemeasure, "energyImportTotal") != NULL)
						meter_info->totlizeImportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyImportTotal"));

					if(json_object_object_get(livemeasure, "energyExportTotal") != NULL)
						meter_info->totlizeExportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyExportTotal"));

					result = PASS;
				}
				json_object_put(livemeasure);
			}
			break;
	}

	return result;
}