"""One-off seed: registers translation_keys English source_text and hi/mr/hinglish
translation_values for the "master-iso-language" PageInfoButton content.

Usage: docker compose exec api python seed_translations_pageinfo_master_iso_language.py
"""
import asyncio
import uuid
from datetime import datetime, timezone

from sqlalchemy import text
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine

from ams.core.config import settings

NAMESPACE = "help"

# key -> (english, hi, mr, hinglish)
MASTER_ISO_LANGUAGE = {
    "master-iso-language.title": (
        "Language Master",
        "लैंग्वेज मास्टर",
        "लैंग्वेज मास्टर",
        "Language Master",
    ),
    "master-iso-language.subtitle": (
        "Manage app languages and track translation completion",
        "ऐप की भाषाओं को प्रबंधित करें और translation completion को ट्रैक करें",
        "ॲपच्या भाषा व्यवस्थापित करा आणि translation completion चा मागोवा घ्या",
        "App ki languages manage karein aur translation completion track karein",
    ),
    "master-iso-language.body.0": (
        "This page controls every language the app can show, and how much of the app is translated into each one.",
        "यह पेज उन सभी भाषाओं को नियंत्रित करता है जो app दिखा सकता है, और app का कितना हिस्सा हर भाषा में translate हुआ है।",
        "हे पेज त्या सर्व भाषा नियंत्रित करते ज्या app दाखवू शकते, आणि app चा किती भाग प्रत्येक भाषेत translate झाला आहे.",
        "Ye page un sabhi languages ko control karta hai jo app dikha sakta hai, aur app ka kitna hissa har language mein translate hua hai.",
    ),
    "master-iso-language.body.1": (
        "Add a new language, then either translate word-by-word or download an Excel sheet, fill it in, and upload it back.",
        "एक नई भाषा जोड़ें, फिर या तो word-by-word translate करें या Excel sheet download करें, उसे भरें, और वापस upload करें।",
        "एक नवीन भाषा जोडा, नंतर एकतर word-by-word translate करा किंवा Excel sheet download करा, ती भरा, आणि परत upload करा.",
        "Ek nayi language add karein, phir ya to word-by-word translate karein ya Excel sheet download karke usse fill karein, aur wapas upload kar dein.",
    ),
    "master-iso-language.body.2": (
        "A language only appears in the top menu once someone marks it Active — and it can only be activated after it's 100% translated.",
        "कोई भाषा तभी top menu में दिखती है जब कोई उसे Active mark करता है — और इसे Active तभी किया जा सकता है जब यह 100% translate हो चुकी हो।",
        "एखादी भाषा फक्त तेव्हाच top menu मध्ये दिसते जेव्हा कोणीतरी तिला Active mark करते — आणि ती फक्त 100% translate झाल्यावरच Active करता येते.",
        "Koi language tabhi top menu mein dikhti hai jab use koi Active mark karta hai — aur ise Active tabhi kiya ja sakta hai jab wo 100% translate ho chuki ho.",
    ),
    "master-iso-language.stepsHeading": (
        "Language lifecycle",
        "भाषा का Lifecycle",
        "भाषेचे Lifecycle",
        "Language ka lifecycle",
    ),
    "master-iso-language.steps.0.label": ("Add", "जोड़ें", "जोडा", "Add"),
    "master-iso-language.steps.0.caption": (
        "Register the language in Master Records (ISO code, name, native name).",
        "भाषा को Master Records में register करें (ISO code, name, native name)।",
        "भाषा Master Records मध्ये register करा (ISO code, name, native name).",
        "Language ko Master Records mein register karein (ISO code, name, native name).",
    ),
    "master-iso-language.steps.1.label": ("Translate", "अनुवाद करें", "भाषांतर करा", "Translate karein"),
    "master-iso-language.steps.1.caption": (
        "Fill it in one word at a time, or export to Excel and import the completed sheet.",
        "इसे एक-एक शब्द करके भरें, या Excel में export करके भरी हुई sheet import करें।",
        "ती एक-एक शब्द करून भरा, किंवा Excel मध्ये export करून भरलेली sheet import करा.",
        "Ise ek-ek word karke fill karein, ya Excel mein export karke completed sheet import karein.",
    ),
    "master-iso-language.steps.2.label": ("100% Complete", "100% पूर्ण", "100% पूर्ण", "100% Complete"),
    "master-iso-language.steps.2.caption": (
        "Every key across every content set has a translation.",
        "हर content set की हर key का translation मौजूद है।",
        "प्रत्येक content set मधील प्रत्येक key चे translation उपलब्ध आहे.",
        "Har content set ki har key ka translation maujood hai.",
    ),
    "master-iso-language.steps.3.label": ("Active", "Active", "Active", "Active"),
    "master-iso-language.steps.3.caption": (
        "Shows up in the top-menu language switcher for every user.",
        "हर user के लिए top-menu language switcher में दिखता है।",
        "प्रत्येक user साठी top-menu language switcher मध्ये दिसते.",
        "Har user ke liye top-menu language switcher mein show hota hai.",
    ),
    "master-iso-language.fieldRules.0.name": ("Language", "भाषा", "भाषा", "Language"),
    "master-iso-language.fieldRules.0.description": (
        "Name, native name and ISO code, set once when the language is added via Master Records.",
        "Name, native name और ISO code, जो भाषा को Master Records के ज़रिए जोड़े जाने पर एक बार सेट होते हैं।",
        "Name, native name आणि ISO code, जे भाषा Master Records द्वारे जोडली जाते तेव्हा एकदाच सेट होतात.",
        "Name, native name aur ISO code, jo language ko Master Records ke through add karte waqt ek baar set hote hain.",
    ),
    "master-iso-language.fieldRules.1.name": ("Status (Active)", "स्थिति (Active)", "स्थिती (Active)", "Status (Active)"),
    "master-iso-language.fieldRules.1.description": (
        "Toggle is disabled until the language is 100% translated; English is always active and can't be turned off.",
        "जब तक भाषा 100% translate नहीं हो जाती, toggle disabled रहता है; English हमेशा active रहती है और इसे बंद नहीं किया जा सकता।",
        "जोपर्यंत भाषा 100% translate होत नाही, तोपर्यंत toggle disabled राहतो; English नेहमी active असते आणि ती बंद करता येत नाही.",
        "Jab tak language 100% translate nahi ho jaati, toggle disabled rehta hai; English hamesha active rehti hai aur ise off nahi kiya ja sakta.",
    ),
    "master-iso-language.fieldRules.2.name": (
        "Translation Completion",
        "ट्रांसलेशन कम्प्लीशन",
        "ट्रान्सलेशन कम्प्लीशन",
        "Translation Completion",
    ),
    "master-iso-language.fieldRules.2.description": (
        "Translated keys out of total, always counted across ALL content sets, not just the tab you're viewing.",
        "कुल में से translate हुई keys, जो हमेशा सभी content sets में गिनी जाती हैं, सिर्फ आपके देखे जा रहे tab में नहीं।",
        "एकूण मधून translate झालेल्या keys, ज्या नेहमी सर्व content sets मध्ये मोजल्या जातात, फक्त तुम्ही पाहत असलेल्या tab मध्ये नाही.",
        "Total mein se translate hui keys, jo hamesha saare content sets mein count hoti hain, sirf jo tab aap dekh rahe hain usmein nahi.",
    ),
    "master-iso-language.fieldRules.3.name": (
        "Content set tabs",
        "कंटेंट सेट टैब्स",
        "कंटेंट सेट टॅब्स",
        "Content set tabs",
    ),
    "master-iso-language.fieldRules.3.description": (
        "Scopes View/Export/Import to one content set (Menus, Login Screen, Help Center, App Pages) — doesn't affect the Activate gate.",
        "View/Export/Import को एक content set (Menus, Login Screen, Help Center, App Pages) तक सीमित करता है — यह Activate gate को प्रभावित नहीं करता।",
        "View/Export/Import ला एका content set (Menus, Login Screen, Help Center, App Pages) पुरते मर्यादित करते — याचा Activate gate वर परिणाम होत नाही.",
        "View/Export/Import ko sirf ek content set (Menus, Login Screen, Help Center, App Pages) tak limit karta hai — isse Activate gate par koi asar nahi padta.",
    ),
    "master-iso-language.tip.title": (
        "Completion % is global, not per-tab",
        "Completion % ग्लोबल है, per-tab नहीं",
        "Completion % ग्लोबल आहे, per-tab नाही",
        "Completion % global hai, per-tab nahi",
    ),
    "master-iso-language.tip.body": (
        "A language can look 100% done on one content-set tab while the Activate button stays disabled — the gate checks translation across every content set combined. Switch through all the tabs (or just check the disabled button's tooltip) to see what's still missing before chasing a phantom bug.",
        "एक भाषा किसी एक content-set tab पर 100% पूर्ण दिख सकती है, जबकि Activate button disabled ही रहता है — क्योंकि यह gate सभी content sets को मिलाकर translation चेक करता है। यह देखने के लिए कि अभी क्या बाकी है, सभी tabs में जाकर देखें (या बस disabled button के tooltip को चेक करें) — किसी phantom bug के पीछे भागने से पहले।",
        "एखादी भाषा एका content-set tab वर 100% पूर्ण दिसू शकते, तरीही Activate button disabled च राहतो — कारण हे gate सर्व content sets एकत्र करून translation तपासते. अजून काय बाकी आहे हे पाहण्यासाठी सर्व tabs मधून फिरा (किंवा फक्त disabled button चा tooltip तपासा) — phantom bug च्या मागे धावण्याआधी.",
        "Ek language kisi ek content-set tab par 100% complete dikh sakti hai, jabki Activate button disabled hi rehta hai — kyunki ye gate sabhi content sets ko combine karke translation check karta hai. Ye dekhne ke liye ki abhi kya missing hai, saare tabs mein switch karke dekhein (ya bas disabled button ka tooltip check kar lein) — kisi phantom bug ke peeche bhaagne se pehle.",
    ),
}


async def seed_for_session(session: AsyncSession) -> tuple[int, int]:
    now = datetime.now(timezone.utc)
    keys_upserted = 0
    values_upserted = 0
    for key, (en, hi, mr, hinglish) in MASTER_ISO_LANGUAGE.items():
        key_id = (await session.execute(
            text("SELECT id FROM translation_keys WHERE namespace = :ns AND key = :key"),
            {"ns": NAMESPACE, "key": key},
        )).scalar_one_or_none()
        if key_id:
            await session.execute(
                text("UPDATE translation_keys SET source_text = :src WHERE id = :id"),
                {"src": en, "id": key_id},
            )
        else:
            key_id = str(uuid.uuid4())
            await session.execute(
                text("""INSERT INTO translation_keys (id, namespace, key, source_text, created_at)
                        VALUES (:id, :ns, :key, :src, :now)"""),
                {"id": key_id, "ns": NAMESPACE, "key": key, "src": en, "now": now},
            )
            keys_upserted += 1

        for lang_code, value in (("hi", hi), ("mr", mr), ("hinglish", hinglish)):
            existing = (await session.execute(
                text("SELECT id FROM translation_values WHERE key_id = :kid AND language_code = :lc"),
                {"kid": key_id, "lc": lang_code},
            )).scalar_one_or_none()
            if existing:
                await session.execute(
                    text("UPDATE translation_values SET value = :val, updated_at = :now WHERE id = :id"),
                    {"val": value, "now": now, "id": existing},
                )
            else:
                await session.execute(
                    text("""INSERT INTO translation_values (id, key_id, language_code, value, updated_by, updated_at)
                            VALUES (:id, :kid, :lc, :val, NULL, :now)"""),
                    {"id": str(uuid.uuid4()), "kid": key_id, "lc": lang_code, "val": value, "now": now},
                )
                values_upserted += 1
    await session.commit()
    return keys_upserted, values_upserted


async def main() -> None:
    engine = create_async_engine(settings.DATABASE_URL, echo=False)
    Session = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)

    async with Session() as session:
        tenants = (await session.execute(
            text("SELECT id::text AS id, slug FROM public.tenants WHERE status != 'archived'")
        )).fetchall()

    for tenant in tenants:
        schema = f"tenant_{tenant.id.replace('-', '_')}"
        async with Session() as session:
            await session.execute(text(f"SET search_path TO {schema}, public"))
            try:
                k, v = await seed_for_session(session)
                print(f"  seeded {k} new keys, {v} new values: {tenant.slug}")
            except Exception as exc:
                print(f"  SKIPPED {tenant.slug}: {exc}")
                await session.rollback()

    await engine.dispose()
    print(f"Done — {len(tenants)} tenant(s) processed, {len(MASTER_ISO_LANGUAGE)} master-iso-language keys.")


if __name__ == "__main__":
    asyncio.run(main())
