#include "types.h"
#include "common.h"

// int xlFontSize(FontHandle handle);
ERL_NIF_TERM c_xlFontSize(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	int ret = xlFontSize(font_resource->handle);

	return enif_make_int(env, ret);
}

// void xlFontSetSize(FontHandle handle, int size);
ERL_NIF_TERM c_xlFontSetSize(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	int size;

	if (0 == enif_get_int(env, argv[1], &size)) {
		return enif_make_badarg(env);
	}

	xlFontSetSize(font_resource->handle, size);

	return enif_make_atom(env, "nil");
}

// int xlFontItalic(FontHandle handle);
ERL_NIF_TERM c_xlFontItalic(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	int ret = xlFontItalic(font_resource->handle);

	return enif_make_int(env, ret);
}

// void xlFontSetItalic(FontHandle handle, int italic);
ERL_NIF_TERM c_xlFontSetItalic(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	int italic;

	if (0 == enif_get_int(env, argv[1], &italic)) {
		return enif_make_badarg(env);
	}

	xlFontSetItalic(font_resource->handle, italic);

	return enif_make_atom(env, "nil");
}

// int xlFontStrikeOut(FontHandle handle);
ERL_NIF_TERM c_xlFontStrikeOut(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	int ret = xlFontStrikeOut(font_resource->handle);

	return enif_make_int(env, ret);
}

// void xlFontSetStrikeOut(FontHandle handle, int strikeOut);
ERL_NIF_TERM c_xlFontSetStrikeOut(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	int strike_out;

	if (0 == enif_get_int(env, argv[1], &strike_out)) {
		return enif_make_badarg(env);
	}

	xlFontSetStrikeOut(font_resource->handle, strike_out);

	return enif_make_atom(env, "nil");
}

// int xlFontColor(FontHandle handle);
ERL_NIF_TERM c_xlFontColor(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	int ret = xlFontColor(font_resource->handle);

	return enif_make_int(env, ret);
}

// void xlFontSetColor(FontHandle handle, int color);
ERL_NIF_TERM c_xlFontSetColor(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	int color;

	if (0 == enif_get_int(env, argv[1], &color)) {
		return enif_make_badarg(env);
	}

	xlFontSetColor(font_resource->handle, color);

	return enif_make_atom(env, "nil");
}

// int xlFontBold(FontHandle handle);
ERL_NIF_TERM c_xlFontBold(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	int ret = xlFontBold(font_resource->handle);

	return enif_make_int(env, ret);
}

// void xlFontSetBold(FontHandle handle, int bold);
ERL_NIF_TERM c_xlFontSetBold(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	int bold;

	if (0 == enif_get_int(env, argv[1], &bold)) {
		return enif_make_badarg(env);
	}

	xlFontSetBold(font_resource->handle, bold);

	return enif_make_atom(env, "nil");
}

// int xlFontScript(FontHandle handle);
ERL_NIF_TERM c_xlFontScript(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	int ret = xlFontScript(font_resource->handle);

	return enif_make_int(env, ret);
}

// void xlFontSetScript(FontHandle handle, int script);
ERL_NIF_TERM c_xlFontSetScript(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	int script;

	if (0 == enif_get_int(env, argv[1], &script)) {
		return enif_make_badarg(env);
	}

	xlFontSetScript(font_resource->handle, script);

	return enif_make_atom(env, "nil");
}

// int xlFontUnderline(FontHandle handle);
ERL_NIF_TERM c_xlFontUnderline(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	int ret = xlFontUnderline(font_resource->handle);

	return enif_make_int(env, ret);
}

// void xlFontSetUnderline(FontHandle handle, int underline);
ERL_NIF_TERM c_xlFontSetUnderline(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	int underline;

	if (0 == enif_get_int(env, argv[1], &underline)) {
		return enif_make_badarg(env);
	}

	xlFontSetUnderline(font_resource->handle, underline);

	return enif_make_atom(env, "nil");
}

// const wchar_t* xlFontName(FontHandle handle);
ERL_NIF_TERM c_xlFontName(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	const wchar_t *wstr = xlFontName(font_resource->handle);

	if(!wstr) {
		return enif_make_atom(env, "error");
	}

	ErlNifBinary ret = convertWcharToMbBinary(wstr);

	if(!ret.data) {
		return enif_make_atom(env, "error");
	}

	return enif_make_binary(env, &ret);
}

// void xlFontSetName(FontHandle handle, const wchar_t* name);
ERL_NIF_TERM c_xlFontSetName(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	FontType *font_resource = NULL;

	if (0 == enif_get_resource(env, argv[0], TypeOfFont, (void**)&font_resource)) {
		return enif_make_badarg(env);
	}

	ErlNifBinary name_temp;

	if(enif_inspect_binary(env, argv[1], &name_temp) < 1) {
		return enif_make_badarg(env);
	}

	unsigned char *pt1 = createNullTermMbString(name_temp);

	if(!pt1) {
		return enif_make_badarg(env);
	}

	size_t mbs_len1 = strlen((const char*)pt1);

	size_t character_count1 = mbstowcs(NULL, (const char*)pt1, mbs_len1);

	wchar_t w_name[character_count1 + 1];

	(void)memset(w_name, '\0', sizeof(w_name) / sizeof(w_name[0]));

	if((size_t)-1 == mbstowcs(w_name, (const char*)pt1, character_count1 + 1)) {
		free(pt1);

		return enif_make_badarg(env);
	}

	free(pt1);

	xlFontSetName(font_resource->handle, w_name);

	return enif_make_atom(env, "nil");
}
