#!/usr/bin/env python3
"""Discord utilities for project auto-posting and thread workspaces."""
import json
import subprocess
import sys

MAP_FILE = "/Users/assafdagan/clawd/scripts/discord-project-map.json"
KITT_TOKEN = "MTQ2Nzk3Njk0MTc5MjY2MTU0Ng.GwwFym.-uI-JrIsP29rokL1zK9b-XOJ3bkRi4D0wZFEVg"

def load_map():
    with open(MAP_FILE) as f:
        return json.load(f)

def detect_project(text):
    """Detect which project a message is about based on keywords."""
    data = load_map()
    text_lower = text.lower()
    best = None
    best_score = 0
    for slug, info in data['projects'].items():
        score = sum(1 for kw in info['keywords'] if kw.lower() in text_lower)
        if score > best_score:
            best_score = score
            best = slug
    return best

def get_channel(project_slug=None):
    """Get Discord channel ID for a project."""
    data = load_map()
    if project_slug and project_slug in data['projects']:
        return data['projects'][project_slug]['channel_id']
    return data['general_channel']

def post_message(channel_id, message, bot_token=None):
    """Post a message to a Discord channel using curl."""
    token = bot_token or KITT_TOKEN
    # Split messages over 2000 chars
    while len(message) > 2000:
        split_at = message[:2000].rfind('\n')
        if split_at == -1:
            split_at = 1990
        _post_single(channel_id, message[:split_at], token)
        message = message[split_at:].lstrip('\n')
    if message.strip():
        return _post_single(channel_id, message, token)

def _post_single(channel_id, message, token):
    """Post a single message via curl."""
    result = subprocess.run([
        'curl', '-s', '-X', 'POST',
        f'https://discord.com/api/v10/channels/{channel_id}/messages',
        '-H', f'Authorization: Bot {token}',
        '-H', 'Content-Type: application/json',
        '-d', json.dumps({"content": message})
    ], capture_output=True, text=True)
    return json.loads(result.stdout) if result.stdout else None

def create_thread(channel_id, name, initial_message=None):
    """Create a thread in a Discord channel."""
    result = subprocess.run([
        'curl', '-s', '-X', 'POST',
        f'https://discord.com/api/v10/channels/{channel_id}/threads',
        '-H', f'Authorization: Bot {KITT_TOKEN}',
        '-H', 'Content-Type: application/json',
        '-d', json.dumps({
            "name": name,
            "type": 11,
            "auto_archive_duration": 1440
        })
    ], capture_output=True, text=True)
    thread = json.loads(result.stdout) if result.stdout else {}
    thread_id = thread.get('id')
    
    if thread_id and initial_message:
        post_message(thread_id, initial_message)
    
    return thread_id

def auto_post(message, project_slug=None):
    """Auto-detect project and post update to its Discord channel."""
    if not project_slug:
        project_slug = detect_project(message)
    channel_id = get_channel(project_slug)
    return post_message(channel_id, message)

if __name__ == '__main__':
    if len(sys.argv) < 3:
        print("Usage: discord_utils.py <post|thread|detect> <args...>")
        sys.exit(1)
    
    cmd = sys.argv[1]
    if cmd == 'post':
        project = sys.argv[2]
        msg = sys.argv[3]
        channel = get_channel(project)
        result = post_message(channel, msg)
        print(f"Posted to {project}: {result.get('id', 'FAIL') if result else 'FAIL'}")
    elif cmd == 'thread':
        channel = sys.argv[2]
        name = sys.argv[3]
        init_msg = sys.argv[4] if len(sys.argv) > 4 else None
        tid = create_thread(channel, name, init_msg)
        print(f"Thread: {tid}")
    elif cmd == 'detect':
        text = sys.argv[2]
        print(f"Project: {detect_project(text)}")
