#define VERSION "0.0.1"

#define TAB_SIZE 4

/* THEME */
/* 38 and 48 is reversed as bar's color is reversed */

#define SURFACE_0_BG "\033[38;2;49;50;68m"
#define SURFACE_1_BG "\033[38;2;69;71;90m"
#define OVERLAY_2_BG "\033[38;2;147;153;178m"
#define BLACK_FG     "\033[40m"
#define BLACK_BG     "\033[30m"
#define WHITE_FG     "\033[48;2;205;214;244m"
#define WHITE_BG     "\033[38;2;205;214;244m"
#define BLUE_FG	     "\033[44m"
#define BLUE_BG      "\033[34m"
#define GREEN_FG     "\033[42m"
#define GREEN_BG     "\033[32m"
#define PEACH_FG     "\033[48;2;250;179;135m"
#define PEACH_BG     "\033[38;2;250;179;135m"
#define SKY_FG       "\033[48;2;137;220;235m"
#define SKY_BG       "\033[38;2;137;220;235m"
#define MAUVE_FG     "\033[48;2;203;166;247m"
#define MAUVE_BG     "\033[38;2;203;166;247m"
#define YELLOW_BG    "\033[33m"
#define RED_FG		 "\033[41m"
#define RED_BG		 "\033[31m"
#define TEAL_FG		 "\033[46m"
#define TEAL_BG		 "\033[36m"
#define PINK_FG		 "\033[45m"
#define PINK_BG		 "\033[35m"

/* ERROR is red with bold and italic */
#define ERROR "\033[31;1;3m"

enum keys {
	BACKSPACE = 127,
	ARROW_LEFT = 1000,
	ARROW_RIGHT,
	ARROW_UP,
	ARROW_DOWN,
	DEL_KEY,
	HOME_KEY,
	END_KEY,
	PAGE_UP,
	PAGE_DOWN
};

enum actions {
	COUNTING = 500,
	DELETE
};

enum modes {
	NORMAL,
	INSERT,
	VISUAL,
	COMMAND,
	PENDING0,
};

enum highlight {
	DEFAULT = 0,
	SYMBOL,
	COMMENT,
	TERMINATOR,
	MLCOMMENT,
	KW,
	KW_TYPE,
	KW_FN,
	KW_BRACKET,
	STRING,
	CHAR,
	ESCAPE,
	NUMBER,
	MATCH,
	RESET
};

typedef struct {
	int idx;
	int size;
	int render_size;
	char *chars;
	char *render;
	unsigned char *hl;
	int opened_comment;
} row_t;

#define MAX_KEYWORDS 100
#define MAX_EXTENSIONS 10

typedef struct {
	char *filetype;
	char *singleline_comment_start;
	char *multiline_comment_start;
	char *multiline_comment_end;
	char *keywords[MAX_KEYWORDS];
	char *extensions[MAX_EXTENSIONS];
} language_t;

typedef struct {
	int x, y; /* chars x, y */
	int rx; /* render x */
	int rowoff;
	int coloff;
	int rows;
	row_t *row;
	int dirty;
	int mode;
	char filename[PATH_MAX];
	char cwd[PATH_MAX];
	language_t *syntax;
} editor_t;

language_t langs[] = {
	{
		"c",
		"//",
		"/*",
		"*/",
		{ "const", "default", "switch", "if", "while", "for", "break", "continue", "return", "else", "struct", "union", "typedef", "static", "enum", "case", "sizeof", "#include", "#define", "#if", "#elseif", "#endif", "int|", "short|", "long|", "double|", "float|", "char|", "unsigned|", "void|", "size_t|", "uint8_t|", NULL },
		{ ".c", ".h", ".cpp", NULL },
	},
};

#define LANGS_LEN (sizeof(langs) / sizeof(langs[0]))

#define CTRL_KEY(k) ((k) & 0x1f)
#define MAX_COMMAND_SIZE 512