#!/usr/bin/env python3
"""Gmail Monitor — prüft auf wichtige/ungelesene E-Mails der letzten 30 Min.
Sendet Telegram-Alert wenn neue Prio-E-Mails gefunden.
Cron: */30 * * * * python3 $HOME/aria/scripts/gmail_monitor.py
"""
import json
import sys
import time
import urllib.request
import urllib.parse
import urllib.error
import os

CREDS_FILE = "/root/.google_credentials.json"
TELEGRAM_BOT_TOKEN = "8695002611:AAGHD5BTYCQts_90ll2gNZ7l5sMd_ODjR80"
TELEGRAM_CHAT_ID = os.environ.get("TELEGRAM_CHAT_ID","")
STATE_FILE = "/tmp/gmail_monitor_last.txt"


def load_creds():
    with open(CREDS_FILE) as f:
        return json.load(f)


def refresh_token_if_needed():
    """Nutzt den Google-Refresh-Script — Token ist immer frisch dank Cron."""
    os.system("python3 $HOME/aria/scripts/google_refresh_token.py 2>/dev/null")


def gmail_request(path, access_token):
    url = f"https://gmail.googleapis.com{path}"
    req = urllib.request.Request(url, headers={"Authorization": f"Bearer {access_token}"})
    with urllib.request.urlopen(req, timeout=15) as r:
        return json.loads(r.read())


def send_telegram(text):
    url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
    data = json.dumps({"chat_id": TELEGRAM_CHAT_ID, "text": text, "parse_mode": "Markdown"}).encode()
    req = urllib.request.Request(url, data=data, headers={"Content-Type": "application/json"})
    with urllib.request.urlopen(req, timeout=10) as r:
        return json.loads(r.read())


def get_last_processed():
    try:
        with open(STATE_FILE) as f:
            return f.read().strip()
    except FileNotFoundError:
        return None


def save_last_processed(msg_id):
    with open(STATE_FILE, "w") as f:
        f.write(msg_id)


def check_gmail():
    refresh_token_if_needed()
    creds = load_creds()
    token = creds["access_token"]

    # Suche: ungelesen + wichtig + letzte 30 Min (approximiert via newerThan)
    query = "is:unread is:important newer_than:1h"
    encoded = urllib.parse.quote(query)
    result = gmail_request(
        f"/gmail/v1/users/me/messages?q={encoded}&maxResults=5",
        token
    )

    messages = result.get("messages", [])
    if not messages:
        return

    last_id = get_last_processed()
    new_msgs = []

    for msg_meta in messages:
        msg_id = msg_meta["id"]
        if msg_id == last_id:
            break  # Bereits verarbeitet

        # Details holen
        msg = gmail_request(
            f"/gmail/v1/users/me/messages/{msg_id}?format=metadata&metadataHeaders=From&metadataHeaders=Subject",
            token
        )
        headers = {h["name"]: h["value"] for h in msg.get("payload", {}).get("headers", [])}
        sender = headers.get("From", "Unbekannt")
        subject = headers.get("Subject", "(kein Betreff)")
        new_msgs.append(f"Von: {sender}\nBetreff: {subject}")

    if not new_msgs:
        return

    # Neueste ID speichern
    save_last_processed(messages[0]["id"])

    # Telegram Alert
    count = len(new_msgs)
    details = "\n\n".join(new_msgs[:3])
    text = f"📧 *{count} neue wichtige E-Mail{'s' if count > 1 else ''}*\n\n{details}"
    if count > 3:
        text += f"\n\n+{count - 3} weitere..."
    send_telegram(text)
    print(f"[gmail_monitor] {count} neue wichtige E-Mails gemeldet")


if __name__ == "__main__":
    try:
        check_gmail()
    except Exception as e:
        print(f"[gmail_monitor] Fehler: {e}", file=sys.stderr)
        sys.exit(1)
