from yellowbrick.cluster import KElbowVisualizer
from sklearn.cluster import KMeans
import os
import statistics
from pandas import *


def elbow_method(cluster_data, min_clusters, max_clusters):
    model = KMeans()
    visualizer = KElbowVisualizer(model, k=(min_clusters, max_clusters), timings=False)
    visualizer.fit(cluster_data)
    visualizer.show()
    return visualizer.elbow_value_


if __name__ == '__main__':
    root = os.getcwd()
    #projects = ['Cataclysm-DDA', 'Julia', 'Laravel', 'Node', 'RPCS3', 'Rust']
    projects = ['Rust']

    MIN_CLUSTERS = 2
    MAX_CLUSTERS = 15

    elbow_values = list()

    numberOfMonths = dict()
    N = 0

    for project in projects:
        print(project)
        fileName = root + '/MonthlyCommits_FinalOutput' + project + '.csv'
        inputCSV = open(fileName, 'r', encoding='utf-8', newline='')
        df = read_csv(fileName)
        columns = len(df.columns)
        numberOfMonths[project] = columns - 2

        for i in range(3,columns):
            cluster_data = df.iloc[0:,i-1:i].dropna()
            # samples = len(cluster_data)
            samples = len(cluster_data.iloc[:, 0].unique())
            # print(samples)
            # print(cluster_data)
            if samples in [1,2,3] :
                elbow_values.append(samples)
                N += 1
            elif samples > MAX_CLUSTERS:
                elbow_values.append(elbow_method(cluster_data, MIN_CLUSTERS, MAX_CLUSTERS))
                N += 1
            else:
                value = elbow_method(cluster_data, MIN_CLUSTERS, samples)
                if value: elbow_values.append(value)
                else: elbow_values.append(samples)
                N += 1


    print(elbow_values)

    print('AVERAGE : ', sum(elbow_values)/len(elbow_values))
    print('MEDIAN : ', statistics.median(elbow_values))

    for value in set(elbow_values):
        print(value, ' : ', elbow_values.count(value), ' times')

    print('\nTOTAL NUMBER OF MONTHS: ', numberOfMonths)
    print(N)