# deze functies zijn overgenomen van practicum_3_statistiek_student.py, geimplementeerd door Taha

def mean(lst):
    """ Retourneer het gemiddelde (float) van de lijst lst. """
    return float(sum(lst) / len(lst))  # totaal waarde van lijst - aantal waardes in lijst in float returnen


def rnge(lst):
    """ Retourneer het bereik (int) van de lijst lst. """
    lst.sort()  # sorteer lijst
    return int(lst[-1] - lst[0])  # hoogste waarde - laagste waarde in int returnen


def median(lst):
    """ Retourneer de mediaan (float) van de lijst lst. """
    lst.sort()  # sorteer lijst
    p = len(lst)  # lengte lijst opvragen

    if p % 2:  # als lengte van lijst oneven is
        return float(lst[p // 2])  # return middelste waarde in gesorteerde lijst als float
    else:  # lijst heeft 2 waardes in het midden
        return float(sum(lst[p // 2 - 1:p // 2 + 1]) / 2)  # return het gemiddelde van de middelste 2 waardes als float


def var(lst):
    """ Retourneer de variantie (float) van de lijst lst. """
    t = []  # tijdelijke lijst aanmaken
    m = mean(lst)  # mean van de lijst opslaan
    for i in lst:  # voor elke entry in lijst
        t.append((i - m) ** 2)  # kwadraat van i - mean opslaan in tijdelijke lijst
    return float(sum(t) / len(lst))  # float van totaal waarde lijst - lengte lijst returnen


def std(lst):
    """ Retourneer de standaardafwijking (float) van de lijst lst. """
    return float(var(lst) ** 0.5)  # wortel trekken van variatie


def freq(lst):
    """
    Retourneer een dictionary met als keys de waardes die voorkomen in lst en
    als value het aantal voorkomens van die waarde.
    """
    t = {}  # lege dict aanmaken

    for i in lst:  # voor elk cijfer in lijst
        if i in t:  # als cijfer in dict bestaat
            t[i] = t[i] + 1  # +1 doen op de huidige aantal in dict
        else:  # cijfer bestaat niet in dict
            t[i] = 1  # voeg cijfer toe met waarde 1

    return t  # return de dict


def modes(lst):
    """ Retourneer een gesorteerde lijst (list) van de modi van lijst lst. """

    m = []  # lijst aanmaken om de values op te slaan
    r = []  # lijst maken om de keys op te slaan(de waardes die we gaan retourneren)
    f = freq(lst)  # een frequentie dict maken

    for x in f:  # voor elke key in de dict
        m.append(f[x])  # de waarde opslaan in de lijst m

    maximum_v = max(m)  # pak de hoogste waarde in de lijst met waardes

    for x in f:  # voor elke key in de dict
        if f[x] == maximum_v:  # als de waarde van de dict overeenkomt met de maximum berekende waarde
            r.append(x)  # de key opslaan in de resultaten lijst

    return sorted(r)  # geef de r lijst terug gesorteerd

########################################
#           stats genereren            #
########################################


def popgenre(data_tpl):
    genres = []

    for x in data_tpl:  # voor elke "game"
        lst_genres = x[9].split(';')  # genres opsplitten door de semicolons
        for y in lst_genres:  # voor elke genre in game
            genres.append(y)  # toevoegen genre in lijst genres

    return modes(genres)[0]  # eerst populairste genre terug geven op basis van gegevens van modes(), wat is de kans
    # dat er meerdere genres tegelijk populair zijn, toch?


def median_prijs(data_tpl):
    prijzen = []

    for x in data_tpl:
        prijzen.append(x[17])

    return float(median(prijzen))