#!/usr/bin/env python3
"""
Aria Overnight Task Runner
Liest OVERNIGHT_TASK.md, führt Task mit Gemma via Ollama aus, sendet Ergebnis per Telegram.
Cron: 0 3 * * * /usr/bin/python3 /root/aria/scripts/aria-overnight-task.py
"""

import json
import urllib.request
import urllib.parse
from datetime import datetime, timezone
from pathlib import Path

# ── Config ────────────────────────────────────────────────────────────────────
BRAIN_DIR = Path("/root/aria/brain")
TASK_FILE = BRAIN_DIR / "OVERNIGHT_TASK.md"
RESULTS_DIR = BRAIN_DIR / "06-Daily"
OLLAMA_URL = "http://127.0.0.1:11434/api/generate"
MODEL = "gemma3:4b"

def load_env():
    env = {}
    for path in ['/root/aria/.env']:
        try:
            for line in open(path):
                line = line.strip()
                if '=' in line and not line.startswith('#'):
                    k, v = line.split('=', 1)
                    env[k.strip()] = v.strip().strip('"\'')
        except FileNotFoundError:
            pass
    return env

ENV = load_env()
BOT_TOKEN = ENV.get('TELEGRAM_BOT_TOKEN', '')
CHAT_ID = '${TELEGRAM_CHAT_ID}'

# ── Task Extractor ────────────────────────────────────────────────────────────

def read_task() -> str | None:
    if not TASK_FILE.exists():
        return None
    content = TASK_FILE.read_text(encoding='utf-8')
    # Extract content between "## Aktueller Task" and next "##" or end
    lines = content.split('\n')
    in_task = False
    task_lines = []
    for line in lines:
        if line.strip() == '## Aktueller Task':
            in_task = True
            continue
        if in_task:
            if line.startswith('##') and line.strip() != '## Aktueller Task':
                break
            if line.strip().startswith('<!--'):
                continue
            if line.strip() == '---':
                break
            task_lines.append(line)

    task = '\n'.join(task_lines).strip()
    if not task or task == 'Kein Task heute Nacht.':
        return None
    return task

# ── Ollama ────────────────────────────────────────────────────────────────────

def ask_gemma(prompt: str) -> str:
    system = (
        "Du bist Aria, digitale Co-Founderin von Kais Aseckzai. "
        "Beantworte Aufgaben präzise, auf Deutsch, ohne Floskeln. "
        "Fokus: praktischer Nutzen, MRR-Relevanz. "
        "Wenn du Dateien speichern sollst, gib den Inhalt als Markdown aus."
    )
    full_prompt = f"{system}\n\nAufgabe: {prompt}"
    data = json.dumps({
        "model": MODEL,
        "prompt": full_prompt,
        "stream": False
    }).encode('utf-8')
    req = urllib.request.Request(OLLAMA_URL, data=data,
                                  headers={'Content-Type': 'application/json'})
    try:
        with urllib.request.urlopen(req, timeout=600) as r:
            result = json.loads(r.read())
            return result.get('response', '').strip()
    except Exception as e:
        return f"[Ollama Fehler: {e}]"

# ── Telegram ──────────────────────────────────────────────────────────────────

def send_telegram(text: str) -> bool:
    if not BOT_TOKEN:
        print("No BOT_TOKEN")
        return False
    # Telegram limit: 4096 chars
    if len(text) > 3800:
        text = text[:3800] + "\n\n[... gekürzt, vollständiges Ergebnis im Brain]"
    data = urllib.parse.urlencode({
        'chat_id': CHAT_ID,
        'text': text,
        'parse_mode': 'HTML',
    }).encode('utf-8')
    req = urllib.request.Request(
        f'https://api.telegram.org/bot{BOT_TOKEN}/sendMessage', data=data)
    try:
        with urllib.request.urlopen(req, timeout=10) as r:
            return json.loads(r.read()).get('ok', False)
    except Exception as e:
        print(f"Telegram error: {e}")
        return False

# ── Result Saver ──────────────────────────────────────────────────────────────

def save_result(task: str, result: str):
    today = datetime.now().strftime('%Y-%m-%d')
    out_dir = RESULTS_DIR
    out_dir.mkdir(parents=True, exist_ok=True)
    out_path = out_dir / f"overnight-{today}.md"
    content = f"""---
date: {today}
type: overnight-task
---

# Overnight Task — {today}

## Aufgabe
{task}

## Ergebnis

{result}

---
*Ausgeführt: {datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M UTC')} via Gemma 3 (Ollama)*
"""
    out_path.write_text(content, encoding='utf-8')
    return out_path

# ── Clear Task ────────────────────────────────────────────────────────────────

def clear_task():
    """Setzt den Task zurück nach Ausführung."""
    content = TASK_FILE.read_text(encoding='utf-8')
    content = content.replace(
        read_task_raw(),
        'Kein Task heute Nacht.'
    )
    TASK_FILE.write_text(content, encoding='utf-8')

def read_task_raw() -> str:
    """Liest den rohen Task-Text für das Clearing."""
    if not TASK_FILE.exists():
        return ''
    content = TASK_FILE.read_text(encoding='utf-8')
    lines = content.split('\n')
    in_task = False
    task_lines = []
    for line in lines:
        if line.strip() == '## Aktueller Task':
            in_task = True
            continue
        if in_task:
            if line.startswith('##') and line.strip() != '## Aktueller Task':
                break
            if line.strip() == '---':
                break
            if not line.strip().startswith('<!--'):
                task_lines.append(line)
    return '\n'.join(task_lines).strip()

# ── Main ──────────────────────────────────────────────────────────────────────

def main():
    ts = datetime.now(timezone.utc).isoformat()
    print(f"[{ts}] Aria Overnight Task starting...")

    task = read_task()
    if not task:
        print("Kein Task heute Nacht. Beende.")
        return

    print(f"Task: {task[:100]}...")
    print("Starte Gemma...")
    result = ask_gemma(task)
    print(f"Ergebnis erhalten ({len(result)} Zeichen)")

    out_path = save_result(task, result)
    print(f"Gespeichert: {out_path}")

    today = datetime.now().strftime('%d.%m.%Y')
    msg = f"""🌙 <b>Overnight Task erledigt — {today}</b>

<b>Aufgabe:</b>
{task[:300]}{"..." if len(task) > 300 else ""}

<b>Ergebnis:</b>
{result[:2000]}{"..." if len(result) > 2000 else ""}

<i>Vollständig in brain/06-Daily/overnight-{datetime.now().strftime('%Y-%m-%d')}.md</i>"""

    ok = send_telegram(msg)
    print(f"Telegram: {'OK' if ok else 'FAILED'}")


if __name__ == '__main__':
    main()
