#!/usr/bin/env python3
"""
Complete pipeline for card #921: fetch, parse docs, share each non-FR doc.
Run after the mcp__trello__get_card tool provides card data via stdin/arg.
"""
import json
import re
import subprocess
import sys

def parse_docs_from_description(description):
    """
    Extract Google Docs from card description.
    Format: "lang: https://docs.google.com/document/d/DOC_ID/..."
    Returns: dict of {lang_lower: docId}
    """
    docs = {}
    if not description:
        return docs
    
    # Match: optional word(lang), colon, google docs URL with /d/DOCID/
    pattern = r'(\w+)\s*:\s*https://docs\.google\.com/document/d/([a-zA-Z0-9-_]+)'
    
    for match in re.finditer(pattern, description):
        lang = match.group(1).lower()
        doc_id = match.group(2)
        docs[lang] = doc_id
    
    return docs

def share_doc(doc_id, lang):
    """Run _share_fix.py share command on a doc."""
    try:
        result = subprocess.run(
            ["python3", "/opt/automator/cinik-writer-transtor/files/_share_fix.py", 
             "share", doc_id],
            capture_output=True,
            text=True,
            timeout=30
        )
        
        if result.returncode != 0:
            return {
                "lang": lang,
                "role": "ERROR",
                "changed": "failed",
                "error": result.stderr[:200] if result.stderr else result.stdout[:200]
            }
        
        try:
            share_result = json.loads(result.stdout)
            share_result["lang"] = lang
            return share_result
        except json.JSONDecodeError:
            return {
                "lang": lang,
                "role": "ERROR",
                "changed": "failed",
                "error": f"Invalid JSON: {result.stdout[:200]}"
            }
    except Exception as e:
        return {
            "lang": lang,
            "role": "ERROR",
            "changed": "failed",
            "error": str(e)[:200]
        }

def main():
    # Read card from stdin or first argument
    card = None
    
    if len(sys.argv) > 1:
        try:
            card = json.loads(sys.argv[1])
        except json.JSONDecodeError as e:
            print(json.dumps({"error": f"Invalid JSON in args: {e}"}))
            sys.exit(1)
    else:
        try:
            card = json.load(sys.stdin)
        except Exception as e:
            print(json.dumps({"error": f"Failed to read stdin: {e}"}))
            sys.exit(1)
    
    description = card.get("desc", "") or ""
    docs = parse_docs_from_description(description)
    
    if not docs:
        print(json.dumps({
            "cardShort": 921,
            "results": [],
            "allWriter": False,
            "problems": ["No Google Docs found in card description"]
        }))
        sys.exit(0)
    
    # Process non-FR docs
    results = []
    problems = []
    all_writer = True
    
    for lang in sorted(docs.keys()):
        if lang == "fr":
            continue  # Skip French
        
        doc_id = docs[lang]
        result = share_doc(doc_id, lang)
        results.append(result)
        
        # Check if role is writer
        role = result.get("role", "ERROR")
        if role != "writer":
            all_writer = False
            if "error" in result:
                problems.append(f"{lang}: {result['error']}")
            else:
                problems.append(f"{lang}: role={role}, changed={result.get('changed')}")
    
    # Final output
    output = {
        "cardShort": 921,
        "results": results,
        "allWriter": all_writer,
        "problems": problems
    }
    
    print(json.dumps(output, indent=2))

if __name__ == "__main__":
    main()
