#ifndef ACSIL_CUSTOM_CHART_BARS_H
#define ACSIL_CUSTOM_CHART_BARS_H


struct s_CustomChartBarInterface
{

public:
	s_CustomChartBarInterface();

	//All of the following are Input members
	ChartDataTypeEnum ChartDataType;//Indicates if this chart is based on historical Daily data or Intraday data.
	unsigned char IsDeterminingIfShouldStartNewBar;//1 = if the custom bar building function needs to indicate if should start a new chart bar. Otherwise, it is 0.
	unsigned char IsFinalProcessingAfterNewOrCurrentBar;
	unsigned char IsInsertFileRecordsProcessing;

	s_IntradayRecord NewFileRecord;
	uint32_t CurrentBarIndex;
	uint32_t ValueFormat;
	unsigned char IsNewFileRecord;
	unsigned char BarHasBeenCutAtStartOfSession;
	unsigned char IsNewChartBar;
	unsigned char IsFirstBarOfChart;//1 = When the first bar of the chart
	float TickSize;

	//The following are Output members
	unsigned char StartNewBarFlag;//Set to 1 to start a new chart bar. In this case NewFileRecord becomes part of the new chart bar.
	unsigned char InsertNewRecord;
	s_IntradayRecord NewRecordToInsert;

	// Functions

	float& GetChartBarValue(int SubgraphIndex, int BarIndex);
	const SCDateTime& GetChartBarDateTime(int BarIndex);
	SCInputRef& GetInput(int InputIndex);

	int& GetPersistentInt(int Key);
	float& GetPersistentFloat(int Key);
	double& GetPersistentDouble(int Key);
	int64_t& GetPersistentInt64(int Key);
	SCDateTime& GetPersistentSCDateTime(int Key);
	void SetLoadingDataObjectPointer(void* p_LoadingDataObject)
	{
		m_p_LoadingDataObject = p_LoadingDataObject;
	}

private:
	float& (SCDLLCALL* Internal_GetChartBarValue)(void* p_LoadingDataObject, int SubgraphIndex, int BarIndex);
	const SCDateTime& (SCDLLCALL*Internal_GetChartBarDateTime)(void* p_LoadingDataObject, int BarIndex);
	SCInputRef & (SCDLLCALL*Internal_GetInput)(void* p_LoadingDataObject, int InputIndex);

	int&  (SCDLLCALL* Internal_GetPersistentInt)(void* p_LoadingDataObject, int Key);
	float& (SCDLLCALL* Internal_GetPersistentFloat)(void* p_LoadingDataObject, int Key);
	double& (SCDLLCALL* Internal_GetPersistentDouble)(void* p_LoadingDataObject, int Key);
	int64_t& (SCDLLCALL* Internal_GetPersistentInt64)(void* p_LoadingDataObject, int Key);
	SCDateTime& (SCDLLCALL* Internal_GetPersistentSCDateTime)(void* p_LoadingDataObject, int Key);

	void* m_p_LoadingDataObject;

public:
	//Additional Input members
	float BidPrice;//The bid price associated with the last trade in NewFileRecord
	float AskPrice;//The ask price associated with the last trade in NewFileRecord

	const c_VAPContainer *VolumeAtPriceForBars;
};
/*==========================================================================*/
inline float& s_CustomChartBarInterface::GetChartBarValue(int SubgraphIndex, int BarIndex)
{
	return Internal_GetChartBarValue(m_p_LoadingDataObject, SubgraphIndex, BarIndex);
}
/*==========================================================================*/
inline const SCDateTime& s_CustomChartBarInterface::GetChartBarDateTime(int BarIndex)
{
	return Internal_GetChartBarDateTime(m_p_LoadingDataObject, BarIndex);
}
/*==========================================================================*/
inline SCInputRef& s_CustomChartBarInterface::GetInput(int InputIndex)
{
	return Internal_GetInput(m_p_LoadingDataObject,  InputIndex);
}
/*==========================================================================*/

inline int&  s_CustomChartBarInterface::GetPersistentInt( int Key)
{
	return Internal_GetPersistentInt(m_p_LoadingDataObject, Key);
}
/*==========================================================================*/
inline float& s_CustomChartBarInterface::GetPersistentFloat(int Key)
{
	return Internal_GetPersistentFloat(m_p_LoadingDataObject, Key);

}
/*==========================================================================*/
inline double& s_CustomChartBarInterface::GetPersistentDouble(int Key)
{
	return Internal_GetPersistentDouble(m_p_LoadingDataObject, Key);

}
/*==========================================================================*/
inline int64_t& s_CustomChartBarInterface::GetPersistentInt64(int Key)
{
	return Internal_GetPersistentInt64(m_p_LoadingDataObject, Key);
}
/*==========================================================================*/
inline SCDateTime& s_CustomChartBarInterface::GetPersistentSCDateTime(int Key)
{
	return Internal_GetPersistentSCDateTime(m_p_LoadingDataObject, Key);
}
/*==========================================================================*/

typedef s_CustomChartBarInterface& SCCustomChartBarInterfaceRef;

typedef void (SCDLLCALL* fp_ACSCustomChartBarFunction)(SCCustomChartBarInterfaceRef);

#endif