# -*- coding: utf-8 -*-
import urllib.request
import urllib.error
import json
import os
import time
from datetime import datetime, timedelta
import requests
from icalendar import Calendar
import recurring_ical_events
import pytz

# --- DINA NYCKLAR ---
GEMINI_API_NYCKEL = "AQ.Ab8RN6J6mQ0pqE8RxscBithFLZ6UmFfulUHtHFxIt-GyqsPv9w"
TODOIST_API_NYCKEL = "ab0ae231dbdac070f80b431ba1a69d08374926c0"

URL_PIER = "https://calendar.google.com/calendar/ical/pier.svelander%40gmail.com/private-99cdd859d63a1c2f20d382673633a96f/basic.ics"
URL_JOBB = "https://outlook.office365.com/owa/calendar/06cacc038ca64a5c9f0455a281a3ab3c@isolerab.se/b5534220d3a246e6b1dadb99bbd97a775768665851467351326/calendar.ics"
URL_CASPIAN = "https://calendar.google.com/calendar/ical/family00850561970364200516%40group.calendar.google.com/private-0a9e3c91e19365102f487bc4f085801a/basic.ics"

def hamta_vader():
    try:
        url = "https://api.open-meteo.com/v1/forecast?latitude=60.6036&longitude=15.6283&current=temperature_2m,wind_speed_10m,weather_code&daily=temperature_2m_max,temperature_2m_min&timezone=Europe%2FBerlin"
        req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
        data = json.loads(urllib.request.urlopen(req, timeout=10).read().decode('utf-8'))
        temp = data['current']['temperature_2m']
        vind = data['current']['wind_speed_10m']
        max_t = data['daily']['temperature_2m_max'][0]
        min_t = data['daily']['temperature_2m_min'][0]
        return f"{temp}°C just nu. Vind: {vind} m/s. Idag max {max_t}°C, min {min_t}°C."
    except: return "Kunde inte hämta väder."

def hamta_todoist():
    if not TODOIST_API_NYCKEL or "KLISTRA_IN" in TODOIST_API_NYCKEL: return [], [], None, None
    try:
        headers = {'Authorization': f'Bearer {TODOIST_API_NYCKEL.strip()}'}
        req_proj = urllib.request.Request("https://api.todoist.com/api/v1/projects", headers=headers)
        projects = json.loads(urllib.request.urlopen(req_proj, timeout=10).read().decode('utf-8'))
        if isinstance(projects, dict) and "results" in projects: projects = projects["results"]
        if not isinstance(projects, list): projects = []

        inkop_id, att_gora_id = None, None
        for p in projects:
            if not isinstance(p, dict): continue
            p_name = p.get("name", "").lower()
            if p_name in ["inköp", "inköpslista", "mat", "handla"]: inkop_id = p["id"]
            elif p_name in ["att göra", "att gora"]: att_gora_id = p["id"]

        req_tasks = urllib.request.Request("https://api.todoist.com/api/v1/tasks", headers=headers)
        tasks = json.loads(urllib.request.urlopen(req_tasks, timeout=15).read().decode('utf-8'))
        if isinstance(tasks, dict) and "results" in tasks: tasks = tasks["results"]
        if not isinstance(tasks, list): tasks = []
        
        vanliga_todos, inkopslista = [], []
        for t in tasks:
            if not isinstance(t, dict): continue
            tid_text = ""
            if "due" in t and isinstance(t["due"], dict): tid_text = t["due"].get("string", t["due"].get("date", ""))
            # HÄR LADES "id" TILL SÅ VI KAN STÄNGA UPPGIFTEN PÅ SKÄRMEN
            task_data = {"id": t.get("id"), "content": t.get("content", "Okänd"), "desc": t.get("description", ""), "time": tid_text}
            p_id = t.get("project_id")
            if inkop_id and p_id == inkop_id: inkopslista.append(task_data)
            elif att_gora_id and p_id == att_gora_id: vanliga_todos.append(task_data)
            elif not inkop_id and not att_gora_id: vanliga_todos.append(task_data)

        return vanliga_todos, inkopslista, inkop_id, att_gora_id
    except: return [], [], None, None

def hamta_handelser(url, kategori):
    if not url: return []
    try:
        req = requests.get(url, timeout=15)
        req.raise_for_status()
        cal = Calendar.from_ical(req.text)
        nu = datetime.now()
        start_date = nu.replace(hour=0, minute=0, second=0, microsecond=0)
        end_date = start_date + timedelta(days=30)
        events = recurring_ical_events.of(cal).between(start_date, end_date)
        
        handelser = []
        today_str = nu.strftime("%Y-%m-%d")
        current_time_str = nu.strftime("%H:%M")
        local_tz = pytz.timezone("Europe/Stockholm")
        
        for event in events:
            title = str(event.get('SUMMARY', 'Okänd'))
            desc = str(event.get('DESCRIPTION', ''))
            dtstart = event.get('DTSTART').dt
            dtend = event.get('DTEND').dt if event.get('DTEND') else dtstart
            
            if not isinstance(dtstart, datetime):
                current_d = dtstart
                while current_d < dtend:
                    d_str = current_d.strftime("%Y-%m-%d")
                    if d_str >= today_str:
                        handelser.append({"title": title, "date": d_str, "time": "Heldag", "desc": desc, "category": kategori})
                    current_d += timedelta(days=1)
            else:
                if dtstart.tzinfo: dtstart = dtstart.astimezone(local_tz)
                if dtend.tzinfo: dtend = dtend.astimezone(local_tz)
                d_str = dtstart.strftime("%Y-%m-%d")
                t_str = dtstart.strftime("%H:%M")
                if d_str > today_str or (d_str == today_str and t_str >= current_time_str):
                    handelser.append({"title": title, "date": d_str, "time": t_str, "desc": desc, "category": kategori})
        return handelser
    except: return []

def hamta_gmail_data():
    try:
        fil = os.path.join(os.path.dirname(os.path.abspath(__file__)), "gmail_data.json")
        if os.path.exists(fil):
            with open(fil, "r", encoding="utf-8") as f:
                return json.load(f)
    except: pass
    return []

def hamta_ai_sammanfattning(events, todos, vader_data, gmail_data):
    if not GEMINI_API_NYCKEL or "KLISTRA_IN_DIN" in GEMINI_API_NYCKEL: return "Koppla in API-nyckel.", "Väntar på API-nyckel."
    try:
        nu = datetime.now()
        timme = nu.hour
        
        veckodagar_sv = ["Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag", "Söndag"]
        idag_veckodag = veckodagar_sv[nu.weekday()]
        dagens_datum_str = nu.strftime("%Y-%m-%d")

        if timme >= 18:
            tids_instruktion = "Klockan är över 18:00. Du SKA BARA blicka framåt mot kvällen och morgondagen. Ignorera totalt allt som har hänt tidigare idag."
        elif timme >= 12:
            tids_instruktion = "Klockan är eftermiddag. Fokusera på resten av dagen och kvällen, samt blicka mot morgondagen."
        else:
            tids_instruktion = "Det är morgon. Ge en peppig överblick över dagen och det som ligger framför er."

        caspi_status = "Caspian är hos dig (jämn vecka)" if nu.isocalendar()[1] % 2 == 0 else "Caspian är hos mamma"
        
        h_framat = []
        for e in events[:25]:
            d_obj = datetime.strptime(e['date'], "%Y-%m-%d")
            w_day = veckodagar_sv[d_obj.weekday()]
            h_framat.append(f"{w_day} {e['date']} kl {e['time']} - {e['title']}")

        t_lista = [t['content'] for t in todos]
        g_lista = [f"{g['datum']} ({g['kategori']}): {g['text']}" for g in gmail_data]

        prompt = f"""EXAKT TIDSDATA (Följ detta slaviskt):
        - Dagens datum: {dagens_datum_str}
        - Dagens veckodag: {idag_veckodag}
        
        Du är en humoristisk, varm och mänsklig AI-assistent för pappa Pier. 
        Status Caspian: {caspi_status}. 
        Aktuella att-göra: {', '.join(t_lista)}. 
        Kommande kalenderhändelser (med exakt veckodag utsatt): {', '.join(h_framat)}.
        Viktiga skol- och paketpåminnelser från Gmail: {', '.join(g_lista)}.
        Väder i Falun: {vader_data}

        {tids_instruktion}
        
        VIKTIGA REGLER OM DAGAR OCH DATUM:
        1. Du MÅSTE dubbelkolla händelsernas utsatta veckodag.
        2. SAMMANFATTNING AV FLERA DAGAR: Om en händelse upprepas flera dagar i rad (exempelvis att "Göteborg" står inskrivet Måndag, Tisdag, Onsdag, Torsdag och Fredag), klumpa IHOP det! Säg "Du är i Göteborg måndag till fredag" istället för att rabbla varje dag. Samma sak gäller för "Mammavecka" och liknande.
        3. LUDVIKA-KONTEXT: Om kalendern visar att Pier ska besöka Ludvika, se till att väva in hur härligt det ska bli att träffa Marina, dottern Sabrina, hennes Anton och lilla Ottilia.

        PACKNINGS- OCH RESELEDARE-REGLER:
        Om kalendern visar att du eller ni ska iväg på en resa, MÅSTE du i den långa detaljtexten inkludera en trygg och strukturerad packningslista. Den ska alltid innehålla:
        1. Kläder, vardagskläder, underkläder och arbetskläder anpassade efter hur länge resan varar.
        2. Elektronik: Mobiltelefonladdare, klockladdare och bärbar dator.
        3. Medicinskt (Diabetes Typ 1): Insulin, pumpbatterier, infusionsset, sensorer och att medicinasken är fylld.
        4. Caspian (om han följer med): Keps (kepa) och solglasögon för hans RP.

        Instruktion: 
        1. Väv på ett naturligt sätt in viktig info från kalendern och Gmail. Skapa en sammanhängande berättelse som flyter snyggt.
        2. Ge klädråd för Caspian utifrån vädret om han är hemma.
        3. Svara EXAKT med formatet: En kort hälsning ||| Den fylliga och tydliga texten"""

        url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash-lite:generateContent?key={GEMINI_API_NYCKEL.strip()}"
        data = {"contents": [{"parts": [{"text": prompt}]}]}
        req = urllib.request.Request(url, data=json.dumps(data).encode('utf-8'), headers={'Content-Type': 'application/json'})
        svar = json.loads(urllib.request.urlopen(req, timeout=30).read().decode('utf-8'))
        hel_text = svar['candidates'][0]['content']['parts'][0]['text'].strip()
        
        return (hel_text.split("|||", 1)[0].strip(), hel_text.split("|||", 1)[1].strip()) if "|||" in hel_text else ("Klicka här!", hel_text)
    except Exception as e: 
        print("AI-fel:", e)
        return "Hoppas du får en bra kväll!", "Kunde inte nå AI:n."

print("--- Startar synk av kalender, Todoist och Gmail ---")
todos_vanliga, todos_inkop, p_inkop, p_attgora = hamta_todoist()
vader_prognos = hamta_vader()
gmail_notiser = hamta_gmail_data()

events = []
if URL_PIER: events.extend(hamta_handelser(URL_PIER, "Privat"))
if URL_CASPIAN: events.extend(hamta_handelser(URL_CASPIAN, "Caspi"))
if URL_JOBB: events.extend(hamta_handelser(URL_JOBB, "Arbete"))

unika_events = []
seen = set()
for e in events:
    identifier = f"{e['date']}_{e['time']}_{e['title']}_{e['category']}"
    if identifier not in seen:
        seen.add(identifier)
        unika_events.append(e)
unika_events.sort(key=lambda x: (x['date'], x['time']))

kort, lang = hamta_ai_sammanfattning(unika_events, todos_vanliga, vader_prognos, gmail_notiser)

fil = os.path.join(os.path.dirname(os.path.abspath(__file__)), "kalender_data.js")
with open(fil, "w", encoding="utf-8") as f:
    f.write(f"const kalenderData = {json.dumps(unika_events)};\nconst aiHalsning = {json.dumps(kort)};\nconst aiDetalj = {json.dumps(lang)};\n")
    f.write(f"const todoistData = {json.dumps(todos_vanliga)};\nconst inkopData = {json.dumps(todos_inkop)};\n")
    f.write(f"const todoistInkopId = {json.dumps(p_inkop)};\nconst todoistAttGoraId = {json.dumps(p_attgora)};\n")
print("--- Klar! ---")