#include <stdio.h>
#include <time.h>

#include "mechanics.h"
#include "printing.h"

#define maxSerpentLength 50
#define ESCAPE_KEY 27


int bodyCoordinatesX[maxSerpentLength];
int bodyCoordinatesY[maxSerpentLength];
	extern struct moveData dane;


int main()
{

	dane.existsApple=0;
	dane.crawlDirection=KEY_UP;
	dane.tmp=-1;
	dane.maxX=55;
	dane.maxY=18;
	dane.minX=25;
	dane.minY=5;
	dane.speedLevel=5;
	dane.gameTime=0;
	dane.appleX=0;
	dane.appleY=0;
	dane.applesEaten=0;
	dane.serpentLength=5;
	dane.x=dane.minX+(dane.maxX-dane.minX)/2;
	dane.y=dane.minY+(dane.maxY-dane.minY)/2;

	srand(time(NULL));

	int interrupt;
	bool interrupted = 0;
	int existsApple = 0;
	int ch = KEY_UP;

	int k;
	for(k = 0; k < maxSerpentLength; k++)
	{
		bodyCoordinatesX[k] = dane.x;
		bodyCoordinatesY[k] = dane.y;
	}
	initscr();
	raw();
	noecho();
	intrflush(stdscr, 1);
	keypad(stdscr, 1);

	while(!isGameOver()||dane.gameTime < 10)
	{
		dane.gameTime++;
		if (!dane.existsApple) 
		{
			dane.appleX = dane.minX + rand()%(dane.maxX - dane.minX); 
			dane.appleY = dane.minY + rand()%(dane.maxY - dane.minY);
			dane.existsApple = 1;
		}
		
		halfdelay(dane.speedLevel);
		dane.tmp = getch();
		if ((dane.tmp == KEY_RIGHT || dane.tmp == KEY_LEFT
			|| dane.tmp == KEY_UP || dane.tmp == KEY_DOWN)
			&& dane.tmp != ch)ch = dane.tmp;
		if(dane.tmp==ESCAPE_KEY)
		{
			halfdelay(50);
			move(dane.minY-2,dane.minX-1);
			printw("Paused for 5 seconds. Exit? (Y/N) ",dane.applesEaten);
			interrupt = getch();
			if(interrupt=='y'||interrupt=='Y')
			{
				interrupted = 1;
				break;
			}
			halfdelay(dane.speedLevel);
		}
		MoveSerpent(&ch);

		PrintGameArea();

		if (bodyCoordinatesY[0] == dane.appleY && 
			bodyCoordinatesX[0] == dane.appleX)
		{
			dane.existsApple = 0;
			dane.applesEaten++;
			if (dane.serpentLength<maxSerpentLength) dane.serpentLength++;
		}		

		move(0,0);

	}
	/*move(dane.y,dane.x);
	printw("#");
	move(dane.minY+3,dane.minX+(dane.maxX-dane.minX)/2-5);
	printw("GAME OVER!");*/
	PrintGameOver();
	halfdelay(1);
	for(k = 0; k < 20; k++)
	{
		getch();
	}
	if(!interrupted)
		halfdelay(100);
	else
		halfdelay(20);
	getch();	
	nocbreak();
	endwin();
	return 0;
}

