#include "Cross_Confidence_Validator.h"

#include <stdio.h>

//TODO: bproband = 0 ???
void Cross_Confidence_Validator :: initialize_cross_confidence_validator(float percentage_of_inputs_must_be_bad) {
	this->percentage_of_inputs_must_be_bad = percentage_of_inputs_must_be_bad;
	this->proband = 0;
}

Cross_Confidence_Validator :: Cross_Confidence_Validator(float percentage_of_inputs_must_be_bad) {
	set_name(NO_NAME);
	initialize_cross_confidence_validator(percentage_of_inputs_must_be_bad);
}

Cross_Confidence_Validator :: Cross_Confidence_Validator(char* name, float percentage_of_inputs_must_be_bad) {
	set_name(name);
	initialize_cross_confidence_validator(percentage_of_inputs_must_be_bad);
}

//TODO: FEhlerbehandlung nötig?
bool Cross_Confidence_Validator :: set_proband(unsigned int proband) {
	this->proband = proband;

	return true; //dummy
}

//TODO: Fehlerbehandlung, wenn proband > num_of_input
//TODO: dies sollte eine von mehreren möglichkeiten sein
bool Cross_Confidence_Validator :: cross_validate(unsigned int num_of_input, int* input, bool* input_is_valid) {
	/*
	printf("DRINNEN\n");
	printf("input[proband] = %i, input_is_valid[proband] = %i\n", input[proband], *(input_is_valid+proband));
	*/

	if(input_is_valid[proband] == false) {
		//printf("HIER?\n");
		return false;
	}



	//TODO: kein hardcoded 0 ... könnte ja auch einen schlechten score bedeuten
	if(input[proband] != 0) {
		unsigned int num_of_valid = 0;
		unsigned int num_of_not_perfect = 0;
		for(unsigned int in_ix=0; in_ix<num_of_input; in_ix++) {
			
			//printf("input_is_valid[%i] = %i\n", in_ix, input_is_valid[in_ix]);
			
			if(input_is_valid[in_ix]) {
				num_of_valid++;

				if(in_ix != proband) {
					//TODO: kein hardcoded 0 ... könnte ja auch einen schlechten score bedeuten
					if(input[in_ix] != 0) {
						num_of_not_perfect++;
					}
				}
			}
		}

		//printf("num_of_valid = %u, num_of_not_perfect = %u, divided = %f, \% = %f\n", num_of_valid, num_of_not_perfect, (float)num_of_not_perfect/(float)num_of_valid, percentage_of_inputs_must_be_bad);

		//TO CHECK: passt das?
		if(num_of_valid == 0) {
			return false;
		}

		if((float)num_of_not_perfect/(float)num_of_valid >= percentage_of_inputs_must_be_bad) {
			return true;
		} else {
			return false;
		}
	} else {
		//printf("gib true zurück\n");
		return true;
	}

}