#!/usr/bin/env python3

import urllib.request
import urllib.parse
import json
import sys
from datetime import datetime, timedelta, timezone

HERMES_HOME = "/DATA/AppData/hermes"

# ── Credentials ──
CLIENT_ID = "760929667815-ou3v3c3vj65ae55ugl4l93ptpc6gddkr.apps.googleusercontent.com"
CLIENT_SECRET = "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"
REFRESH_TOKEN = "1//03GXv8w0waLbVCgYIARAAGAMSNwF-L9IrLJGnAHwvBtmIo4b8QBojsdgTIAeDiiNW3g8iM-c9YQrhZLGP0Kf0JGf-n2qIkO9M-Ew"
TOKEN_URI = "https://oauth2.googleapis.com/token"
API_BASE = "https://www.googleapis.com/calendar/v3"


class KiwiCalendar:
    def __init__(self):
        self.access_token = None
        self._refresh_access_token()
        self.calendars = self._list_calendars()

    def _refresh_access_token(self):
        data = urllib.parse.urlencode({
            "refresh_token": REFRESH_TOKEN,
            "client_id": CLIENT_ID,
            "client_secret": CLIENT_SECRET,
            "grant_type": "refresh_token",
        }).encode()
        req = urllib.request.Request(TOKEN_URI, data=data, headers={"Content-Type": "application/x-www-form-urlencoded"})
        with urllib.request.urlopen(req) as resp:
            result = json.loads(resp.read())
            self.access_token = result["access_token"]

    def _api(self, path, method="GET", body=None, params=None):
        url = f"{API_BASE}{path}"
        if params:
            url += "?" + urllib.parse.urlencode(params)
        headers = {"Authorization": f"Bearer {self.access_token}", "Content-Type": "application/json"}
        data = json.dumps(body).encode() if body else None
        req = urllib.request.Request(url, data=data, headers=headers, method=method)
        try:
            with urllib.request.urlopen(req) as resp:
                return json.loads(resp.read())
        except urllib.error.HTTPError as e:
            body = e.read().decode()
            if e.code == 401:
                self._refresh_access_token()
                headers["Authorization"] = f"Bearer {self.access_token}"
                req = urllib.request.Request(url, data=data, headers=headers, method=method)
                with urllib.request.urlopen(req) as resp:
                    return json.loads(resp.read())
            raise RuntimeError(f"HTTP {e.code}: {body}")

    def _list_calendars(self):
        result = self._api("/users/me/calendarList")
        return {cal["summary"]: cal["id"] for cal in result.get("items", [])}

    def list_calendars(self):
        print("\n=== Deine Kalender ===\n")
        for name in self.calendars:
            print(f"  • {name}")
        print()

    def list_events(self, calendar_name, days=7):
        cal_id = self.calendars.get(calendar_name)
        if not cal_id:
            print(f"❌ Kalender '{calendar_name}' nicht gefunden.")
            print("  Verfügbar:", ", ".join(self.calendars.keys()))
            return

        now = datetime.now(timezone.utc)
        time_min = now.isoformat()
        time_max = (now + timedelta(days=days)).isoformat()

        result = self._api(f"/calendars/{urllib.parse.quote(cal_id, safe='')}/events",
                           params={"timeMin": time_min, "timeMax": time_max, "orderBy": "startTime", "singleEvents": "true"})

        events = result.get("items", [])
        print(f"\n=== Events in '{calendar_name}' (nächste {days} Tage) ===\n")
        if not events:
            print("  Keine Events.\n")
            return

        for ev in events:
            start = ev["start"].get("dateTime", ev["start"].get("date", ""))
            if "T" in start:
                dt = datetime.fromisoformat(start.replace("Z", "+00:00"))
                start_str = dt.strftime("%a %d.%m.%Y %H:%M")
            else:
                start_str = start
            print(f"  {start_str} | {ev.get('summary', 'Kein Titel')}")
        print()

    def create_event(self, calendar_name, summary, start_iso, end_iso, description=""):
        cal_id = self.calendars.get(calendar_name)
        if not cal_id:
            print(f"❌ Kalender '{calendar_name}' nicht gefunden.")
            return

        body = {
            "summary": summary,
            "description": description,
            "start": {"dateTime": start_iso, "timeZone": "Europe/Vienna"},
            "end": {"dateTime": end_iso, "timeZone": "Europe/Vienna"},
        }
        result = self._api(f"/calendars/{urllib.parse.quote(cal_id, safe='')}/events", method="POST", body=body)
        print(f"✅ Event erstellt: {result.get('summary')} [{result.get('id')}]")

    def delete_event(self, calendar_name, event_id):
        cal_id = self.calendars.get(calendar_name)
        if not cal_id:
            print(f"❌ Kalender '{calendar_name}' nicht gefunden.")
            return

        self._api(f"/calendars/{urllib.parse.quote(cal_id, safe='')}/events/{urllib.parse.quote(event_id, safe='')}",
                  method="DELETE")
        print(f"✅ Event gelöscht.")


# ── CLI ──
if __name__ == "__main__":
    cal = KiwiCalendar()
    args = sys.argv[1:]
    if not args or args[0] in ("-h", "--help", "help"):
        cal.list_calendars()
        print("Nutzen:")
        print("  kiwitime list 'Kalendername' [Tage]")
        print("  kiwitime create 'Kalendername' 'Titel' '2026-05-10T10:00:00+02:00' '2026-05-10T11:00:00+02:00' ['Beschreibung']")
        print("  kiwitime delete 'Kalendername' EVENT_ID")
        print("\nBeispiele:")
        print("  kiwitime list 'Ahmed und Talla' 14")
        print("  kiwitime list Arbeit")
        print("  kiwitime create Uni 'Klausur' '2026-05-15T09:00:00+02:00' '2026-05-15T11:00:00+02:00' 'WU Wien, Prüfung'")
        sys.exit(0)

    cmd = args[0]
    if cmd == "list":
        name = args[1] if len(args) > 1 else "ahmed.aytac@gmail.com"
        days = int(args[2]) if len(args) > 2 else 7
        cal.list_events(name, days)
    elif cmd == "create":
        cal.create_event(args[1], args[2], args[3], args[4], args[5] if len(args) > 5 else "")
    elif cmd == "delete":
        cal.delete_event(args[1], args[2])
    else:
        cal.list_calendars()
