#define USE_CONSOLE
#include <allegro.h>
#include <iostream>
#include "Owoc.h"

#include "Snake.h"
#include "Bonus.h"

 int punkty = 0;
 int czas = 80;
 bool menu = true;
 int bonus_czas=15;
 int czas_gry=0;
using namespace std;
void PetlaGry();
Owoc *o = nullptr;
Bonus *b = nullptr;
Snake *s = nullptr;
void Rysuj_obiekt(Ob_Graficzny *o);
void Aktualizuj_obiekt(Ob_Graficzny *o);
void Statystyki();
int pobierzX(Ob_Graficzny *o);
int pobierzY(Ob_Graficzny *o);
BITMAP * bufor = NULL;


int main()
{
	allegro_init();
	install_keyboard();
	set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0); //40x30
	set_window_title("Snake");
	bufor = create_bitmap( 800, 600 );
			if( !bufor )
			{
				set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
				allegro_message( "Nie moge zaladowac bufora" );
				allegro_exit();
				return 0;
			}
	while(!key[KEY_ESC]){
	blit( bufor, screen, 0, 0, 0, 0, 800, 600 );	
		
		
		if(menu==false){
					PetlaGry();
		}else{
		
					o = new Owoc();
					b = new Bonus(1,1); 
					menu = false;
					s = new Snake(0,0, bufor);
					s->Ustaw_Wartosci(0,1);
					Aktualizuj_obiekt(o);
			
		}

	
	}
	
	destroy_bitmap( bufor );
	
	return 0;
}
END_OF_MAIN();



void PetlaGry(){
	
		blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
		if (s->Sprawdz() == true){
		czas_gry++;
		bonus_czas--;
		clear_to_color( bufor, makecol( 0, 0, 0 ) );

		Rysuj_obiekt(s);
		Rysuj_obiekt(b);
		Rysuj_obiekt(o); 

		
		if (bonus_czas<=0){		
			Aktualizuj_obiekt(b); 
			bonus_czas=15;           
		}


			if ((pobierzX(s)==pobierzX(o))&&(pobierzY(s)==pobierzY(o)))
			{
				Aktualizuj_obiekt(o); 
				s->Dodaj();
				s->dlugosc++;
				punkty++;

			}

			if ((pobierzX(s)==pobierzX(b))&&(pobierzY(s)==pobierzY(b)))
			{
				bonus_czas=3; 
				Aktualizuj_obiekt(b);
				punkty+=3;

			}

			Aktualizuj_obiekt(s);
	
			s->Sprawdz();



		 if (punkty>=30) czas = 7;
		 else if(punkty>=20) czas=15;
		 else if(punkty>=15) czas=25;
		 else if(punkty>=10) czas=40;
		 else if(punkty>=5) czas=60;
		 else if(punkty>=3) czas=70;
		 rest(czas);

	}else{
		
		Statystyki();
	
	}
}



void Rysuj_obiekt(Ob_Graficzny *o){
	o->Rysuj (bufor);
}
void Aktualizuj_obiekt(Ob_Graficzny *o){
	o->Aktualizuj(bufor);
}
int pobierzX(Ob_Graficzny *o){
	return o->pobierzX();
}
int  pobierzY(Ob_Graficzny *o){
	return o->pobierzY();
}
void Statystyki(){
if (czas_gry>0){
	
	cout << "STATYSTYKI: "<<'\n';
	cout << "Punkty: "<<punkty<<'\n';
	cout << "Zjedzonych bonusow: "<< (punkty - s->dlugosc)/3 << '\n';
	cout << "Czas gry: " << czas_gry << '\n';
	s->Wypisz();
	czas_gry = 0;
}
		
}