#!/usr/bin/env python3
"""dosed — DailyDose CLI entry tool"""

import sys, json, re, urllib.request, urllib.error
from datetime import datetime, timezone, timedelta

API = "http://localhost:8765/api/data"

CATS = [
    ("Schlafen", "😴"), ("Unterwegs", "🚗"), ("Islam", "🕌"),
    ("Lernen", "📚"), ("Youtube", "📺"), ("Kochen", "🍳"),
    ("Hausarbeit", "🧹"), ("Buildtech", "🔧"), ("Zocken", "🎮"),
    ("Uni", "🏫"), ("Tiktok", "🎵"), ("Familie", "♥️"), ("Work", "💼"),
]

def today_key():
    d = datetime.now(timezone(timedelta(hours=2)))
    return f"dailydose_{d.year}-{d.month:02d}-{d.day:02d}"

def show_cats():
    print("Deine Kategorien:")
    for i, (cat, icon) in enumerate(CATS, 1):
        print(f"  {i:2d}. {icon} {cat}")

def parse_time(text):
    # 2h, 1.5h, 30min, 90m
    m = re.match(r'(\d+(?:\.\d+)?)\s*(?:h|stunden?)', text, re.I)
    if m: return round(float(m.group(1)), 2)
    m = re.match(r'(\d+)\s*(?:min|m|minuten?)', text, re.I)
    if m: return round(int(m.group(1)) / 60, 2)
    return None

def post(key, entries):
    payload = json.dumps({key: json.dumps(entries)}).encode()
    req = urllib.request.Request(API, data=payload, headers={"Content-Type": "application/json"}, method="POST")
    try:
        with urllib.request.urlopen(req, timeout=10) as r:
            return r.status == 200
    except urllib.error.HTTPError as e:
        print(f"Error {e.code}")
        return False

def main():
    print("=== DailyDose Eintrag ===\n")
    show_cats()
    print("\nFormat: NUMMER ZEIT  (z.B. '4 2h' oder '3 30min')")
    print("Mehrere mit Komma oder Leerzeichen trennen: 4 2h, 3 30min, 10 1.5h")
    print("Fertig: ENTER\n")

    entries = []
    while True:
        line = input("> ").strip()
        if not line:
            break
        # split by comma or space patterns
        parts = re.split(r',\s*|\s+', line)
        i = 0
        while i < len(parts):
            if parts[i].isdigit():
                idx = int(parts[i]) - 1
                if 0 <= idx < len(CATS):
                    cat = CATS[idx][0]
                    # next part is time
                    i += 1
                    if i < len(parts):
                        t = parse_time(parts[i])
                        if t is not None:
                            # merge if duplicate
                            existing = next((e for e in entries if e["category"] == cat), None)
                            if existing:
                                existing["hours"] = round(existing["hours"] + t, 2)
                            else:
                                entries.append({"category": cat, "hours": t})
                            print(f"  → {cat}: {t}h")
                        else:
                            print(f"  ✗ Zeit nicht erkannt: {parts[i]}")
                    else:
                        print("  ✗ Zeit fehlt")
                else:
                    print(f"  ✗ Ungültige Nummer: {parts[i]}")
            else:
                # try inline like "4 2h"
                m = re.match(r'(\d+)(\d+(?:\.\d+)?h|\d+min)', parts[i], re.I)
                if m:
                    idx = int(m.group(1)) - 1
                    t = parse_time(m.group(2))
                    if t and 0 <= idx < len(CATS):
                        cat = CATS[idx][0]
                        existing = next((e for e in entries if e["category"] == cat), None)
                        if existing:
                            existing["hours"] = round(existing["hours"] + t, 2)
                        else:
                            entries.append({"category": cat, "hours": t})
                        print(f"  → {cat}: {t}h")
                elif re.match(r'\d+(?:\.\d+)?h|\d+min', parts[i], re.I):
                    print(f"  ✗ Nummer fehlt vor '{parts[i]}'")
                else:
                    print(f"  ✗ Unbekannt: {parts[i]}")
            i += 1

    if not entries:
        print("Keine Einträge. Abbruch."); sys.exit(0)

    key = today_key()
    if post(key, entries):
        total = sum(e["hours"] for e in entries)
        print(f"\n✓ Gespeichert ({key}): {len(entries)} Einträge, {total}h total")
        for e in entries:
            print(f"  {e['category']}: {e['hours']}h")
    else:
        print("\n✗ Speichern fehlgeschlagen")
        sys.exit(1)

if __name__ == "__main__":
    main()
