#!/usr/bin/env python3
"""Google API utility for VPS — Slides, Drive, Sheets.
Usage:
  python3 google-api.py slides list <presentation_id>
  python3 google-api.py slides read <presentation_id> [slide_num]
  python3 google-api.py slides update <presentation_id> <requests_json_file>
  python3 google-api.py drive list <folder_id>
  python3 google-api.py drive download <file_id> <output_path>
"""
import json, os, sys
from urllib.request import Request, urlopen
from urllib.error import HTTPError
from urllib.parse import urlencode

CREDS_PATH = os.environ.get("CREDS_PATH", "/home/clawd/.clawdbot/skills/gmail/credentials.json")
TOKEN_PATH = os.environ.get("TOKEN_PATH", "/home/clawd/.clawdbot/skills/gmail/tokens/bot-calendar.json")

def load_config():
    with open(CREDS_PATH) as f:
        creds = json.load(f)
    client = creds.get("installed", creds.get("web", {}))
    with open(TOKEN_PATH) as f:
        token = json.load(f)
    return client, token

def get_access_token():
    client, token = load_config()
    data = (
        f"client_id={client['client_id']}"
        f"&client_secret={client['client_secret']}"
        f"&refresh_token={token['refresh_token']}"
        f"&grant_type=refresh_token"
    ).encode()
    req = Request("https://oauth2.googleapis.com/token", data=data,
                  headers={"Content-Type": "application/x-www-form-urlencoded"})
    return json.loads(urlopen(req, timeout=10).read())["access_token"]

def api_get(url, token):
    req = Request(url, headers={"Authorization": f"Bearer {token}"})
    try:
        return json.loads(urlopen(req, timeout=15).read())
    except HTTPError as e:
        print(f"ERROR {e.code}: {e.read().decode()[:300]}", file=sys.stderr)
        return None

def api_post(url, token, body):
    data = json.dumps(body).encode()
    req = Request(url, data=data, headers={
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json"
    })
    try:
        return json.loads(urlopen(req, timeout=30).read())
    except HTTPError as e:
        print(f"ERROR {e.code}: {e.read().decode()[:300]}", file=sys.stderr)
        return None

def slides_list(pres_id, token):
    pres = api_get(f"https://slides.googleapis.com/v1/presentations/{pres_id}", token)
    if not pres: return
    print(f"Title: {pres.get('title')}")
    for i, slide in enumerate(pres.get("slides", [])):
        texts = []
        for el in slide.get("pageElements", []):
            for te in el.get("shape", {}).get("text", {}).get("textElements", []):
                c = te.get("textRun", {}).get("content", "").strip()
                if c: texts.append(c)
        print(f"  Slide {i+1}: {' | '.join(texts[:3])[:100]}")

def slides_read(pres_id, token, slide_num=None):
    pres = api_get(f"https://slides.googleapis.com/v1/presentations/{pres_id}", token)
    if not pres: return
    slides = pres.get("slides", [])
    if slide_num:
        slides = [slides[int(slide_num)-1]]
    for i, slide in enumerate(slides):
        print(f"\n=== Slide {slide_num or i+1} ===")
        print(f"ID: {slide['objectId']}")
        for el in slide.get("pageElements", []):
            eid = el.get("objectId", "")
            shape = el.get("shape", {})
            text = shape.get("text", {})
            full_text = ""
            for te in text.get("textElements", []):
                c = te.get("textRun", {}).get("content", "")
                full_text += c
            if full_text.strip():
                print(f"  [{eid}] {full_text.strip()}")

def slides_update(pres_id, token, requests_file):
    with open(requests_file) as f:
        requests = json.load(f)
    result = api_post(
        f"https://slides.googleapis.com/v1/presentations/{pres_id}:batchUpdate",
        token, {"requests": requests}
    )
    if result:
        print(f"✅ Applied {len(requests)} updates")
    return result

def drive_list(folder_id, token):
    q = urlencode({"q": f"'{folder_id}' in parents", "fields": "files(id,name,mimeType,modifiedTime)", "pageSize": "100"})
    result = api_get(f"https://www.googleapis.com/drive/v3/files?{q}", token)
    if not result: return
    for f in result.get("files", []):
        print(f"  {f['name']} ({f['mimeType'][:30]}) [{f['id']}]")

def main():
    if len(sys.argv) < 3:
        print(__doc__)
        sys.exit(1)
    
    service = sys.argv[1]
    action = sys.argv[2]
    token = get_access_token()
    
    if service == "slides":
        if action == "list":
            slides_list(sys.argv[3], token)
        elif action == "read":
            slides_read(sys.argv[3], token, sys.argv[4] if len(sys.argv) > 4 else None)
        elif action == "update":
            slides_update(sys.argv[3], token, sys.argv[4])
    elif service == "drive":
        if action == "list":
            drive_list(sys.argv[3], token)
    else:
        print(f"Unknown service: {service}")

if __name__ == "__main__":
    main()
