#!/usr/bin/env python3
"""
Monitor lukas@curiousendeavor.com and log new sales threads to CE Sales CRM.
Runs on every heartbeat.
"""
import json, os, re
from datetime import datetime, timezone
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build

WORKSPACE = "/root/.openclaw/workspace"
TOKEN_LUKAS = f"{WORKSPACE}/google-auth/token-lukas.json"
TOKEN_KITT  = f"{WORKSPACE}/google-auth/token.json"
SHEET_ID    = "1P39N6Tt_OeMWP0q2MMxooJOhm3E8g5pzT085XyK7X4w"
STATE_FILE  = f"{WORKSPACE}/memory/lukas-email-state.json"

IGNORE_SENDERS = [
    "noreply@discord.com", "no-reply@accounts.google.com",
    "workspace-noreply@google.com", "drive-shares-dm-noreply@google.com",
]

def load_state():
    if os.path.exists(STATE_FILE):
        with open(STATE_FILE) as f:
            return json.load(f)
    return {"seen_thread_ids": [], "last_run": None}

def save_state(state):
    with open(STATE_FILE, "w") as f:
        json.dump(state, f, indent=2)

def get_header(msg, name):
    for h in msg.get("payload", {}).get("headers", []):
        if h["name"].lower() == name.lower():
            return h["value"]
    return ""

def extract_email(addr):
    m = re.search(r'<(.+?)>', addr)
    return m.group(1) if m else addr.strip()

def extract_name(addr):
    m = re.match(r'^"?([^"<]+)"?\s*<', addr)
    return m.group(1).strip() if m else addr.split("@")[0]

def is_ignored(sender):
    return any(ign in sender.lower() for ign in IGNORE_SENDERS)

def log_to_crm(sheets, rows_to_add):
    if not rows_to_add:
        return
    body = {"values": rows_to_add}
    sheets.spreadsheets().values().append(
        spreadsheetId=SHEET_ID,
        range="A:M",
        valueInputOption="RAW",
        insertDataOption="INSERT_ROWS",
        body=body
    ).execute()

def main():
    state = load_state()
    seen = set(state.get("seen_thread_ids", []))

    lukas_creds = Credentials.from_authorized_user_file(TOKEN_LUKAS)
    gmail = build("gmail", "v1", credentials=lukas_creds)

    kitt_creds = Credentials.from_authorized_user_file(TOKEN_KITT)
    sheets = build("sheets", "v4", credentials=kitt_creds)

    threads = gmail.users().threads().list(userId="me", maxResults=30).execute()
    today = datetime.now(timezone.utc).strftime("%Y-%m-%d")
    new_rows = []
    new_seen = []

    for t in threads.get("threads", []):
        tid = t["id"]
        if tid in seen:
            continue

        thread = gmail.users().threads().get(
            userId="me", id=tid, format="metadata",
            metadataHeaders=["From","To","Subject","Date"]
        ).execute()

        msgs = thread.get("messages", [])
        if not msgs:
            continue

        first = msgs[0]
        last  = msgs[-1]

        sender  = get_header(first, "From")
        subject = get_header(first, "Subject")
        snippet = last.get("snippet", "")[:200]

        if is_ignored(sender):
            new_seen.append(tid)
            continue

        # Determine if external (not @curiousendeavor.com)
        sender_email = extract_email(sender)
        if "curiousendeavor.com" in sender_email and len(msgs) == 1:
            new_seen.append(tid)
            continue

        # Find the external party
        to_field = get_header(first, "To")
        if "curiousendeavor.com" in sender_email:
            contact_email = extract_email(to_field)
            contact_name  = extract_name(to_field)
        else:
            contact_email = sender_email
            contact_name  = extract_name(sender)

        company = contact_email.split("@")[-1].split(".")[0].capitalize() if "@" in contact_email else ""

        row = [
            company,           # Company
            contact_name,      # Contact
            "",                # Title
            contact_email,     # Email
            "",                # LinkedIn
            "Lukas inbox",     # Source
            "New Thread",      # Stage
            f"Email: {subject}", # Last Action
            today,             # Last Action Date
            "Review & respond",# Next Step
            "",                # Next Step Date
            "",                # Signal
            snippet            # Notes
        ]
        new_rows.append(row)
        new_seen.append(tid)
        print(f"NEW: {contact_name} <{contact_email}> — {subject}")

    if new_rows:
        log_to_crm(sheets, new_rows)
        print(f"Logged {len(new_rows)} new thread(s) to CRM")
    else:
        print("NO_NEW_THREADS")

    state["seen_thread_ids"] = list(seen | set(new_seen))
    state["last_run"] = today
    save_state(state)

if __name__ == "__main__":
    main()
