from tabulate import tabulate


class ErrorRate:
    false_positives = 0
    false_negatives = 0
    true_positives = 0
    true_negatives = 0

    def __init__(self, value_true=1, value_false=-1):
        self.value_true = value_true
        self.value_false = value_false

    def evaluate(self, expected_class: float, actual_class: float):
        if expected_class == self.value_false:
            if actual_class == self.value_false:
                self.true_negatives += 1
            else:
                self.false_positives += 1

        if expected_class == self.value_true:
            if actual_class == self.value_true:
                self.true_positives += 1
            else:
                self.false_negatives += 1

    def value_sum(self):
        return self.false_positives + self.false_negatives + self.true_positives + self.true_negatives

    def error_rate(self):
        false_values = self.false_positives + self.false_negatives
        return false_values / self.value_sum()

    def success_rate(self):
        correct_values = self.true_positives + self.true_negatives
        return correct_values / self.value_sum()

    def true_positiv_rate(self):
        return self.true_positives / self.value_sum()

    def true_negative_rate(self):
        return self.true_negatives / self.value_sum()

    def false_positiv_rate(self):
        return self.false_positives / self.value_sum()

    def false_negative_rate(self):
        return self.false_positives / self.value_sum()

    def print_table(self):
        print("Gesamt-Erfolgsrate: " + str(self.success_rate()))
        print("Gesamt-Fehlerrate: " + str(self.error_rate()) + '\n')
        data = [['True-Positive', self.true_positives, self.true_positiv_rate()],
                ['True-Negative', self.true_negatives, self.true_negative_rate()],
                ['False-Positive', self.false_positives, self.false_positiv_rate()],
                ['False-Negative', self.false_negatives, self.false_negative_rate()]]
        print(tabulate(data, headers=["Typ", "Absolut", "Relativ"]))