import re
from ics import Calendar
import requests
import locale
locale.setlocale(locale.LC_TIME, "de_DE.UTF-8")
from datetime import datetime, date
from jinja2 import Template
from dateutil import tz
local_tz = tz.gettz("Europe/Berlin")

# ---- Settings ----
ICAL_URL = "https://calendar.google.com/calendar/ical/c_c2fe841c3465afdc5bc0a89bd8418ea7d6f52ab0d89a252d0a0825a65d495f57%40group.calendar.google.com/public/basic.ics"
TEMPLATE_FILE = "template.html"
OUTPUT_FILE = "index.html"

# Fixed week blocks
WEEKS = [
    ("Woche 1", date(2025, 8, 4), date(2025, 8, 10)),
    ("Woche 2", date(2025, 8, 11), date(2025, 8, 17)),
    ("Woche 3", date(2025, 8, 18), date(2025, 8, 24)),
    ("Woche 4", date(2025, 8, 25), date(2025, 8, 31)),
    ("Woche 5", date(2025, 9, 1), date(2025, 9, 7)),
    ("Woche 6", date(2025, 9, 8), date(2025, 9, 14)),
]

# ---- Helpers ----
def extract_url(text):
    match = re.search(r'(https?://[^\s"\']+)', text)
    return match.group(1) if match else None

def format_date(dt):
    return dt.strftime("%-d.%m.") if hasattr(dt, "strftime") else ""

def format_weekday(dt):
    return dt.strftime("%A").capitalize()

def format_time(dt):
    return dt.strftime("%H:%M")

def clean_title(title):
    return title.replace("🏠", "").strip()

# ---- Fetch calendar ----
print("Fetching calendar…")
data = requests.get(ICAL_URL).text
cal = Calendar(data)

events_by_week = {w[0]: [] for w in WEEKS}


for event in cal.events:
    print(f"DEBUG: Found event '{event.name}' on {event.begin.date()}")
    if not event.name or not event.name.startswith("🏠"):
        print("  -> Skipped (no 🏠)")
        continue

    url = extract_url(event.description or "")
    if not url:
        print("  -> Skipped (no URL found)")
        continue

    # Convert to local timezone
    local_dt = event.begin.datetime.astimezone(local_tz)
    event_date = local_dt.date()

    for week_name, start, end in WEEKS:
        if start <= event_date <= end:
            print(f"  -> Accepted into {week_name} with URL {url}")
            events_by_week[week_name].append({
                "date": local_dt,
                "date_str": local_dt.strftime("%-d.%-m."),
                "title": clean_title(event.name),
                "weekday": local_dt.strftime("%A").capitalize(),
                "time": local_dt.strftime("%H:%M"),
                "url": url,
                "sort_key": local_dt
            })
            break
    else:
        print("  -> Skipped (date not in any week range)")

# ---- Sort events ----
for week in events_by_week:
    events_by_week[week].sort(key=lambda e: e["sort_key"])

# ---- Load template ----
with open(TEMPLATE_FILE, "r", encoding="utf-8") as f:
    template = Template(f.read())

# ---- Render HTML ----
html = template.render(weeks=WEEKS, events_by_week=events_by_week)

with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
    f.write(html)

print(f"Done! {OUTPUT_FILE} created.")

