#! /usr/bin/python3
from datetime import datetime, timedelta
import zoneinfo
from pathlib import Path

from astropy.coordinates import EarthLocation, SkyCoord, AltAz
from astropy.time import Time
import astropy.units as u
import numpy as np

location = EarthLocation(lat=48.173333 * u.deg, lon=11.635 * u.deg, height=520 * u.m)
local_tz = zoneinfo.ZoneInfo("Europe/Berlin")

betelgeuse = SkyCoord.from_name("Betelgeuse")

def get_culmination_time(target_date: datetime.date) -> datetime:
    start_local = datetime.combine(target_date, datetime.min.time(), tzinfo=local_tz)
    t_start = Time(start_local)
    
    times = t_start + np.linspace(0, 24, 1440) * u.hour
    altaz_frame = AltAz(obstime=times, location=location)
    altitudes = betelgeuse.transform_to(altaz_frame).alt.deg
    
    max_idx = np.argmax(altitudes)
    t_approx = times[max_idx]
    
    fine_times = t_approx + np.linspace(-120, 120, 241) * u.second
    fine_altaz = AltAz(obstime=fine_times, location=location)
    fine_altitudes = betelgeuse.transform_to(fine_altaz).alt.deg
    
    best_time_astropy = fine_times[np.argmax(fine_altitudes)]
    
    return best_time_astropy.to_datetime(timezone=local_tz)

output_file = Path("betelgeuse_kulmination_2028.txt")
start_day = datetime(2028, 1, 1).date()

print("Berechne Kulminationszeiten fuer Betelgeuse (2028)...")

with output_file.open("w", encoding="utf-8") as f:
    f.write("# Kulminationszeiten fuer Betelgeuse (Muenchen, 48.173333 N, 11.635 E)\n")
    f.write("# Format: YYYY-MM-DD | Lokale Uhrzeit (MEZ/MESZ) | Hoehe (Grad)\n")
    f.write("# " + "="*60 + "\n")
    
    current_day = start_day
    while current_day.year == 2028:
        culm_dt = get_culmination_time(current_day)
        
        t_final = Time(culm_dt)
        alt = betelgeuse.transform_to(AltAz(obstime=t_final, location=location)).alt.deg
        
        line = f"{current_day.isoformat()} | {culm_dt.strftime('%H:%M:%S %Z')} | {alt:.3f}°\n"
        f.write(line)
        
        current_day += timedelta(days=1)

print(f"Fertig! Daten gespeichert in: {output_file.resolve()}")
