#include "hl.h"

typedef struct {
	char * attribute;
	char * foreground_color;
	char * background_color;
} terminal_hl_t;

extern display_t * cterm;

extern void cterm_render_callback(const char * const string,
                                  const int          length,
                                  void       * const attributes);

extern int terminal_hl_init(void);

display_t * cterm = &(display_t) {
	.key = "cterm",
	.callback = cterm_render_callback
};

void cterm_render_callback(const char * const string,
                           const int          length,
                           void       * const attributes) {
	if(!length){
		fputs(TERMINAL_STYLE_BOLD, stdout);
		putchar(*string);
		fputs(TERMINAL_RESET, stdout);
		return;
	}

	terminal_hl_t * term_hl = (terminal_hl_t*)attributes;
	if (term_hl->attribute) {
		fputs(term_hl->attribute, stdout);
	}
	if (term_hl->foreground_color) {
		fputs(term_hl->foreground_color, stdout);
	}
	for (int i = 0; i < length; i++) {
		putchar(*(string+i));
	}
	fputs(TERMINAL_RESET, stdout);
}


void fun(const char       *   const attribute,
         const char       *   const     color,
		       hl_group_t * *          group){
	terminal_hl_t * t = (terminal_hl_t *)malloc(sizeof(terminal_hl_t));
		t->attribute = attribute;
		t->foreground_color = color;;
		t->background_color = NULL;
	(*group) = (hl_group_t *)malloc(sizeof(hl_group_t));
		(*group)->link = NULL;
		(*group)->attributes = (void*)t;
}

int terminal_hl_init(void) {
	hl_init();
	new_display_mode(cterm);
	//
	fun(TERMINAL_STYLE_BOLD, TERMINAL_COLOR_FG_CYAN, &special_hl);
	fun(TERMINAL_STYLE_BOLD, TERMINAL_COLOR_FG_YELLOW, &control_hl);
	fun(NULL, TERMINAL_COLOR_FG_YELLOW, &operator_hl);
	fun(TERMINAL_STYLE_BOLD, TERMINAL_COLOR_FG_GREEN, &keyword_hl);
	fun(TERMINAL_STYLE_BOLD, TERMINAL_COLOR_FG_BLUE, &comment_hl);
	fun(TERMINAL_STYLE_BOLD, TERMINAL_COLOR_FG_RED, &string_literal_hl);

	return 0;
}