#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif


U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 16, /* data=*/ 17);   // ESP32 Thing, HW I2C with pin remapping


byte CompletedPercents, MarginTop, VolumeAccuracy = 0;
unsigned long timeDisplay;
byte Animation;


unsigned long HeatMills		= 0;
float DrainVolume			= 400;


float VolumeCritical 		= 5000;
float VolumeAuto		 	= 4400;
float MinimumVolume			= 400;

bool setTask				= false;

bool pumpIsEnabled = false;
bool pumpProtection = false;

bool showItem = false;
bool SelectItem = false;



float CompletedVolume		= 3600;
float FullVolume			= 5000;

void setup(void) {
	//Dispaly
	u8g2.begin();				
	u8g2.enableUTF8Print();


}

void loop(void) {

	if(millis() - timeDisplay > 333) {	
		
		timeDisplay = millis();	

		u8g2.firstPage();
	  do {

			Prepare();


			u8g2.setCursor(0, -1);
			
				u8g2.print("Cвoбoднo:");

				//u8g2.print("Q: ?");

				u8g2.setCursor(50, -1);
				u8g2.print(2680);
			
				//Нарисовать горизонтальную линюю
			u8g2.drawHLine(0,10,100);

			u8g2.setCursor(0, 12);
			u8g2.print("Уpoвeнь:");
			u8g2.setCursor(50, 12);

			u8g2.print("1.023");
		
			u8g2.setCursor(0, 21);
			u8g2.print("3aнято:");
			u8g2.setCursor(50, 21);

			u8g2.print(3400);
				//Нарисовать горизонтальную линюю
			u8g2.drawHLine(0,33,100);

			u8g2.setCursor(0, 34);		
			u8g2.print("3: 350"); 

				u8g2.setCursor(43, 34);
				u8g2.print("03:00");  

				u8g2.setCursor(75, 34);
				u8g2.print("04:45");   

				u8g2.setCursor(0, 44);
				u8g2.print("P: 3500");

			u8g2.setCursor(43, 44);
			u8g2.print("K: 4800");      


				u8g2.setCursor(0, 54);
					
				//Отобразить время с ведущими нулями
				u8g2.print("00:00:00");      

								
			u8g2.setCursor(43, 54);
				
				u8g2.print(" l : ");

					if(pumpIsEnabled) {			
				//Отобразить счетчик откачанной за текущую сессию жидкости
					u8g2.drawHLine(44,57,3); //Стрелка вверх
					u8g2.drawHLine(43,58,5); //Стрелка вверх
				}
				else {
					u8g2.drawHLine(43,60,5); //Стрелка вниз
					u8g2.drawHLine(44,61,3); //Стрелка вниз
				}
				//u8g2.drawHLine(44,57,3); //Стрелка вверх
				//u8g2.drawHLine(43,58,5); //Стрелка вверх	

				u8g2.print("248");

			
				
			u8g2.setCursor(95, -2);
				u8g2.print("*");

			u8g2.setCursor(43, 54);
				//u8g2.print("+") + u8g2.print("248") + u8g2.print(" -") + u8g2.print("400");



			if(pumpIsEnabled) {
				Animation = GetAnimation();
				ShowCircle();
			}



			if(showItem) {
				byte radius = (pumpIsEnabled) ? 7 : 9;
				u8g2.drawDisc(90, 54, radius, 31);
				u8g2.setDrawColor(0);
				//u8g2.drawCircle(90, 54, 9);
				if(SelectItem) {
					u8g2.setCursor(84, 49);
					u8g2.print("0|1");
				}
				else {
					u8g2.setCursor(88, 49);
					u8g2.print("H");
				}	
				u8g2.setDrawColor(1);	
			}	

			if(!pumpIsEnabled && !showItem) {
				u8g2.setCursor(97, 54);
				u8g2.print("l");
				u8g2.drawHLine(96,57,3); //Стрелка вверх
				u8g2.drawHLine(95,58,5); //Стрелка вверх		
			}	
		
		
		calculateCompletePercents(CompletedVolume);

		if(setTask) calculateCompletePercents(MinimumVolume);

		ShowBoxPercent();

		}
		while( u8g2.nextPage() );	
	}
}


//Показать процеты заполнения емкости
void ShowBoxPercent() {
	
	u8g2.drawFrame(101,0,27,64);
	
	byte CompletedPercentsMainBox = CompletedPercents;
	byte MarginTopMainMainBox = MarginTop;
	
	bool color = true;

	

	//Нарисовать прерывистую линию для установки задания
	//if(setTask) drawDottedLine();
	if(!setTask) {
		// u8g2.drawHLine(102,MarginTopMainMainBox,25);	
		u8g2.drawBox(102,MarginTopMainMainBox,25,64);
		if(CompletedPercentsMainBox > 23) {
			u8g2.setCursor(102, 54);
			u8g2.setDrawColor(0);
			color = false;
		} 
		else u8g2.setCursor(103, 0);	
	}

	ShowLinesForJob(color);

	if(!setTask) {
		if (HeatMills > 0) u8g2.print((millis() - HeatMills)/1000) + u8g2.print("c");
		else if(DrainVolume > 0) u8g2.print(DrainVolume, VolumeAccuracy);
	}
	
	if(CompletedPercentsMainBox < 16) u8g2.setCursor(103, MarginTopMainMainBox - 10);
	else {
		if(!setTask) u8g2.setDrawColor(0);
		char MCorrection = (!setTask) ? 1 : 0;
		u8g2.setCursor(103 - MCorrection, MarginTopMainMainBox - MCorrection);
	}
	
	u8g2.print(CompletedPercentsMainBox) + u8g2.print("%");

}

//Нарисовать прерывистые линии на процентной шкале, для критического, расписания и минимального уровня
void ShowLinesForJob(bool color) {
	float volume = VolumeCritical; 
	for(byte i=0;i<3;i++){
		if(i==1) volume = VolumeAuto;
		else if(i==2) volume = MinimumVolume;
		if(volume) {
			calculateCompletePercents(volume);
			drawDottedLine();
			u8g2.setDrawColor(color);
		}
	}
}

//Нарисовать прерывистую линию на процентной шкале
void drawDottedLine() {
	byte i = 101;
	bool color = true;
	for(i;i<128;i++){
		u8g2.setDrawColor(color);
		u8g2.drawPixel(i,MarginTop);
		color = !color;
	}	
}

//Посчитать проценты заполнения емкости
void calculateCompletePercents(float volume) {
	CompletedPercents = (volume / FullVolume) * 100;
	MarginTop = (6300 - (63 * CompletedPercents)) / 100;
}

void Prepare(void) {
	u8g2.setFont(u8g2_font_haxrcorp4089_t_cyrillic);
	u8g2.setFontRefHeightExtendedText();
	u8g2.setDrawColor(1);
	u8g2.setFontPosTop();
	//u8g2.setFontDirection(0);
}



//Плучить анимацию для вращения насоса
byte GetAnimation(void) {
	if(pumpProtection) return (Animation == 16) ? 31 : 16; //Анимация для насоса если он не может прокачать
	//return (Animation == 10) ? 5 : 10; 
	//Анимация для нормальной работы насоса (4 кадра по часовой стрелке)
	//if(Animation==8) return 4;
	//if(Animation==4) return 2;
	//return (Animation==2) ? 1 : 8;	
	//Анимация для нормальной работы насоса (4 кадра против часовой стрелки)
	if(Animation==2) return 4;
	if(Animation==4) return 8;
	return (Animation==8) ? 1 : 2;
}

//Показать вращение насоса
void ShowCircle(void) {
	u8g2.drawDisc(90, 54, 9, GetAnimation());
	u8g2.drawDisc(90, 54, 4, 31);
	u8g2.drawCircle(90, 54, 9);
}