import donnees
import donnees_completes
from math import sqrt

def salaire_moyen_condition(employes, champ, valeur):
    '''Renvoie le salaire moyen des employes ayant val comme valeur associée
    au champ donné en argument.
    Si le nombre d'employés considéré est nul, cette fonction renvoie None'''
    somme = 0
    compteur = 0
    for e in employes:
        if e[champ] == valeur:
            somme += e['salaire']
            compteur += 1
    if compteur == 0:
        return None
    return somme / compteur

def test_salaire_moyen_condition():
    e = donnees.employes
    assert salaire_moyen_condition([], 'sexe', 'F') == None
    assert salaire_moyen_condition(e, 'sexe', 'F') == 2400.0
    assert salaire_moyen_condition(e, 'etudes', 3) == 2550.0
    assert salaire_moyen_condition(e, 'etudes', 12) == None

test_salaire_moyen_condition()
print(f"Salaire moyen des F : {salaire_moyen_condition(donnees_completes.employes, 'sexe', 'F')}")
print(f"Salaire moyen des M : {salaire_moyen_condition(donnees_completes.employes, 'sexe', 'M')}")

def effectif_par_sexe(employes):
    '''Renvoie un dictionnaire ayant deux clés 'F' et 'M'
    associée respectivement au nombre d'employées femmes et au
    nombre d'employés hommes dans les données en arguments.'''
    d = { 'F' : 0, 'M' : 0 }
    for e in employes:
        d[e['sexe']] += 1
    return d

def test_effectif_par_sexe():
    e = donnees.employes
    assert effectif_par_sexe(e) == { 'F' : 3, 'M' : 3 }

test_effectif_par_sexe()
print(f"Effectif par sexe : {effectif_par_sexe(donnees_completes.employes)}")

def calcul_ecart_sexe(employes):
    '''Renvoie l'écart de salaire en pourcentage pour les femmes 
    par rapport aux hommes'''
    moy_h = salaire_moyen_condition(employes, 'sexe', 'M')
    moy_f = salaire_moyen_condition(employes, 'sexe', 'F') # il y avait des guillemets
    # autour de 'employes' : on a confondu la variable et le nom de la variable (str)
    if moy_h == None or moy_f == None: # cas d'un seul sexe à prendre en compte
        return None
    return (moy_h - moy_f)/moy_h * 100 # Formule de l'écart

def test_calcul_ecart_sexe():
    e = donnees.employes
    e_H = [h for h in e if h['sexe'] == 'M'] # liste des hommes
    assert calcul_ecart_sexe(e_H) == None
    assert 0 <= calcul_ecart_sexe(e) <= 100

test_calcul_ecart_sexe()
print(f"Ecart de salaire femmes/hommes : {calcul_ecart_sexe(donnees_completes.employes)} %")

# Attribution d'un premier salaire après embauche par les k plus proches voisins

def sexe_vers_entier(e):
    if e['sexe'] == 'F':
        return 1
    else:
        return -1

def distance(e1, e2):
    '''Renvoie la mesure de distance entre deux personnes.'''
    s = 0
    # s = s + (sexe_vers_entier(e1) - sexe_vers_entier(e2))**2  # on ne prend pas en compte le sexe
    s = s + (e1['experience'] - e2['experience'])**2
    s = s + (e1['etudes'] - e2['etudes'])**2
    return sqrt(s)

def k_plus_proches(k, employes, e):
    '''Renvoie les k employes les plus proches de e par la 
    distance définie au dessus.'''
    e_d = [(distance(e, employes[i]), i) for i in range(len(employes))]
    e_d.sort() # va trier en premier sur la distance
    voisins = []
    for i in range(k):
        voisins.append(employes[e_d[i][1]])
    return voisins

def salaire_moyen(employes):
    '''Renvoie le salaire moyen pour une liste d'employes'''
    if len(employes) == 0:
        return None
    s = sum(e['salaire'] for e in employes)
    return s/len(employes)

def salaire_par_proximite(employes, e):
    '''Prend en entrée une liste d'employés et un dictionnaire comportant
    les champs experience, etudes et sexe et renvoie le salaire le plus
    proche en moyennant les 3 plus proches voisins'''
    voisins = k_plus_proches(3, employes, e)
    return salaire_moyen(voisins)


test_F = {'experience': 3, 'etudes': 3, 'sexe': 'F'}
test_H = {'experience': 3, 'etudes': 3, 'sexe': 'M'}

print(f"Salaire estimé pour F : {salaire_par_proximite(donnees_completes.employes, test_F)}")
print(f"Salaire estimé pour H : {salaire_par_proximite(donnees_completes.employes, test_H)}")

# Question 4
# En ne prenant pas en compte le sexe (l.76), on obtient les même salaires (moyenne plutôt basse !)
# On aurait pu aussi chercher exactement les employés ayant les mêmes caractéristiques
# (même expérience et même niveau d'études) et faire la moyenne de leurs salaires,
# et utiliser les k plus proches voisins seulement si on n'en trouve pas.
