"""
Translation service: fills target-language fields (transliteration, translation,
applicant name, goods/services, disclaimer) for an extracted application.

Uses the Anthropic API when ANTHROPIC_API_KEY is set. Designed to fail gracefully:
if no key is configured or the call errors, fields are left blank for manual entry
in the edit screen — extraction and reporting are never blocked.

Target language defaults to English; pass target="..." for others (e.g. Chinese
later). One batched call per application keeps cost/latency low.
"""
import os
import json

DEFAULT_MODEL = os.environ.get("ANTHROPIC_TRANSLATE_MODEL", "claude-3-5-haiku-20241022")
TARGET_LANGUAGES = {"en": "English", "zh": "Chinese", "fr": "French", "ar": "Arabic"}


def is_configured():
    return bool(os.environ.get("ANTHROPIC_API_KEY"))


def translate_application(data, target="en"):
    """
    Given an extracted application dict (Farsi fields), return a dict of
    target-language fields. Returns {} if translation is unavailable.

    Output keys (any may be omitted if the source field was empty):
      mark_translit, mark_translation, applicant_en, goods_services_en, disclaimer_en
    """
    if not is_configured():
        return {}

    target_name = TARGET_LANGUAGES.get(target, target)
    mark = (data.get("mark_text") or "").strip()
    applicant = (data.get("applicant") or data.get("owner") or "").strip()
    entity = (data.get("applicant_entity") or data.get("owner_entity") or "").strip()
    nationality = (data.get("nationality") or "").strip()
    goods = (data.get("goods_services") or "").strip()
    disclaimer = (data.get("disclaimer") or "").strip()
    # Latin tokens already pulled from the mark are a strong transliteration hint.
    latin_hint = (data.get("mark_translit") or data.get("mark_text_en") or "").strip()

    if not any([mark, applicant, goods, disclaimer, nationality]):
        return {}

    prompt = _build_prompt(target_name, mark, latin_hint, applicant, entity,
                           nationality, goods, disclaimer)

    try:
        import anthropic
        client = anthropic.Anthropic()
        resp = client.messages.create(
            model=DEFAULT_MODEL,
            max_tokens=2000,
            messages=[{"role": "user", "content": prompt}],
        )
        text = "".join(b.text for b in resp.content if getattr(b, "type", "") == "text")
        return _parse_json(text)
    except Exception:
        return {}


def _build_prompt(target_name, mark, latin_hint, applicant, entity, nationality, goods, disclaimer):
    parts = [
        f"You are a trademark-bulletin translator. Render the following Persian "
        f"(Farsi) trademark fields into {target_name} for an official IP opposition "
        f"bulletin. Be precise and use standard trademark terminology.",
        "",
        "Naming convention (important): TRANSLITERATE personal and company names "
        "into the Latin/target script (do NOT translate their literal meaning); "
        "but TRANSLATE the legal entity type (e.g. 'سهامی خاص' -> 'Private Joint "
        "Stock Co.', 'با مسئولیت محدود' -> 'LLC').",
        "",
        "Return ONLY a JSON object (no markdown, no commentary) with these keys, "
        "omitting any whose source is empty:",
        '  "mark_translit"      - the mark name transliterated into the Latin/target script',
        '  "mark_translation"   - the meaning of the mark, if it is a meaningful word; else ""',
        '  "applicant_en"       - the applicant name transliterated/rendered in the target language',
        '  "applicant_entity_en"- the entity type translated (e.g. "Private Joint Stock Co.", "LLC")',
        '  "nationality_en"     - the nationality translated (e.g. "Iran")',
        '  "goods_services_en"  - the goods/services translated, preserving any [NN] class tags',
        '  "disclaimer_en"      - the disclaimer translated',
        "",
    ]
    if latin_hint:
        parts.append(f'The mark already contains this Latin text, prefer it for the transliteration: "{latin_hint}"')
    if mark:
        parts.append(f"MARK DESCRIPTION (Farsi): {mark}")
    if applicant:
        parts.append(f"APPLICANT NAME (Farsi): {applicant}")
    if entity:
        parts.append(f"ENTITY TYPE (Farsi): {entity}")
    if nationality:
        parts.append(f"NATIONALITY (Farsi): {nationality}")
    if goods:
        parts.append(f"GOODS/SERVICES (Farsi, with [NN] class tags): {goods}")
    if disclaimer:
        parts.append(f"DISCLAIMER (Farsi): {disclaimer}")
    return "\n".join(parts)


def _parse_json(text):
    text = text.strip()
    # strip code fences if the model added them despite instructions
    if text.startswith("```"):
        text = text.split("```", 2)[1] if "```" in text[3:] else text
        text = text.lstrip("json").strip("`\n ")
    try:
        obj = json.loads(text)
    except Exception:
        # last resort: find the first {...} block
        start, end = text.find("{"), text.rfind("}")
        if start >= 0 and end > start:
            try:
                obj = json.loads(text[start:end + 1])
            except Exception:
                return {}
        else:
            return {}
    allowed = {"mark_translit", "mark_translation", "applicant_en",
               "applicant_entity_en", "nationality_en",
               "goods_services_en", "disclaimer_en"}
    return {k: v for k, v in obj.items() if k in allowed and v}
