#! /usr/bin/python
# -*- coding:utf8 -*-

'''
Exercice du livre sur Python 3.

Ce code est diffusé sous la licence GPLv3 (http://www.gnu.org/licenses/gpl.html).
Copyright © 2010 Harold Erbin <harold.erbin@gmail.com>
'''

from sys import argv
from datetime import datetime

# Ce tuple contient le nombre de jours (hors année bissextile) de chaque mois.
months = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)

# Nous récupérons la date d'aujourd'hui.
today = datetime.today()
today = today.day, today.month, today.year

def bissextile(year):
    '''
    Retourne vrai si l'année passée en argument est bissextile, sinon retourne
    faux.
    '''
    
    return bool((not year % 4 and year % 100) or not year % 400)

def days_since_jc((day, month, year)):
    '''Retourne le nombre de jours écoulés depuis le 1/1/1.'''
    
    days = day
    
    # On ajoute tous les jours des mois entre le mois en cours et le premier.
    days += sum(months[m] for m in range(month-1))
    
    # On utilise la syntaxe ternaire, qui permet d'écrire de manière compacte
    # qu'il y a un jour de plus pour les années bissextiles.
    # Ensuite on boucle sur toutes les années jusqu'à l'an 1.
    days += sum((366 if bissextile(a) is True else 365) for a in range(year))
    
    return days

def compute(date):
    '''
    Cet algorithme renvoie le nombre de jours écoulés entre la date fournie en
    argument (format jour/mois/année) et la date d'aujourd'hui.
    
    L'idée est de calculer le nombre de jour écoulés depuis l'an 1 dans les deux
    cas, puis de faire la différence.
    '''
    
    # On divise la date en une liste, et l'on applique la fonction int() à
    # chaque élément pour obtenir des entiers (sans quoi on ne pourrait faire
    # aucune manipulation numérique).
    date = map(int, date.split('/'))
    
    # On calcule le nombre de jours écoulés pour la date fournie en argument.
    days = days_since_jc(date)
    
    # Dans le cas où l'année courante est bissextile, mais que le mois est plus
    # petit que celui de la date entrée, il faut ajouter un jour de correction,
    # à cause de la soustraction à la fin.
    if bissextile(date[2]) is True and date[1] > 2:
        days += 1
    
    # On calcule directement la différence entre le nombre de jours pour la date
    # d'ajourd'hui et le nombre de jours trouvés pour l'autre date.
    # Sans la correction précédente, on aurait pu faire la différence des deux
    # appels de fonction.
    return days_since_jc(today) - days

