# -*- coding: utf-8 -*-
#----------------------
#calcul du nombre de jour entre 2 dates
#--------------------------------------
from math import floor
print(" Les calculs sont limités aux années de 1583 à 9999")
print()
print("     Calcul du nombre de jours entre deux dates")
print(" Répondez aux questions uniquement avec des chiffres.")
print("-----------------------------------------------------")
#-----------------------------------------------------choisir l'option
def choisir() :
    global choix
    
    print()    
    print("choisissez le chiffre de l'une des options suivantes")
    print("----------------------------------------------------")
    print("        date du système............= 1")
    print("        date manuelle..............= 2")
    print()
    choix = input("    Entrez le numéro de l'option choisie : ")
    try :
        choix = int(choix)
    except :
        print("Vous devez taper uniquement un chiffre, rien d'autre")
        print()
        choisir() # tourniquet pour chiffre non conforme
    
    if choix < 1 :
        print("     Erreur se chiffre est trop petit !")
        choisir()  # tourniquet pour chiffre trop petit
        
    if choix > 2 :
        print("     Erreur se chiffre est trop grand !")    
        choisir()  # tourniquet pour chiffre trop grand
    
    return
#----------------------------------------------------- date système
def dte_sys() :
    import datetime
    global année1
    global mois1
    global jour1
    
    année1 = datetime.date.today().strftime("%Y")
    année1 = int(année1)
    mois1 = datetime.date.today().strftime("%m")
    mois1 = int(mois1)
    jour1 = datetime.date.today().strftime("%d")
    jour1 = int(jour1)
    
    return
#----------------------------------------------------- question année 1
def questionA1() :
    global année1
    global bisxtl1
    
    print()
    année1 = input("            Année numéro 1 ? ")
    try :
        année1 = int(année1)
    except :
        #print()
        print("Vous devez taper uniquement des chiffres, rien d'autre")
        questionA1() # tourniquet pour chiffre non conforme
        print()
    if année1 <= 1583 or année1 > 9999 :
        print()
        print("minimum 1583 maximum 9999")
        questionA1() # tourniquet pour chiffre non conforme 
        
    if année1 % 4 == 0 and année1 % 100 != 0 or année1 % 400 == 0 :
        bisxtl1 = 1
    else :
        bisxtl1 = 0
    return
#----------------------------------------------------- question année 2 
def questionA2() :
    global année2
    global bisxtl2
    
    print()
    année2 = input("            Année numéro 2 ? ")
    try :
        année2 = int(année2)
    except :
        print()
        print("Vous devez taper uniquement des chiffres, rien d'autre")
        questionA2() # tourniquet pour chiffre non conforme
        print()
    if année2 <= 1583 or année2 > 9999 :
        print()
        print("minimum 1583 maximum 9999")
        questionA2() # tourniquet pour chiffre non conforme 
        
    if année2 % 4 == 0 and année2 % 100 != 0 or année2 % 400 == 0 :
        bisxtl2 = 1
    else :
        bisxtl2 = 0
    return
#----------------------------------------------------- question mois 1
def questionM1() :
    global mois1
    global njr_mois1
    
    #print()
    mois1 = input(" Entrer le chiffre du mois ? ")
    try :
        mois1 = int(mois1)
    except :
        print()
        print("Vous devez taper uniquement des chiffres, rien d'autre")
        questionM1() # tourniquet pour chiffre non conforme
        
    if mois1 == 1 or mois1 == 3 or mois1 == 5 or mois1 == 7 or mois1 == 8 or mois1 == 10 or mois1 == 12 :
        njr_mois1 = 31
        
    if mois1 == 4 or mois1 == 6 or mois1 == 9 or mois1 == 11 :
        njr_mois1 = 30
        
    if mois1 == 2 :
        njr_mois1 = 28 + bx1
        
    if mois1 < 1 or mois1 > 12 :
        print()
        print("ce mois n'existe pas !")
        questionM1() # tourniquet pour chiffre non conforme
    
    return
#----------------------------------------------------- question mois 2
def questionM2() :
    global mois2
    global njr_mois2
    
    #print()
    mois2 = input(" Entrer le chiffre du mois ? ")
    try :
        mois2 = int(mois2)
    except :
        print()
        print("Vous devez taper uniquement des chiffres, rien d'autre")
        questionM2() # tourniquet pour chiffre non conforme
        
    if mois2 == 1 or mois2 == 3 or mois2 == 5 or mois2 == 7 or mois2 == 8 or mois2 == 10 or mois2 == 12 :
        njr_mois2 = 31
        
    if mois2 == 4 or mois2 == 6 or mois2 == 9 or mois2 == 11 :
        njr_mois2 = 30
        
    if mois2 == 2 :
        njr_mois2 = 28 + bx1
        
    if mois2 < 1 or mois2 > 12 :
        print()
        print("ce mois n'existe pas !")
        questionM2() # tourniquet pour chiffre non conforme
    
    return
#----------------------------------------------------- question jour 1
def questionJ1() :
    global jour1
    global njr_mois1
    
    #print()
    jour1 = input("           La date du jour ? ")
    try :
        jour1 = int(jour1)
    except :
        print(" Vous devez taper uniquement un chiffre, rien d'autre")
        questionJ1() # tourniquet pour chiffre non conforme
    if jour1 < 0 :
        print("                  Erreur ce chiffre est négatif !")
        questionJ1()  # tourniquet pour chiffre négatif
        print()
    if jour1 == 0 :
        print("               Erreur se chiffre est trop petit !")
        questionJ1()  # tourniquet pour chiffre trop petit
        print()
    if jour1 > njr_mois1 :
        print()
        print("Il y a trop de jours pour le mois numéro ", mois1)
        question_j() # tourniquet pour chiffre non conforme
    
    return    
#----------------------------------------------------- question jour 2
def questionJ2() :
    global jour2
    global njr_mois2
    
    #print()
    jour2 = input("           La date du jour ? ")
    try :
        jour2 = int(jour2)
    except :
        print(" Vous devez taper uniquement un chiffre, rien d'autre")
        questionJ2() # tourniquet pour chiffre non conforme
    if jour2 < 0 :
        print("                  Erreur ce chiffre est négatif !")
        questionJ2()  # tourniquet pour chiffre négatif
        print()
    if jour2 == 0 :
        print("               Erreur se chiffre est trop petit !")
        questionJ2()  # tourniquet pour chiffre trop petit
        print()
    if jour2 > njr_mois2 :
        print()
        print("Il y a trop de jours pour le mois numéro ", mois2)
        question_j() # tourniquet pour chiffre non conforme
        
    return
#----------------------------------------------------- jourjulien 1
def jul_1() :
    global année1
    global mois1
    global jour1
    global b
    global c
    global d
    global e
    global jj1
    b = 0
    c = 0
    d = 0
    e = 0
    
    if mois1 < 3 :
        année1 = année1 - 1
        mois1 = mois1 + 12        
    b = int(année1 / 100)
    c = 2 - b + int(b / 4)
    d = int(365.25 * année1)
    e = int(30.6001 * (mois1 + 1))
    jj1 = c + d + e + jour1 + t
    
    return
#----------------------------------------------------- jour julien 2
def jul_2() :
    global année2
    global mois2
    global jour2
    global b
    global c
    global d
    global e
    global jj2
    b = 0
    c = 0
    d = 0
    e = 0
    
    if mois2 < 3 :
        année2 = année2 - 1
        mois2 = mois2 + 12        
    b = int(année2 / 100)
    c = 2 - b + int(b / 4)
    d = int(365.25 * année2)
    e = int(30.6001 * (mois2 + 1))
    jj2 = c + d + e + jour2 + t

    return
#----------------------------------------------------- calcul
def calc() :
    global jj1
    global jj2
    global njr
    
    if jj1 > jj2 :
        njr = jj1 - jj2
    else :
        njr = jj2 - jj1
    # njr = njr + 1 # (pour compter le jour 1)
    return
#----------------------------------------------------- calculs complémentaires
def comp() :
    global antot
    global année
    global sem
    global semaine
    global hrtot
    global jrtot
    global nbmtot
    global jr3d
    global jour
    global mois
    global jr
    global hr
    global heure
    global mn3d
    global mn
    global min
    global minute
    global sec
    global seconde
#                           19 07 2023       09 09 1946     njr = 28072
    sem = njr / 7           # calcul nombre de semaines             4010.2857142857142857142857142857
    semaine = int(sem)      # totalité en semaines                  4010 semaines
    hrtot = njr * 24        # totalité en heure                   673728 heures
    
    antot = njr / 365.25       # nombre d'année avec décimales
    antot = round(antot, 3)    # nombre d'année avec 3 décimales      76.857
    année = int(antot)         # nombre d'année sans  décimale        76
        
    nbmtot = antot * 12     # nombre de mois total avec décimales    922.28336755646817248459958932232
    nbmtot = int(nbmtot)    # nombre de mois total sans  décimale    922

    mois = année * 12       # nombre de mois de l'âge sans décimale  912
    mois = nbmtot - mois    # mois en plus des années                 10
    
    jr = antot - int(antot) # partie décimale de jour                  0.8569999999999993
    jr = round(jr,3)        # partie 3 décimales de jour               0.857
    jr = jr * 12            # jours avec décimales                    10.283999999999999
    jour = int(jr)          # jours en plus des mois sans dédimale    10
    
    jr3d = round(jr, 3)     # jours 3 décimales                       10.284
    hr = jr3d - int(jr3d)   # 10.284 - 10 partie décimale              0.2840000000000007
    hr = round(hr, 3)       # partie 3 décimales                       0.284
    hr = hr * 24            #  0.284 * 24 = 6.816   (heures)           6.815999999999999
    heure = int(hr)         # int(6.816) = 6 heures                    6
    
    mn3d = round(hr, 3)     # partie 3 décimales                       6.816
    mn = mn3d - int(mn3d)   # partie décimale                          0.816
    min = mn * 60           # 0.816 * 60 = 48.9  minutes              48.959999999999994
    minute = int(min)       # minute sans décimales                   48
    
    sec = min - int(min)     # 48.9 - 48 = 0.9 partie décimale         0.959999999999994
    seconde = sec * 60    # seconde avec décimales    57.59999999999964
    seconde = round(seconde, 3)
    
    return
#----------------------------------------------------- total en mois jour heure minute seconde
def total() :
    global nbmtot
    global njr
    global hrtot
    global tmois
    global tjour
    global theure
    global tminute
    global tseconde
    
    tmois = nbmtot
    tjour = int(njr)
    theure = int(hrtot)
    tminute = theure * 60
    tseconde = tminute * 60
    
    return
#=================================
# Début de la lecture du programme
#----------------------------------------------------- déclaration des variables globales
global choix

global jour1
global mois1
global année1
global bx1
global jour2
global mois2
global année2
global bx2
global njr_mois1
global njr_mois2
global njr

global b
global c
global d
global e
global t

global jj1
global jj2
global jr1
global jr2
global mo1
global mo2
global an1
global an2

global antot
global année
global sem
global semaine
global hrtot
global jrtot
global nbmtot
global jr3d
global jour
global mois
global jr
global hr
global heure
global mn3d
global mn
global min
global minute
global sec
global seconde

global tmois
global tjour
global theure
global tminute
global tseconde
#----------------------------------------------------- initialisation des variables
choix = 0

jour1 = 0
mois1 = 0
année1 = 0
bx1 = 0
jour2 = 0
mois2 = 0
année2 = 0
bx2 = 0
njr_mois1 = 0
njr_mois2 = 0
njr = 0

b = 0
c = 0
d = 0
e = 0
t = 1720994.5

jj1 = 0.0
jj2 = 0.0
jr1 = 0
jr2 = 0
mo1 = 0
mo2 = 0
an1 = 0
an2 = 0

antot = 0.0
année = 0.0
sem = 0.0
semaine = 0
hrtot = 0.0
jrtot = 0
nbmtot = 0
mois = 0
jr = 0.0
jr3d = 0.0
jour = 0
hr = 0.0
heure = 0
mn3d = 0.0
mn = 0.0
min = 0.0
minute = 0
sec = 0.0
seconde = 0.0

tmois = 0
tjour = 0
theure = 0
tminute = 0
tseconde = 0
#----------------------------------------------------- [main]
choisir()
if choix == 1 :  # si le choix est : date système
    dte_sys()
else :
    questionA1() # si le choix est : date manuelle
    questionM1()
    questionJ1()
    
questionA2()
questionM2()
questionJ2()

jul_1()
jul_2()
calc()
comp()
total()
#------------------- les sauvegardes
jr1 = jour1
mo1 = mois1
an1 = année1
jr2 = jour2
mo2 = mois2
an2 = année2
#----------------------------------------------------- impression
print()
print(" total en année.....= ", année)
print(" total en mois......= ", tmois)
print(" total en semaine...= ", semaine)
print(" total en en jour...= ", tjour) 
print(" total en heure.....= ", theure)
print(" total en minute....= ", tminute)
print(" total en seconde...= ", tseconde)
print()
print(" première date = ", jour1, "/", mois1, "/", année1)
print(" Jour Julien de la première data = ", jj1)
print(" deuxième date = ", jour2, "/", mois2, "/", année2)
print(" Jour Julien de la deuxième date = ", jj2)
print()
print(" Entre ces deux dates il y a exactement :")
print()
if année > 1 :
    print("", année, "ans, ", end="")
else :
    print("",année, "an, ", end="")
print(mois, "mois, ", end="")
if jour > 1 :
    print(jour, "jours, ", end="")
else :
    print(jour, "jour, ", end="")
if heure > 1 :
    print(heure, "heures, ", end="")
else :
    print(heure, "heure, ", end="")
if minute > 1 :
    print(minute, "minutes, ", end="")
else :
    print(minute, "minute, ", end="")
if seconde > 1 :
    print(seconde, "secondes, ", end="")
else :
    print(seconde, "seconde, ", end="")
#----------------------------------------------------- Sortie
print()
print(" ----------------------")
bye = (input (" Entrer pour Sortir...!"))
