#!/usr/bin/env python3
"""Translate a single question on demand (used after answering)."""
from __future__ import annotations

import argparse
import json
import sys
import time
from datetime import datetime, timezone
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
SCRIPTS = Path(__file__).resolve().parent
if str(SCRIPTS) not in sys.path:
    sys.path.insert(0, str(SCRIPTS))

from azure_vi_glossary import improve_vi_text, protect_terms, restore_terms

QUESTIONS_PATH = ROOT / "data" / "questions.json"

try:
    from deep_translator import GoogleTranslator
except ImportError:
    GoogleTranslator = None  # type: ignore


def translate_text(text: str | None, translator: GoogleTranslator) -> str | None:
    if not text or not str(text).strip():
        return None
    t = str(text).strip()
    protected, placeholders = protect_terms(t)
    if len(protected) > 4500:
        parts = []
        for i in range(0, len(protected), 4000):
            parts.append(translator.translate(protected[i : i + 4000]))
            time.sleep(0.2)
        out = " ".join(parts)
    else:
        out = translator.translate(protected)
    out = restore_terms(out, placeholders)
    return improve_vi_text(out)


def translate_bilingual(obj: dict, translator: GoogleTranslator) -> bool:
    if not obj or not obj.get("en") or obj.get("vi"):
        return False
    try:
        obj["vi"] = translate_text(obj["en"], translator)
        time.sleep(0.08)
        return True
    except Exception:
        return False


def translate_question(q: dict, translator: GoogleTranslator) -> bool:
    changed = False
    for field in ("stem", "explanation"):
        if translate_bilingual(q.get(field, {}), translator):
            changed = True
    if translate_bilingual(q.get("answer", {}).get("text", {}), translator):
        changed = True
    meta = q.get("meta") or {}
    if isinstance(meta.get("scenario"), dict):
        if translate_bilingual(meta["scenario"], translator):
            changed = True
    for opt in q.get("options", []):
        if translate_bilingual(opt.get("text", {}), translator):
            changed = True
    for box in q.get("boxes", []):
        if translate_bilingual(box.get("answer", {}), translator):
            changed = True
    if changed:
        q.setdefault("meta", {})["translatedAt"] = datetime.now(timezone.utc).isoformat()
    return changed


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument("--id", type=int, required=True)
    args = parser.parse_args()

    if not GoogleTranslator:
        print("{}", file=sys.stdout)
        return 0

    questions = json.loads(QUESTIONS_PATH.read_text(encoding="utf-8"))
    q = next((x for x in questions if x["id"] == args.id), None)
    if not q:
        print("{}", file=sys.stdout)
        return 1

    translator = GoogleTranslator(source="en", target="vi")
    translate_question(q, translator)
    QUESTIONS_PATH.write_text(
        json.dumps(questions, ensure_ascii=False, indent=2), encoding="utf-8"
    )

    out = {
        "stem": q.get("stem"),
        "explanation": q.get("explanation"),
        "options": q.get("options"),
        "boxes": q.get("boxes"),
    }
    print(json.dumps(out, ensure_ascii=False))
    return 0


if __name__ == "__main__":
    sys.exit(main())
