"""Translation — translate text to other languages.

Uses unofficial Google Translate (via httpx, no API key needed).
Commands: /translate <text>, /tr <text>, or reply with /translate
"""
from __future__ import annotations

import logging
from urllib.parse import quote

import httpx
from telegram import Update
from telegram.constants import ParseMode
from telegram.ext import CommandHandler, ContextTypes

from bot.persian_router import register_mixed

logger = logging.getLogger(__name__)

LANG_NAMES = {
    "en": "📕 انگلیسی",
    "fa": "📘 فارسی",
    "ar": "📗 عربی",
    "fr": "📙 فرانسوی",
    "de": "📓 آلمانی",
    "es": "📕 اسپانیایی",
    "tr": "📘 ترکی",
    "ru": "📙 روسی",
    "ur": "📗 اردو",
    "hi": "📘 هندی",
    "zh": "📕 چینی",
    "ja": "📗 ژاپنی",
}

DEFAULT_TARGET = "fa"


async def _translate(text: str, target: str = "fa", source: str = "auto") -> str | None:
    """Translate via Google Translate free API."""
    try:
        url = (
            f"https://translate.googleapis.com/translate_a/single"
            f"?client=gtx&sl={source}&tl={target}&dt=t&q={quote(text[:5000])}"
        )
        async with httpx.AsyncClient(timeout=10) as client:
            r = await client.get(url)
            r.raise_for_status()
            data = r.json()
        parts = []
        for segment in data[0]:
            if segment[0]:
                parts.append(segment[0])
        return "".join(parts) if parts else None
    except Exception as e:
        logger.warning("Translate error: %s", e)
        return None


async def translate_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    msg = update.message
    args = (msg.text or "").split(maxsplit=1)
    target_lang = DEFAULT_TARGET
    source_text = None

    if msg.reply_to_message:
        source_text = msg.reply_to_message.text or msg.reply_to_message.caption
        if len(args) > 1:
            target_lang = args[1].lower()
    elif len(args) > 1 and len(args[1].split(maxsplit=1)) == 2:
        # /translate fa hello world
        parts = args[1].split(maxsplit=1)
        if parts[0] in LANG_NAMES:
            target_lang = parts[0]
            source_text = parts[1]
    elif len(args) > 1:
        source_text = args[1]
    if not source_text:
        await msg.reply_text(
            "ℹ️ متن را وارد کنید یا روی یک پیام ریپلای کنید.\n"
            "مثال: /translate سلام\n"
            "مثال: /translate en سلام\n"
            "مثال: /translate fa Hello"
        )
        return

    result = await _translate(source_text, target=target_lang)
    if not result:
        await msg.reply_text("❌ ترجمه انجام نشد.")
        return

    target_name = LANG_NAMES.get(target_lang, target_lang.upper())
    text = (
        f"🌐 <b>ترجمه شده به {target_name}</b>\n\n"
        f"{result}"
    )
    await msg.reply_text(text, parse_mode=ParseMode.HTML)


def register(app) -> None:
    register_mixed(
        app,
        {
            "translate": translate_cmd,
            "tr": translate_cmd,
        },
        {
            "ترجمه": translate_cmd,
            "ترجمه کن": translate_cmd,
            "برگردان": translate_cmd,
            "برگردون": translate_cmd,
            "به فارسی": translate_cmd,
            "به انگلیسی": translate_cmd,
        },
    )
