#-----------------------------------------------------V10
# Approximation rapide de l'heure sidérale moyenne
# sans tenir compte de l'équation du temps.
'''
------------------------------------------------------ dates et heures manuelles
 Les dates et heures manuelles ne sont pas implémentées
------------------------------------------------------ ajustement des dates
 la date de l'équinoxe de 2008 jusqu'en 2039 ne change pas c'est le 20/03 (mars)
 le test des années bissextiles est déjà inclue dans le calcul des jours Julien.
 le calcul se fera pour ajouter au jour de l'an
'''
#----------------------------------------------------- importation de la librairie
import datetime
#----------------------------------------------------- date système (date actuelle)
def dte_sys_now() :
    global année_sys
    global sav_année
    global mois_sys
    global sav_mois
    global date_sys
    
    année_sys = datetime.date.today().strftime("%Y")
    année_sys = int(année_sys)
    mois_sys = datetime.date.today().strftime("%m")
    mois_sys = int(mois_sys)
    date_sys = datetime.date.today().strftime("%d")
    date_sys = int(date_sys)
    
    sav_année = année_sys     # sauvegarde de l'année actuel
    sav_mois = mois_sys       # sauvegarde du mois actuel
    
    return
#----------------------------------------------------- date de l'équinoxe
def dte_sys_nox() :
    global année_sys
    global année_nox
    global mois_nox
    global date_nox
    
    # année_nox = datetime.date.today().strftime("%Y")
    # année_nox = int(année_nox)
    année_nox = année_sys     # si mois_sys < 4 et date_sys < 20 voir vérification de l'année
    mois_nox = 3              # mois de l'équinox (mois numéro 3)
    date_nox = 20             # date de l'équinox (jour 19, 20 ou 21)
    
    return
#----------------------------------------------------- vérification de l'année
# Pour les mois 1, 2 et 3 jusqu'au jour d'avant l'équinoxe font partis de l'année suivante.
def vérif_année() :
    #global sav_année
    global année_nox
    global année_sys
    global mois_sys
    #global sav_mois
    global date_sys
    global mois_nox
    global date_nox
    
    if mois_sys < 4 :         # (petit bloc de programmation moche mais fonctionnelle !)
        année_nox = année_nox - 1
    if mois_sys == 3 and date_sys > 19 :
        année_nox = année_sys
    
    return
#----------------------------------------------------- heure système en heures, minutes, secondes
def hr_sys() :
    global heure              # heure système
    global minute             # minute système
    global seconde            # seconde système
    global sysheure           # sauvegarde de l'heure système
    global greheure           # heure de Greenwich décalage de 2 heures
    global astheure           # heure astronomique décalage de 12 heures
    
    heure = (int(datetime.datetime.now().strftime("%H")))
    minute = (int(datetime.datetime.now().strftime("%M")))
    seconde = (float(datetime.datetime.now().strftime("%S")))
    '''
    Convertion de l'heure d'été en heure de Greenwich (-2 pour l'heure d'été, -1 pour l'heure d'hivers)
    Le passage à l'heure d'hiver s'effectue le dernier dimanche d'octobre et le passage à l'heure d'été,
    le dernier dimanche de mars. (Variable à changer manuellement, heure -2 l'été, -1 l'hivers)
    '''
    sysheure = heure          # heure système
    greheure = heure - 1      # Heure de Greenwich (hivers)
    # greheure = heure - 2      # Heure de Greenwich (été)
    
    if greheure < 0 :
        greheure = greheure + 24
    
    # l'heure astronomique est calculée à partir de l'heure de Greenwich
    astheure = greheure - 12 # heure astronomique, 0 heure à midi et 12 heures à 24 heures.
    
    if astheure < 0 :
        astheure = astheure + 24
    
    return
#----------------------------------------------------- heure, minutes, secondes, en heure décimale
def convdéci() :
    global heure
    global hr                 # variable intermédiaire pour le calcul
    global minute
    global minut              # variable intermédiaire pour le calcul
    global seconde
    global sec                # variable intermédiaire pour le calcul
    global sysheure           # heure système
    global greheure           # Heure de Greenwich
    global astheure           # heure astronomique
    global hrdécisys          # heure décimale du système
    global hrdécigre          # heure décimale de Greenwich
    global hrdéciast          # heure décimale astronomique
    
    # passage d'heure système en heure décimale
    # hr = 0
    minut = seconde / 60
    hr = (minut + minute) / 60
    hr = (hr + sysheure)
    hrdécisys = hr
    # passage d'heure Greenwich en heure décimale
    # hr = 0
    minut = seconde / 60
    hr = (minut + minute) / 60
    hr = (hr + greheure)
    hrdécigre = hr
    # passage d'heure astronomique en heure décimale
    # hr = 0
    minut = seconde / 60
    hr = (minut + minute) / 60
    hr = (hr + astheure)
    hrdéciast = hr
    
    return
#----------------------------------------------------- jour julien de l'équinoxe
def jul_nox() :
    global année_nox
    global mois_nox
    global date_nox
    global b
    global c
    global d
    global e
    global jj_nox
    b = 0
    c = 0
    d = 0
    e = 0
    
    if mois_nox < 3 :
        année_nox = année_nox - 1
        mois_nox = mois_nox + 12        
    b = int(année_nox / 100)
    c = 2 - b + int(b / 4)
    d = int(365.25 * année_nox)
    e = int(30.6001 * (mois_nox + 1))
    jj_nox = c + d + e + date_nox + t
    
    return
#----------------------------------------------------- jour julien du système maintenent.
def jul_now() :
    global année_sys
    global mois_sys
    global date_sys
    global b
    global c
    global d
    global e
    global jj_sys
    b = 0
    c = 0
    d = 0
    e = 0
    
    if mois_sys < 3 :
        année_sys = année_sys - 1
        mois_sys = mois_sys + 12        
    b = int(année_sys / 100)
    c = 2 - b + int(b / 4)
    d = int(365.25 * année_sys)
    e = int(30.6001 * (mois_sys + 1))
    jj_sys = c + d + e + date_sys + t
    
#----------------------------------------------------- complément non obligatoire.
    global jd
    global hrdécisys
    global jj_full
    
    jd = hrdécisys / 24       # pour avoir le jour julien complet (heure système)
    jj_full = jj_sys + jd
    
    return
#----------------------------------------------------- nombre de jours entre deux dates
def calc_njr() :
    global jj_nox
    global jj_sys
    global nbrejr
    
    nbrejr = jj_sys - jj_nox   # nombre de jours de l'équinoxe à la date actuelle
    
    return
#----------------------------------------------------- heure décimale et heure sidérale décimale
def calcDécSid() :
    global microj
    global smicroj
    global nbrejr
    global hrdécisys
    global hrdéciast
    global hrdécigre
    global hrdécisid
    #----------------
    global hrsid
    global mnsid
    global scsid
    global minut
    #----------------
    global mn
    global sec
    
    # microj = 24 / 365.2422 = 0.06570982213993892 * 365.2422 = 24.0 (un jour)
    microj = 24 / 365.2422    # décalage sidéral d'un seul jour sidéral
    smicroj = microj          # sauvegagde du décalage d'un seul jour sidéral
    microj = microj * nbrejr  # décalage de tous les jours sidérals moins le dernier
    # l'heure décimale actuelle moins le décalage donne l'heure sidérale journalier
    hrdécisid = hrdéciast + microj
    if hrdécisid > 24 :
        hrdécisid = hrdécisid - 24
    #----------------------------------------------------- convertir en (heures: minutes: secondes)
    hrsid = int(hrdécisid)
    minut = hrdécisid - hrsid
    mn = minut * 60
    mnsid = int(mn)
    sec = mn - mnsid
    scsid = sec * 60 
    scsid = int(scsid)
    '''
    #----------------------------------------------------- (teste inutiles)
    if scsid < 0 :
        scsid = scsid + 60
    if scsid > 60 :
        scsid = scsid - 60
        mnsid = mnsid + 1
        
    if mnsid < 0 :
        mnsid = mnsid + 60
    if mnsid > 60 :
        mnsid = mnsid - 60
        hrsid = hrsid + 1
    
    if hrsid < 0 :
        hrsid = hrsid + 24
    if hrsid > 24 :
        hrsid = hrsid - 24
    '''
    return
#========================================================================================
# Début de la lecture du programme
#----------------------------------------------------- déclaration des variables globales
#---------------- dates
global année_sys
global sav_année
global année_nox
global mois_sys
global sav_mois
global mois_nox
global date_sys
global date_nox
#---------------- heures
global heure
global hr
global minute
global minut
global seconde
global sec
global sysheure
global greheure
global astheure
global hrdécisys
global hrdécigre
global hrdéciast
#---------------- jours Julien
global b                      # variable de calcul
global c                      # variable de calcul
global d                      # variable de calcul
global e                      # variable de calcul
global t                      # variable de calcul
global jj_sys                 # jour de la date système
global jj_nox                 # jour de l'équinoxe Julien
#---------------- compléments
global jd
global hrdécisys
global jj_full
#---------------- nombre de jours
global nbrejr
#--------------- heure décimale et heure sidérale décimale
global microj
global smicroj
global hrdécisid
global hrdéciast
#----------------
global hrsid
global mnsid
global scsid
global minut
#----------------
global mn
global sec
#----------------------------------------------------- initialisation des variables
#---------------- dates
date_nox = 0
année_sys = 0
sav_année = 0
année_nox = 0
mois_sys = 0
sav_mois = 0
mois_nox = 0
date_sys = 0
date_nox = 0
#---------------- heures
heure = 0
hr = 0
minute = 0
minut = 0
seconde = 0
sec = 0
sysheure = 0
greheure = 0
astheure = 0
hrdécisys = 0
hrdécigre = 0
hrdéciast = 0
#---------------- jours Julien
b = 0
c = 0
d = 0
e = 0
t  = 1720994.5                # valeur fixe pour le calcul des jj
jj_sys = 0                    # jour Julien de la date système
jj_nox = 0                    # jour Julien de l'équinoxe
#---------------- compléments
jd = 0
hrdécisys = 0
jj_full = 0
#---------------- nombre de jours
nbrejr = 0
#----------------
microj = 0
smicroj = 0
hrdécisid = 0
hrdéciast = 0
#----------------
hrsid = 0
mnsid = 0
scsid = 0
minut = 0
#----------------
mn = 0
sec = 0
#----------------------------------------------------- [main]
dte_sys_now()
dte_sys_nox()
vérif_année()
#----------------
hr_sys()
convdéci()
#----------------
jul_nox()
jul_now()
#----------------
calc_njr()
calcDécSid()
#----------------------------------------------------- affiche
print("      Approximation rapide de l'heure sidérale moyenne")
print("          Sans tenir compte de l'équation du temps.")
print(" -------------------------------------------------------------")
print("     Heure système.........= ", sysheure, "hr:", minute, "minut:", seconde, "sec")
print("     Heure Greenwich.......= ", greheure, "hr:", minute, "minut:", seconde, "sec")
print("     Heure astronomique....= ", astheure, "hr:", minute, "minut:", seconde, "sec")
print()
print("     Les dates....:",date_sys,"/", sav_mois,"/", sav_année,"    moins..:", date_nox,"/", mois_nox,"/", année_nox)
print("     jour julien 1:", jj_sys, "  jour julien 2:", jj_nox)
print()
print("     jour julien complet : ", jj_full)
print()
print("     Décalage pour une journée...........=",smicroj) 
print("     Nombre de jours depuis l'équinoxe...=", nbrejr)
print("     Décalage total pour aujourd'hui.....=", microj)
print()
print("     heure décimale du système...:", hrdécisys)
print("     heure décimale Greenwich....:", hrdécigre)
print("     heure décimale astronomique.:", hrdéciast)
print("     heure décimale sidérale.....:", hrdécisid)
print()
print(" Heure sidérale..................:", hrsid, "hr:", mnsid, "minut:", scsid, "sec")

#----------------------------------------------------- Sortie
print()
print(" -------------------------------------------------------------")
bye = (input ("                                        Entrer pour Sortir...!"))
