#include<bits/stdc++.h>
using namespace std;

vector<double> readMFCC(const string &filename) {
    // This function reads MFCC feature values from file
    vector<double> features;
    ifstream infile("mfcc_files/" + filename);
    if (!infile) {
        cerr << "Error opening file: " << filename << endl;
        return features;
    }
    double val;
    while (infile >> val) {
        features.push_back(val);
    }
    infile.close();
    return features;//
}

double euclideanDistance(const vector<double>& a, const vector<double>& b) {
    double sum = 0;
    for (size_t i = 0; i < a.size(); i++) {
        sum += pow(a[i] - b[i], 2);
    }
    return sqrt(sum);
}

int main() {
    vector<string> classes = {"AKAL", "AMAR", "ANEKO", "EDURO", "KANOK"};
    vector<vector<string>> class_files = {
        {"AKAL00.mfc", "AKAL01.mfc", "AKAL02.mfc", "AKAL03.mfc", "AKAL04.mfc"},
        {"AMAR00.mfc", "AMAR01.mfc", "AMAR02.mfc", "AMAR03.mfc", "AMAR04.mfc"},
        {"ANEK00.mfc", "ANEK01.mfc", "ANEK02.mfc", "ANEK03.mfc", "ANEK04.mfc"},
        {"EDUR00.mfc", "EDUR01.mfc", "EDUR02.mfc", "EDUR03.mfc", "EDUR04.mfc"},
        {"KANOK00.mfc", "KANOK01.mfc", "KANOK02.mfc", "KANOK03.mfc", "KANOK04.mfc"}
    };

    int numClasses = classes.size();
    vector<vector<double>> distances(numClasses);
    vector<double> avgError(numClasses, 0.0);

    for (int c = 0; c < numClasses; c++) {
        // Read seed (first file)
        vector<double> seed = readMFCC(class_files[c][0]);
        double sum = 0;

        for (size_t f = 0; f < class_files[c].size(); f++) {
            vector<double> sample = readMFCC(class_files[c][f]);
            double dist = euclideanDistance(seed, sample);
            distances[c].push_back(dist);
            sum += dist;
        }

        avgError[c] = sum / class_files[c].size();
    }

    // Print Output
    cout << left << setw(10) << "Classes"
         << setw(45) << "Class Members (Distances)"
         << "Average Error" << endl;
    cout << string(80, '-') << endl;

    for (int c = 0; c < numClasses; c++) {
        cout << left << setw(10) << classes[c];
        for (size_t d = 0; d < distances[c].size(); d++) {
            cout << fixed << setprecision(2) << distances[c][d];
            if (d != distances[c].size() - 1) cout << ", ";
        }
        cout << setw(10) << " " << avgError[c] << endl;
    }

    return 0;
}
