class Classifier:
    def __init__(self):
        if os.path.getsize("bd_path.txt") > 0:
            with open("bd_path.txt", 'rb') as f:
                self._bd_path = f.readline()
            f.close()
        self._genre_features = np.load('genres_features.npy')
        self._knn = KNN(self._bd_path, self._genre_features)
        self._bayes = Bayes(self._bd_path, self._genre_features)
        self._genres = np.load('genres.npy')

    def change_db(self, path):
        self._bd_path = path
        with open("bd_path.txt", 'w') as f:
            f.write(path)
        f.close()
        # self._genres, self._genre_features = extract_funtions.extrakt_features_for_genres(self._bd_path)
        # np.save('genres.npy', self._genres)
        # np.save("genres_features.npy", self._genre_features)
        self._knn = KNN(self._bd_path, self._genre_features)
        self._bayes = Bayes(self._bd_path, self._genre_features)
        #self._knn.train_model()
        self._bayes.train_model()

    def interpret_approx_array(self, track_path, model: Model):
        genres = []
        probabilities = []
        probs = model.approx_genres(track_path)
        probssort = np.argsort(probs)
        probssort = np.flip(probssort, 0)
        for i in probssort:
            genres.append(self._genres[i])
            probabilities.append(round(probs[i] * 100, 2))
        return genres, probabilities  # od największych do najmniejszych

    def approximate(self, track_path, mode) -> (list, list):
        if mode == "knn":
            return self.interpret_approx_array(track_path, self._knn)
        if mode == "bayes":
            return self.interpret_approx_array(track_path, self._bayes)
        return list(), list()

    def get_db_name(self):
        return self._bd_path