#!/usr/bin/env python3
"""
Process Notion meetings from VPS.
Orchestrates Mac node for content reading, updates via API.

Usage: python3 process_meetings.py [--dry-run]
"""

import json
import sys
import os
import requests
from datetime import datetime

# Configuration
NOTION_KEY_PATH = "/home/clawd/secrets/notion/api_key"
MEETINGS_DB = "2f0330c2-8646-814f-8be4-c23065765eaa"
TASKS_DB = "2f0330c2-8646-815a-878b-dbdd46606837"
NOTION_API = "https://api.notion.com/v1"
NOTION_VERSION = "2022-06-28"


def get_notion_key():
    with open(NOTION_KEY_PATH) as f:
        return f.read().strip()


def notion_headers():
    return {
        "Authorization": f"Bearer {get_notion_key()}",
        "Notion-Version": NOTION_VERSION,
        "Content-Type": "application/json"
    }


def get_unprocessed_meetings():
    """Query meetings that haven't been processed yet."""
    url = f"{NOTION_API}/databases/{MEETINGS_DB}/query"
    
    # Filter for meetings without AI Processing = Processed
    payload = {
        "filter": {
            "or": [
                {"property": "AI Processing", "select": {"is_empty": True}},
                {"property": "AI Processing", "select": {"does_not_equal": "Processed"}}
            ]
        },
        "sorts": [{"property": "Date", "direction": "descending"}]
    }
    
    response = requests.post(url, headers=notion_headers(), json=payload)
    response.raise_for_status()
    
    meetings = []
    for page in response.json().get("results", []):
        props = page.get("properties", {})
        
        # Get title
        title_arr = props.get("Title", {}).get("title", [])
        title = title_arr[0].get("plain_text", "") if title_arr else ""
        
        # Get date
        date_obj = props.get("Date", {}).get("date", {})
        date = date_obj.get("start", "") if date_obj else ""
        
        meetings.append({
            "id": page["id"],
            "title": title,
            "date": date,
            "url": page.get("url", "")
        })
    
    return meetings


def update_meeting(page_id: str, summary: str, action_items: str, attendees: str = None):
    """Update meeting properties after processing."""
    url = f"{NOTION_API}/pages/{page_id}"
    
    properties = {
        "AI Processing": {"select": {"name": "Processed"}},
        "Summary": {"rich_text": [{"text": {"content": summary[:2000]}}]} if summary else {"rich_text": []},
        "Action Items": {"rich_text": [{"text": {"content": action_items[:2000]}}]} if action_items else {"rich_text": []}
    }
    
    if attendees:
        properties["Attendees"] = {"rich_text": [{"text": {"content": attendees[:500]}}]}
    
    response = requests.patch(url, headers=notion_headers(), json={"properties": properties})
    response.raise_for_status()
    return response.json()


def create_task(name: str, project_id: str = None, due_date: str = None, assignee: str = None):
    """Create a task in the Tasks database."""
    url = f"{NOTION_API}/pages"
    
    properties = {
        "Name": {"title": [{"text": {"content": name}}]},
        "Status": {"select": {"name": "To Do"}}
    }
    
    if project_id:
        properties["Project"] = {"relation": [{"id": project_id}]}
    
    if due_date:
        properties["Due Date"] = {"date": {"start": due_date}}
    
    if assignee:
        properties["Assignee"] = {"select": {"name": assignee}}
    
    payload = {
        "parent": {"database_id": TASKS_DB},
        "properties": properties
    }
    
    response = requests.post(url, headers=notion_headers(), json=payload)
    response.raise_for_status()
    return response.json()


def parse_action_items(action_text: str) -> list:
    """Parse action items text into structured list."""
    if not action_text:
        return []
    
    items = []
    lines = action_text.split("\n")
    
    for line in lines:
        line = line.strip()
        # Skip headers and empty lines
        if not line or line.lower().startswith("action item"):
            continue
        
        # Remove bullet points, numbers
        if line[0] in "•-*123456789.":
            line = line.lstrip("•-*0123456789.").strip()
        
        if len(line) > 5:  # Skip very short lines
            items.append(line)
    
    return items


def main():
    dry_run = "--dry-run" in sys.argv
    
    print("=" * 50)
    print("Notion Meeting Processor")
    print("=" * 50)
    
    if dry_run:
        print("🔍 DRY RUN MODE - No changes will be made")
    
    print("\n📋 Fetching unprocessed meetings...")
    meetings = get_unprocessed_meetings()
    
    print(f"Found {len(meetings)} unprocessed meetings:\n")
    
    for m in meetings:
        print(f"  • {m['date'][:10] if m['date'] else 'No date'} - {m['title'][:50] or 'Untitled'}")
        print(f"    ID: {m['id']}")
        print(f"    URL: {m['url']}")
        print()
    
    if not meetings:
        print("✅ All meetings are processed!")
        return
    
    print("-" * 50)
    print("\n⚠️  To process these meetings, run the read_meeting.py script")
    print("   on the Mac node for each meeting, then call update_meeting()")
    print("\nExample workflow:")
    print("  1. nodes.run('Mac Studio', ['python3', 'read_meeting.py', '<page_id>'])")
    print("  2. Parse the returned summary and action items")
    print("  3. update_meeting(page_id, summary, action_items)")
    print("  4. For each action item: create_task(name, project_id)")


if __name__ == "__main__":
    main()
