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

// int xlAutoFilterGetRef(AutoFilterHandle handle, int* rowFirst, int* rowLast, int* colFirst, int* colLast);
ERL_NIF_TERM c_xlAutoFilterGetRef(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	AutofilterType *autofilter_resource = NULL;

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

	int rowFirst;
	int rowLast;
	int colFirst;
	int colLast;

	int ret = xlAutoFilterGetRef(autofilter_resource->handle, &rowFirst, &rowLast, &colFirst, &colLast);

	return enif_make_list5(env,
		enif_make_int(env, ret),
		enif_make_int(env, rowFirst),
		enif_make_int(env, rowLast),
		enif_make_int(env, colFirst),
		enif_make_int(env, colLast)
	);
}

// void xlAutoFilterSetRef(AutoFilterHandle handle, int rowFirst, int rowLast, int colFirst, int colLast);
ERL_NIF_TERM c_xlAutoFilterSetRef(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	AutofilterType *autofilter_resource = NULL;

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

	int rowFirst;

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

	int rowLast;

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

	int colFirst;

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

	int colLast;

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

	xlAutoFilterSetRef(autofilter_resource->handle, rowFirst, rowLast, colFirst, colLast);

	return enif_make_atom(env, "nil");
}

// FilterColumnHandle xlAutoFilterColumn(AutoFilterHandle handle, int colId);
ERL_NIF_TERM c_xlAutoFilterColumn(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	AutofilterType *autofilter_resource = NULL;

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

	int colId;

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

	FilterColumnHandle autofilter_handle = xlAutoFilterColumn(autofilter_resource->handle, colId);

	if(!autofilter_handle) {
		return enif_make_atom(env, "nil");
	} else {
		FilterColumnType *ret = enif_alloc_resource(TypeOfFilterColumn, sizeof(FilterColumnType));

		ret->handle = autofilter_handle;

		ERL_NIF_TERM handle = enif_make_resource(env, ret);

		enif_release_resource(ret);

		return handle;
	}
}

// int xlAutoFilterColumnSize(AutoFilterHandle handle);
ERL_NIF_TERM c_xlAutoFilterColumnSize(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	AutofilterType *autofilter_resource = NULL;

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

	int ret = xlAutoFilterColumnSize(autofilter_resource->handle);

	return enif_make_int(env, ret);
}

// FilterColumnHandle xlAutoFilterColumnByIndex(AutoFilterHandle handle, int index);
ERL_NIF_TERM c_xlAutoFilterColumnByIndex(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	AutofilterType *autofilter_resource = NULL;

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

	int index;

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

	FilterColumnHandle autofilter_handle = xlAutoFilterColumnByIndex(autofilter_resource->handle, index);

	if(!autofilter_handle) {
		return enif_make_atom(env, "nil");
	} else {
		FilterColumnType *ret = enif_alloc_resource(TypeOfFilterColumn, sizeof(FilterColumnType));

		ret->handle = autofilter_handle;

		ERL_NIF_TERM handle = enif_make_resource(env, ret);

		enif_release_resource(ret);

		return handle;
	}
}

// int xlAutoFilterGetSortRange(AutoFilterHandle handle, int* rowFirst, int* rowLast, int* colFirst, int* colLast);
ERL_NIF_TERM c_xlAutoFilterGetSortRange(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	AutofilterType *autofilter_resource = NULL;

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

	int rowFirst;
	int rowLast;
	int colFirst;
	int colLast;

	int ret = xlAutoFilterGetSortRange(autofilter_resource->handle, &rowFirst, &rowLast, &colFirst, &colLast);

	return enif_make_list5(env,
		enif_make_int(env, ret),
		enif_make_int(env, rowFirst),
		enif_make_int(env, rowLast),
		enif_make_int(env, colFirst),
		enif_make_int(env, colLast)
	);
}

// int xlAutoFilterGetSort(AutoFilterHandle handle, int* columnIndex, int* descending);
ERL_NIF_TERM c_xlAutoFilterGetSort(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	AutofilterType *autofilter_resource = NULL;

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

	int columnIndex;
	int descending;

	int ret = xlAutoFilterGetSort(autofilter_resource->handle, &columnIndex, &descending);

	return enif_make_list3(env,
		enif_make_int(env, ret),
		enif_make_int(env, columnIndex),
		enif_make_int(env, descending)
	);
}

// int xlAutoFilterSetSort(AutoFilterHandle handle, int columnIndex, int descending);
ERL_NIF_TERM c_xlAutoFilterSetSort(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	AutofilterType *autofilter_resource = NULL;

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

	int columnIndex;

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

	int descending;

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

	int ret = xlAutoFilterSetSort(autofilter_resource->handle, columnIndex, descending);

	return enif_make_int(env, ret);
}

// int xlAutoFilterAddSort(AutoFilterHandle handle, int columnIndex, int descending);
ERL_NIF_TERM c_xlAutoFilterAddSort(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
	AutofilterType *autofilter_resource = NULL;

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

	int columnIndex;

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

	int descending;

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

	int ret = xlAutoFilterAddSort(autofilter_resource->handle, columnIndex, descending);

	return enif_make_int(env, ret);
}
