"""
Correction de l'exercice 2.10
objet  : Détermination de l'âge d'une personne ou d'un évèvènement du passé
auteur : PM
date   : 2021                                                      """

from datetime import date

def j_mois(m,a):
    """Les arguments sont supposés être des entiers (0<m<13 et a>0)
    >>> Retourne le nombre de jours du mois                    """
    longMois=[1,3,5,7,8,10,12]
    if m in longMois : return 31       #les mois ordinaires de 31 jours
    elif m!=2 : return 30              #les mois ordinaires de 30 jours
    elif a%4!=0 or (a%100==0 and a%400!=0):#teste l'année :si bisextile
        return 28                          #février une année bisextile
    return 29                              #février une année ordinaire

def age(j,m,a):
    """Les arguments doivent être cohérents avec la date du jour
    càd date 0<j<32 et 0<m<13 et aussi entrée < date du jour
    >>> Retourne le nombre entier d'années écoulées depuis la date
    et None si il y a une incohérence                               """
    if not(0<j<32 and 0<m<13) : return None               #incohérence1
    if j>j_mois(m,a) : return None                        #incohérence2
    d=date.today()
    age=0
    jj,mm,aa=d.day,d.month,d.year                   #date d'aujourd'hui
    if a>aa or a==aa and (m>mm or m==mm and j>jj):
        return None                                       #incohérence3
    if m<mm or m==mm and j<jj:                    #anniversaire dépassé
        age=aa-a
    else: age=aa-a-1                              #anniversaire à venir
    return age

""" Batterie de test """
print(age(31,4,2019)) #mois de 30 jours
print(age(29,2,2004)) #année bisextile > date valide
print(age(29,2,2003)) #année non-bisextile
print(age(15,12,2020))#date future
print(age(30,10,2021))#date future
print(age(17,7,1959)) #anniversaire > date valide

