#include <ncurses.h> //getch printw addch attron attroff
#include <unistd.h> //sleep unix only
#include <time.h>  //clock
#include "co.h"

void TBegin(){
	initscr();
	//setlocale(LC_ALL, "");
	cbreak();
	noecho();
	nodelay(stdscr,1);
	if (has_colors() == 0 ){
		printw("no color");
	}
	else{
		start_color();
		init_pair(RED,COLOR_RED,COLOR_BLACK);
		init_pair(GREEN,COLOR_GREEN,COLOR_BLACK);
		init_pair(YELLOW,COLOR_YELLOW,COLOR_BLACK);
		init_pair(BLUE,COLOR_BLUE,COLOR_BLACK);
		init_pair(MAGENTA,COLOR_MAGENTA,COLOR_BLACK);
		init_pair(CYAN,COLOR_CYAN,COLOR_BLACK);
		init_pair(WHITE,COLOR_WHITE,COLOR_BLACK);
		init_pair(BLACK,COLOR_BLACK,COLOR_BLACK);
	}

}


void TEnd(){
	endwin();
}

void Prnt(char * txt, char col, char row, enum COLOR color){
	move(row,col);
	attron(COLOR_PAIR(color));
	printw(txt);
	attroff(COLOR_PAIR(color));
	move(23,31);
}

void Plt(char col, char row, enum COLOR color){
	move(row,col);
	attron(COLOR_PAIR(color)|A_REVERSE);
	addch(' ');
	attroff(COLOR_PAIR(color)|A_REVERSE);
	move(23,31);
}

enum BTN key[9];
void Clr(){
	for(int i=0;i<9;i++){
		key[i] = 0;
	}

	refresh();
}
int Btn(enum BTN btn){
	int k = getch();
	while (k != ERR){
		key[Any] = 1;
		switch(k){
			case KEY_UP: key[Up] = 1; break;
			case KEY_DOWN: key[Dn] = 1; break;
			case KEY_LEFT: key[Lt] = 1; break;
			case KEY_RIGHT: key[Rt] = 1; break;
			case 'a':
			case 'z': key[A] = 1; break;
			case 'x': key[B] = 1; break;
			case 27:
			case 'q': key[Pause] = 1; break;	
		}
		k = getch();
	}
	return key[btn];
}

clock_t LastTck = 0;
void Tck(){
	clock_t RangeTck = CLOCKS_PER_SEC / Fps;
	unsigned int USleepMax = 1000 / Fps;
	unsigned int slp = USleepMax;
	clock_t nowTck = clock();
	clock_t diffTck = nowTck - LastTck;
	if (diffTck < RangeTck){
		clock_t TimeLeft = RangeTck - diffTck;
		slp = USleepMax * TimeLeft / RangeTck;
	}	
	usleep(slp);
}
void ABegin(){}
void AEnd(){}
void Bt(){}
