# -*- coding: utf-8 -*-
import urllib.request
import urllib.error
import json
import os
import re
import time
from datetime import datetime, timedelta

# --- INSTÄLLNINGAR ---
GEMINI_API_NYCKEL = "AQ.Ab8RN6J6mQ0pqE8RxscBithFLZ6UmFfulUHtHFxIt-GyqsPv9w"
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# 0 = Denna vecka. 1 = Nästa vecka. 2 = Om två veckor.
VECKOR_FRAMAT = 1

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"

def hamta_veckans_handelser(url):
    if not url: return []
    try:
        req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
        data = urllib.request.urlopen(req, timeout=60).read().decode('utf-8')
        handelser = []
        data = data.replace('\r\n ', '').replace('\n ', '')
        
        nu = datetime.now() + timedelta(days=7 * VECKOR_FRAMAT)
        start_of_week = nu - timedelta(days=nu.weekday())
        end_of_week = start_of_week + timedelta(days=6)
        
        for event in data.split("BEGIN:VEVENT")[1:]:
            title, date_str = "Okänd", None
            for line in event.split('\n'):
                line = line.strip()
                if line.startswith("SUMMARY:"): title = line[8:].strip()
                elif line.startswith("DTSTART"):
                    d_match = re.search(r'(\d{8})', line)
                    if d_match:
                        d_str = d_match.group(1)
                        date_str = f"{d_str[:4]}-{d_str[4:6]}-{d_str[6:8]}"
            if date_str:
                try:
                    d_obj = datetime.strptime(date_str, "%Y-%m-%d")
                    if start_of_week.date() <= d_obj.date() <= end_of_week.date():
                        dag_namn = ["Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag", "Söndag"][d_obj.weekday()]
                        handelser.append(f"{dag_namn}: {title}")
                except: pass
        return handelser
    except: return []

def skapa_meny():
    nu = datetime.now() + timedelta(days=7 * VECKOR_FRAMAT)
    veckonummer = nu.isocalendar()[1]
    caspi_vecka = (veckonummer % 2 == 0)
    
    start_of_week = nu - timedelta(days=nu.weekday())
    end_of_week = start_of_week + timedelta(days=6)
    period_str = f"{start_of_week.strftime('%d/%m')} - {end_of_week.strftime('%d/%m')}"
    
    vecko_text = "NÄSTA vecka" if VECKOR_FRAMAT == 1 else "denna vecka"
    print(f"Hämtar din kalender och planerar menyn för {vecko_text} (Vecka {veckonummer})...")
    
    kalender_events = hamta_veckans_handelser(URL_PIER) + hamta_veckans_handelser(URL_JOBB)
    schema_text = ", ".join(kalender_events) if kalender_events else "Inga kalenderhändelser hittades."
    
    if caspi_vecka:
        installning = """Caspian (NPF) är hos dig. 
        Maten MÅSTE vara NPF-anpassad: Servera ingredienser i separerade skålar, inga hopblandade såser.
        DU MÅSTE agera som en pedagogisk mästerkock. Skriv utförliga, numrerade instruktioner (t.ex. "1. Sätt ugnen på 200 grader. 2. Skala potatisen...").
        Inkludera ALLTID minst ett steg i receptet där Pier och Caspian gör något TILLSAMMANS i köket (t.ex. duka, skära grönsaker, blanda).
        Söndag = ALLTID McDonald's (Sätt ar_mcdonalds: true, skriv "Hoppa in i bilen och åk till Donken!")."""
    else:
        installning = """Du är själv. Fokus på vuxenmat som ger perfekta matlådor till jobbet. 
        Agera som en professionell kock och skriv tydliga, numrerade steg-för-steg instruktioner som i en bra kokbok."""

    prompt = f'''
    Skapa en middagsmeny (Måndag-Söndag). Svara ENBART i JSON.
    Din kalender: {schema_text}
    
    Regler:
    1. Borta på jobb/resa: Vanliga jobbmöten eller arbetsdagar (t.ex. "Driftavstämning") betyder INTE att du är borta. Du är BARA borta om det uttryckligen står att du är i en annan stad (t.ex. Göteborg, Västerås) hela dagen. Sätt då ratt="Borta", beskrivning="Du är iväg!", ingredienser=[], instruktioner=["Ät på annan ort."].
    2. {installning}
    
    Format:
    [
      {{
        "dag": "Måndag",
        "ratt": "Köttbullar & Makaroner",
        "beskrivning": "En trygg klassiker där var sak har sin plats på tallriken.",
        "ar_mcdonalds": false,
        "ingredienser": ["Köttfärs", "Makaroner", "Ketchup"],
        "instruktioner": [
          "1. Koka upp vatten med lite salt i en stor kastrull.",
          "2. Pappa Pier steker köttbullarna på medelvärme tills de får fin yta.",
          "3. Caspian hjälper till att ta fram bestick och ställa glasen på bordet.",
          "4. Servera makaroner och köttbullar separat på tallriken med ketchup i en liten skål bredvid."
        ]
      }}
    ]
    '''

    url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash-lite:generateContent?key={GEMINI_API_NYCKEL.strip()}"
    data = {"contents": [{"parts": [{"text": prompt}]}]}
    
    for forsok in range(3):
        try:
            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=40).read().decode('utf-8'))
            text = svar['candidates'][0]['content']['parts'][0]['text'].strip()
            
            if text.startswith("```json"): text = text[7:]
            if text.startswith("```"): text = text[3:]
            if text.endswith("```"): text = text[:-3]
            
            meny = json.loads(text.strip())
            
            if caspi_vecka:
                for dag in meny:
                    if dag["dag"].lower() == "söndag":
                        dag["ratt"], dag["ar_mcdonalds"] = "McDonald's", True
                        dag["ingredienser"], dag["instruktioner"] = [], ["Dags för Donken! Hoppa in i bilen."]
                        
            fil = os.path.join(BASE_DIR, "veckomeny_data.js")
            with open(fil, "w", encoding="utf-8") as f:
                f.write(f"const veckomenyObj = {json.dumps({'meny': meny, 'ar_last': False, 'period': period_str}, ensure_ascii=False)};\n")
                
            print(f"✅ Menyn för vecka {veckonummer} ({period_str}) är klar!")
            return
            
        except urllib.error.HTTPError as e:
            if e.code == 429:
                print("⏳ 429: API-kvot. Väntar 30 sek...")
                time.sleep(30)
            elif e.code == 503:
                print("⏳ 503: Servern är trött. Väntar 10 sek...")
                time.sleep(10)
            else: 
                print(f"❌ Felkod: {e.code}")
                break
        except Exception as e:
            print(f"❌ Fel: {e}")
            break

skapa_meny()
