#!/usr/bin/env python3
"""Upload one TXT, PDF or DOCX lesson. Install: pip install requests pypdf python-docx
Set STUDYQUEST_API_KEY, then run:
  python upload_lesson.py lesson.pdf --subject SUBJECT_UUID --language nl
Re-running unchanged input reuses its idempotency key. --revision starts a new attempt.
"""
import argparse
import hashlib
import json
import os
from pathlib import Path
import sys
import time
import requests

parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('file', type=Path)
parser.add_argument('--subject')
parser.add_argument('--language', default='en')
parser.add_argument('--questions', type=int, default=10)
parser.add_argument('--revision', default='1')
args = parser.parse_args()
key = os.environ.get('STUDYQUEST_API_KEY')
if not key:
    sys.exit('Set STUDYQUEST_API_KEY in your environment first.')
if args.file.suffix.lower() == '.pdf':
    from pypdf import PdfReader
    content = '\n'.join(page.extract_text() or '' for page in PdfReader(args.file).pages)
elif args.file.suffix.lower() == '.docx':
    from docx import Document
    document = Document(args.file)
    content = '\n'.join([p.text for p in document.paragraphs] +
                        [' | '.join(c.text for c in row.cells) for table in document.tables for row in table.rows])
else:
    content = args.file.read_text(encoding='utf-8')
content = content.strip()
if not 50 <= len(content) <= 40000:
    sys.exit('Provide 50–40,000 characters. Split long lessons; scanned PDFs need OCR.')
body = {'name': args.file.stem, 'content': content, 'question_count': args.questions,
        'language': args.language, 'subject_id': args.subject}
identity = json.dumps(body, sort_keys=True, ensure_ascii=False) + args.revision
headers = {'Authorization': f'Bearer {key}',
           'Idempotency-Key': 'lesson-' + hashlib.sha256(identity.encode()).hexdigest()}
base = 'https://jepbczthrhzznwzxrzoz.supabase.co/functions/v1/developer-api/v1'
for attempt in range(3):
    try:
        response = requests.post(f'{base}/study-sets', json=body, headers=headers, timeout=150)
    except (requests.Timeout, requests.ConnectionError):
        if attempt == 2:
            sys.exit('Connection failed. Re-run unchanged input to safely retrieve the same generation.')
        time.sleep(5)
        continue
    result = response.json()
    if not response.ok:
        error = result.get('error', {})
        sys.exit(f"{error.get('code')}: {error.get('message')}")
    job = result['data']
    if job['status'] == 'processing':
        for _ in range(36):
            time.sleep(10)
            response = requests.get(f"{base}/generations/{job['id']}", headers=headers, timeout=30)
            response.raise_for_status()
            job = response.json()['data']
            if job['status'] != 'processing':
                break
    if job['status'] == 'succeeded' and job['play_url']:
        print(job['play_url'])
    else:
        sys.exit(f"Generation {job['status']}: {job.get('error_code')}. Check its status before using --revision for a new attempt.")
    break
