//#include <windows.h>
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
//#include <sstream>
#include <iostream>
#include <fstream>
#include <string>
#include "sierrachart.h"


SCDLLName("General_Dev")

SCSFExport scsf_Global_Cursor_Source(SCStudyInterfaceRef sc)
{
	int SGIndex = 0;
	SCSubgraphRef SgName = sc.Subgraph[SGIndex++];

	int InputIndex = 0;
	SCInputRef Data_File_Path = sc.Input[InputIndex++];
	SCInputRef  Run_Once_In = sc.Input[InputIndex++];

	// Section 1 - Set the configuration variables and defaults
	if (sc.SetDefaults)
	{
		sc.GraphName = "Global_Cursor_Source";

		sc.FreeDLL = 0;
		sc.AutoLoop = 0;
		sc.GraphRegion = 0;
		sc.UpdateAlways = 1;
		sc.ReceivePointerEvents = ACS_RECEIVE_POINTER_EVENTS_ALWAYS;

		Data_File_Path.Name = "Cursor data file path";
		Data_File_Path.SetPathAndFileName("D:\\SierraChart\\Data\\ActiveToolData.csv");

		Run_Once_In.Name = "Run one in how many cycles?";
		Run_Once_In.SetInt(10);


		return;
	}

	float& PreviousActiveToolPrice = sc.GetPersistentFloat(0);
	int& CycleCounter = sc.GetPersistentInt(0);
	float ActiveToolPrice;

	if (CycleCounter >= Run_Once_In.GetInt()) {

		ActiveToolPrice = sc.RoundToTickSize(sc.ActiveToolYValue, sc.TickSize);

		if ((ActiveToolPrice != PreviousActiveToolPrice) && ActiveToolPrice > 0)
		{
			std::ofstream file(Data_File_Path.GetString(), std::ios::out | std::ios::trunc);
			SCString Str;
			Str.Format("%f", ActiveToolPrice);
			file << Str;
			file.close();
		}
		PreviousActiveToolPrice = ActiveToolPrice;
		CycleCounter = 0;
	}
	CycleCounter++;
}


//============================================================================================================================

SCSFExport scsf_Global_Cursor_Destination(SCStudyInterfaceRef sc)
{
	int SGIndex = 0;
	SCSubgraphRef CrossHairGraphics = sc.Subgraph[SGIndex++];

	int InputIndex = 0;

	SCInputRef  Delete_After = sc.Input[InputIndex++];
	SCInputRef  Data_File_Path = sc.Input[InputIndex++];


	// Section 1 - Set the configuration variables and defaults
	if (sc.SetDefaults)
	{
		sc.GraphName = "Global_Cursor_Destination";

		sc.FreeDLL = 0;
		sc.AutoLoop = 0;  //Automatic looping is enabled.
		sc.GraphRegion = 1;
		sc.UpdateAlways = 1;

		CrossHairGraphics.Name = "CrossHair Graphics";
		CrossHairGraphics.DrawStyle = DRAWING_LINE;
		CrossHairGraphics.LineStyle = LINESTYLE_DOT;
		CrossHairGraphics.LineWidth = 3;
		CrossHairGraphics.PrimaryColor = RGB(255, 255, 255);

		Delete_After.Name = "Delete Crosshair After (Milliseconds)?";
		Delete_After.SetInt(2000);

		Data_File_Path.Name = "Cursor data file path";
		Data_File_Path.SetPathAndFileName("D:\\SierraChart\\Data\\ActiveToolData.csv");


		sc.Input[20].Name = "Target Chart Number";
		sc.Input[20].SetInt(0);

		sc.Input[21].Name = "Target Chart Number";
		sc.Input[21].SetInt(0);

		sc.Input[22].Name = "Target Chart Number";
		sc.Input[22].SetInt(0);

		sc.Input[23].Name = "Target Chart Number";
		sc.Input[23].SetInt(0);

		sc.Input[24].Name = "Target Chart Number";
		sc.Input[24].SetInt(0);

		return;
	}

	float& PreviousActiveToolPrice = sc.GetPersistentFloat(0);
	int& PreviousSystemTime = sc.GetPersistentInt(0);
	SCDateTimeMS CrosshairDrawingDateTimeMS;


	float ActiveToolPrice = 0.0;

	s_UseTool Crosshair_HLine, Get_Crosshair_HLine;

	SCString FileName;
	FileName = Data_File_Path.GetPathAndFileName();

		using namespace std;
		ifstream ip(FileName);
		if (ip.is_open())
		{
			string PriceString;

			while (ip.good())
			{
				getline(ip, PriceString, '\n');
			}

			if (PriceString != "") {
				ActiveToolPrice = stof(PriceString);
			}

		}


	if (sc.CurrentSystemDateTimeMS.GetTimeInSeconds() * 1000 + sc.CurrentSystemDateTimeMS.GetMillisecond()  >= CrosshairDrawingDateTimeMS.GetTimeInSeconds() * 1000  + CrosshairDrawingDateTimeMS.GetMillisecond() + Delete_After.GetInt() &&
		sc.GetUserDrawnDrawingByLineNumber(sc.ChartNumber, 310001, Crosshair_HLine))
	{
		sc.DeleteUserDrawnACSDrawing(sc.ChartNumber, 310001);
		for (int TargetChartCounter = 0; TargetChartCounter <= 9; TargetChartCounter++) {
			sc.DeleteUserDrawnACSDrawing(sc.Input[20 + TargetChartCounter].GetInt(), 310001);
		}

	}


	if ((ActiveToolPrice != PreviousActiveToolPrice) && ActiveToolPrice > 0)
	{
		Crosshair_HLine.Clear();
		Crosshair_HLine.AddAsUserDrawnDrawing = 1;
		Crosshair_HLine.ChartNumber = sc.ChartNumber;
		Crosshair_HLine.LineNumber = 310001;
		Crosshair_HLine.AddMethod = UTAM_ADD_OR_ADJUST;
		Crosshair_HLine.DrawingType = DRAWING_HORIZONTALLINE;
		Crosshair_HLine.LineWidth = CrossHairGraphics.LineWidth;
		Crosshair_HLine.LineStyle = CrossHairGraphics.LineStyle;
		Crosshair_HLine.Color = CrossHairGraphics.PrimaryColor;
		Crosshair_HLine.UseRelativeVerticalValues = 0;
		Crosshair_HLine.BeginValue = ActiveToolPrice;
		sc.UseTool(Crosshair_HLine);

		for (int TargetChartCounter = 0; TargetChartCounter <= 4; TargetChartCounter++) {
			if (sc.Input[20 + TargetChartCounter].GetInt() > 0) {

				Crosshair_HLine.Clear();
				Crosshair_HLine.AddAsUserDrawnDrawing = 1;
				Crosshair_HLine.ChartNumber = sc.Input[20 + TargetChartCounter].GetInt();
				Crosshair_HLine.LineNumber = 310001;
				Crosshair_HLine.AddMethod = UTAM_ADD_OR_ADJUST;
				Crosshair_HLine.DrawingType = DRAWING_HORIZONTALLINE;
				Crosshair_HLine.LineWidth = CrossHairGraphics.LineWidth;
				Crosshair_HLine.LineStyle = CrossHairGraphics.LineStyle;
				Crosshair_HLine.Color = CrossHairGraphics.PrimaryColor;
				Crosshair_HLine.UseRelativeVerticalValues = 0;
				Crosshair_HLine.BeginValue = ActiveToolPrice;
				sc.UseTool(Crosshair_HLine);
			}

			PreviousActiveToolPrice = ActiveToolPrice;
		}
	}

}
