#include <stdio.h>
#include <curses.h>
#include <console.h>

FILE_LICENCE ( GPL2_OR_LATER );

static void ansiscr_reset(struct _curses_screen *scr) __nonnull;
static void ansiscr_movetoyx(struct _curses_screen *scr,
                               unsigned int y, unsigned int x) __nonnull;
static void ansiscr_putc(struct _curses_screen *scr, chtype c) __nonnull;

unsigned short _COLS = 80;
unsigned short _LINES = 24;

static void ansiscr_reset ( struct _curses_screen *scr ) {
	/* Reset terminal attributes and clear screen */
	scr->attrs = 0;
	scr->curs_x = 0;
	scr->curs_y = 0;
	printf ( "\033[0m" );
}

static void ansiscr_movetoyx ( struct _curses_screen *scr,
			       unsigned int y, unsigned int x ) {
	if ( ( x != scr->curs_x ) || ( y != scr->curs_y ) ) {
		/* ANSI escape sequence to update cursor position */
		printf ( "\033[%d;%dH", ( y + 1 ), ( x + 1 ) );
		scr->curs_x = x;
		scr->curs_y = y;
	}
}

static void ansiscr_putc ( struct _curses_screen *scr, chtype c ) {
	unsigned int character = ( c & A_CHARTEXT );
	attr_t attrs = ( c & ( A_ATTRIBUTES | A_COLOR ) );
	int bold = ( attrs & A_BOLD );
	attr_t cpair = PAIR_NUMBER ( attrs );
	short fcol;
	short bcol;

	/* Update attributes if changed */
	if ( attrs != scr->attrs ) {
		scr->attrs = attrs;
		pair_content ( cpair, &fcol, &bcol );
		/* ANSI escape sequence to update character attributes */
		printf ( "\033[0;%d;3%d;4%dm", ( bold ? 1 : 22 ), fcol, bcol );
	}

	/* Print the actual character */
	putchar ( character );

	/* Update expected cursor position */
	if ( ++(scr->curs_x) == _COLS ) {
		scr->curs_x = 0;
		++scr->curs_y;
	}
}

static int ansiscr_getc ( struct _curses_screen *scr __unused ) {
	return getchar();
}

static bool ansiscr_peek ( struct _curses_screen *scr __unused ) {
	return iskey();
}

SCREEN _ansi_screen = {
	.init		= ansiscr_reset,
	.exit		= ansiscr_reset,
	.movetoyx	= ansiscr_movetoyx,
	.putc		= ansiscr_putc,
	.getc		= ansiscr_getc,
	.peek		= ansiscr_peek,
};
