#! /usr/bin/python3
import datetime
from skyfield.api import load, wgs84
from skyfield.framelib import itrs

# 1. Setup skyfield
print("Lade Ephemeriden...")
eph = load('de421.bsp')
ts = load.timescale()
sun = eph['sun']
earth = eph['earth']

# 2. Beobachterposition im WGS84 definieren (München)
beobachter = earth + wgs84.latlon(48.173333, 11.635, elevation_m=525.0)

# 3. Zeitbereich definieren (Das ganze Jahr 2026, stündlich)
START_YEAR = 2026
start_date = datetime.datetime(START_YEAR, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc)
end_date = datetime.datetime(START_YEAR + 1, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc)

OUTPUT_FILE = f"NauticalAlmanac_Sun_Local_{START_YEAR}.tex"

print(f"Berechne Daten für {START_YEAR}...")

latex_content = r"""\documentclass{article}
\usepackage[a4paper,margin=1cm,landscape]{geometry} % Querformat wegen der vielen Spalten
\usepackage{booktabs}
\usepackage{longtable}

\title{Nautical Almanac: Sonne 2026 (Stündlich)}
\author{Beobachter: 48.173333$^\circ$N, 11.635$^\circ$O, 525m (WGS84)}
\date{\today}

\begin{document}
\maketitle

\begin{longtable}{@{}l c r r c r r@{}}
\caption{GHA, Dec, Azimut und Altitude (inkl. Refraktion) der Sonne}\\
\toprule
\textbf{UT} & \textbf{Datum} & \multicolumn{2}{c}{\textbf{GEOCENTRIC (SUN)}} & & \multicolumn{2}{c}{\textbf{LOCAL OBSERVER}} \\
\cmidrule(lr){3-4} \cmidrule(lr){6-7}
\textbf{h} & \textbf{d} & \multicolumn{1}{c}{\textbf{GHA}} & \multicolumn{1}{c}{\textbf{Dec}} & & \multicolumn{1}{c}{\textbf{Azimut}} & \multicolumn{1}{c}{\textbf{Altitude}} \\
& & \multicolumn{1}{c}{$^\circ \quad ' .$} & \multicolumn{1}{c}{[N/S] $^\circ \quad ' .$} & & \multicolumn{1}{c}{$^\circ$} & \multicolumn{1}{c}{$^\circ$} \\
\midrule
\endfirsthead

\toprule
\textbf{UT} & \textbf{Datum} & \multicolumn{1}{c}{\textbf{GHA}} & \multicolumn{1}{c}{\textbf{Dec}} & & \multicolumn{1}{c}{\textbf{Azimut}} & \multicolumn{1}{c}{\textbf{Altitude}} \\
\midrule
\endhead

\bottomrule
\multicolumn{7}{r}{Fortsetzung auf nächster Seite...} \\
\endfoot
\bottomrule
\endlastfoot
"""

current_time = start_date
last_date_str = ""

while current_time < end_date:
    t = ts.from_datetime(current_time)
    
    # --- A. Geozentrische Werte (GHA & Dec) ---
    astrometric_geo = earth.at(t).observe(sun).apparent()
    position_itrs = astrometric_geo.frame_latlon(itrs)
    lat, lon, _ = position_itrs
    
    # Dec formatieren
    dec_deg_raw = lat.degrees
    sign_dec = 'N' if dec_deg_raw >= 0 else 'S'
    abs_dec = abs(dec_deg_raw)
    dec_whole_deg = int(abs_dec)
    dec_min = (abs_dec - dec_whole_deg) * 60
    dec_str = f"{sign_dec}{dec_whole_deg:02d} {dec_min:04.1f}"

    # GHA formatieren (West-positiv)
    gha_deg_raw = (-lon.degrees) % 360
    gha_whole_deg = int(gha_deg_raw)
    gha_min = (gha_deg_raw - gha_whole_deg) * 60
    gha_str = f"{gha_whole_deg:3d} {gha_min:04.1f}"

    # --- B. Topozentrische Werte (Azimut & Altitude für Beobachter) ---
    apparent_local = beobachter.at(t).observe(sun).apparent()
    # altaz() berechnet die Werte inklusive atmosphärischer Refraktion (Standard: 10°C, 1013.25 mbar)
    alt, az, _ = apparent_local.altaz(temperature_C=10.0, pressure_mbar=1013.25)
    
    az_deg = az.degrees
    alt_deg = alt.degrees
    
    # Formatierung für die lokalen Spalten
    az_str = f"{az_deg:05.1f}"
    alt_str = f"{alt_deg:+05.1f}"

    # --- C. LaTeX Zeile zusammensetzen ---
    hour_str = f"{current_time.hour:02d}"
    date_str = current_time.strftime("%Y-%m-%d")
    display_date = date_str if date_str != last_date_str else ""
    
    # Spalten: UT | Datum | GHA | Dec | | Azimut | Altitude
    latex_row = f"{hour_str} & {display_date} & {gha_str} & {dec_str} & & {az_str} & {alt_str} \\\\\n"
    latex_content += latex_row
    
    # Trennlinie nach jedem vollständigen Tag
    if current_time.hour == 23:
        latex_content += r"\midrule" + "\n"

    last_date_str = date_str
    current_time += datetime.timedelta(hours=1)

latex_content += r"""\end{longtable}
\end{document}
"""

# Datei schreiben
print(f"Speichere korrigierte LaTeX-Datei: {OUTPUT_FILE}")
with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
    f.write(latex_content)

print("Fertig. Datei kann nun fehlerfrei mit pdflatex kompiliert werden.")
