#include "Lookuptable.h"
#include <stdio.h>

Lookuptable :: Lookuptable() {
	set_name(NO_NAME);
	num_of_ranges = 0;
}

Lookuptable :: Lookuptable(char* name) {
	set_name(name);
	num_of_ranges = 0;
}

bool Lookuptable :: add_range_to_lookuptable(int score, float lower_boundary, bool flag_lower_boundary_included, float upper_boundary, bool flag_upper_boundary_included) {
	//TODO: possibility of lower_boundary = upper_boundary is maybe needed in one case
	if(num_of_ranges < MAX_NUM_OF_RANGES && lower_boundary < upper_boundary) {
		
		Range range(score, lower_boundary, flag_lower_boundary_included, upper_boundary, flag_upper_boundary_included);
		list_of_ranges[num_of_ranges] = range;
		
		//printf("eigene range %f - %f\n\n", lower_boundary, upper_boundary);

		for(unsigned int r_ix=0; r_ix<num_of_ranges; r_ix++) {

			//printf("list_of_ranges[r_ix].get_lower_boundary() = %f\nlist_of_ranges[num_of_ranges].get_upper_boundary() = %f\n\n", list_of_ranges[r_ix].get_lower_boundary(), list_of_ranges[num_of_ranges].get_upper_boundary());
			if(list_of_ranges[r_ix].get_lower_boundary() == list_of_ranges[num_of_ranges].get_upper_boundary()) {
				//printf("drinnen1\n");
				
				list_of_ranges[r_ix].set_range_below(&list_of_ranges[num_of_ranges]);
				list_of_ranges[num_of_ranges].set_range_upon(&list_of_ranges[r_ix]);
				
			}

			//printf("list_of_ranges[r_ix].get_upper_boundary() = %f\nlist_of_ranges[num_of_ranges].get_lower_boundary() = %f\n\n", list_of_ranges[r_ix].get_upper_boundary(), list_of_ranges[num_of_ranges].get_lower_boundary());
			if(list_of_ranges[r_ix].get_upper_boundary() == list_of_ranges[num_of_ranges].get_lower_boundary()) {
				//printf("drinnen2\n");

				list_of_ranges[r_ix].set_range_upon(&list_of_ranges[num_of_ranges]);
				list_of_ranges[num_of_ranges].set_range_below(&list_of_ranges[r_ix]);
				
			}
		}

		num_of_ranges++;

		return true;
	}
	return false;
}

bool Lookuptable :: check_sort_and_activate() {
	if(num_of_ranges > 0) {
		return list_of_ranges[0].check_lut_correctness(num_of_ranges);
	}
	return false;
}

bool Lookuptable :: get_lookuptable_is_correct_and_active() {
	return lookuptable_is_correct_and_active;
}

int Lookuptable :: get_score(float input) {
	//TODO: WHEN ACTIVATED!?
	return list_of_ranges[0].check_belong_to_range(input);
}

void Lookuptable :: printf_ranges() {
	
	for(unsigned int i=0; i<num_of_ranges; i++) {
		if(list_of_ranges[i].get_range_below() != nullptr)
			printf("%i ist unten verbunden\n", i);
		else
			printf("%i ist unten NICHT verbunden\n", i);

		if(list_of_ranges[i].get_range_upon() != nullptr)
			printf("%i ist oben verbunden\n", i);
		else
			printf("%i ist oben NICHT verbunden\n", i);
	}
	printf("blub\n");
	getchar();
}