"""One-off seed: registers translation_keys + hi/mr/hinglish translation_values
for the "feature-flags" PageInfoButton content (Feature Flags & Module Management page).

Usage: docker compose exec api python seed_translations_pageinfo_feature_flags.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)
FEATURE_FLAGS = {
    "feature-flags.title": (
        "Feature Flags & Module Management",
        "फ़ीचर फ़्लैग्स और मॉड्यूल प्रबंधन",
        "फीचर फ्लॅग्स आणि मॉड्यूल व्यवस्थापन",
        "Feature Flags aur Module Management",
    ),
    "feature-flags.subtitle": (
        "How this register works and what each field controls",
        "यह रजिस्टर कैसे काम करता है और प्रत्येक फ़ील्ड क्या नियंत्रित करती है",
        "हे रजिस्टर कसे कार्य करते आणि प्रत्येक फील्ड काय नियंत्रित करते",
        "Ye register kaise kaam karta hai aur har field kya control karti hai",
    ),
    "feature-flags.body.0": (
        "Turn whole modules on/off tenant-wide, and roll out finer-grained feature flags gradually or per-tenant. Disabling a module hides it for every role — a different control from per-role permissions.",
        "पूरे मॉड्यूल को टेनेंट-वाइड चालू/बंद करें, और अधिक बारीक फ़ीचर फ़्लैग्स को धीरे-धीरे या प्रति-टेनेंट रोल आउट करें। किसी मॉड्यूल को अक्षम करने पर वह हर भूमिका के लिए छिप जाता है — यह प्रति-भूमिका अनुमतियों से अलग नियंत्रण है।",
        "संपूर्ण मॉड्यूल्स टेनंट-व्यापी चालू/बंद करा, आणि अधिक बारीक फीचर फ्लॅग्स हळूहळू किंवा प्रति-टेनंट रोल आउट करा. एखादा मॉड्यूल अक्षम केल्यास तो प्रत्येक भूमिकेसाठी लपतो — हे प्रति-भूमिका परवानग्यांपेक्षा वेगळे नियंत्रण आहे.",
        "Poore modules ko tenant-wide on/off karein, aur zyada fine-grained feature flags ko gradually ya per-tenant rollout karein. Kisi module ko disable karne se woh har role ke liye hide ho jaata hai — ye per-role permissions se alag control hai.",
    ),
    "feature-flags.stepsHeading": (
        "How a flag rolls out",
        "एक फ़्लैग कैसे रोल आउट होता है",
        "एखादा फ्लॅग कसा रोल आउट होतो",
        "Ek flag kaise rollout hota hai",
    ),
    "feature-flags.steps.0.label": (
        "Module",
        "मॉड्यूल",
        "मॉड्यूल",
        "Module",
    ),
    "feature-flags.steps.0.caption": (
        "On/off, tenant-wide",
        "चालू/बंद, टेनेंट-वाइड",
        "चालू/बंद, टेनंट-व्यापी",
        "On/off, tenant-wide",
    ),
    "feature-flags.steps.1.label": (
        "Feature flag",
        "फ़ीचर फ़्लैग",
        "फीचर फ्लॅग",
        "Feature flag",
    ),
    "feature-flags.steps.1.caption": (
        "Finer than a module",
        "मॉड्यूल से अधिक बारीक",
        "मॉड्यूलपेक्षा अधिक बारीक",
        "Module se zyada fine-grained",
    ),
    "feature-flags.steps.2.label": (
        "Gradual rollout",
        "क्रमिक रोलआउट",
        "क्रमिक रोलआउट",
        "Gradual rollout",
    ),
    "feature-flags.steps.2.caption": (
        "% of users",
        "% उपयोगकर्ता",
        "% वापरकर्ते",
        "% users",
    ),
    "feature-flags.steps.3.label": (
        "Tenant override",
        "टेनेंट ओवरराइड",
        "टेनंट ओव्हरराईड",
        "Tenant override",
    ),
    "feature-flags.steps.3.caption": (
        "Force on/off",
        "जबरन चालू/बंद",
        "सक्तीने चालू/बंद",
        "Force on/off",
    ),
    "feature-flags.fieldRules.0.name": (
        "Module",
        "मॉड्यूल",
        "मॉड्यूल",
        "Module",
    ),
    "feature-flags.fieldRules.0.description": (
        "A microservice-level switch — off hides every page under it.",
        "एक माइक्रोसर्विस-स्तरीय स्विच — बंद करने पर उसके अंतर्गत हर पेज छिप जाता है।",
        "एक मायक्रोसर्व्हिस-स्तरीय स्विच — बंद केल्यास त्याखालील प्रत्येक पेज लपतो.",
        "Ek microservice-level switch — off karne par uske andar ke sabhi pages hide ho jaate hain.",
    ),
    "feature-flags.fieldRules.1.name": (
        "Flag key",
        "फ़्लैग की",
        "फ्लॅग की",
        "Flag key",
    ),
    "feature-flags.fieldRules.1.description": (
        "Unique code referenced in the app to gate one feature.",
        "एक फ़ीचर को नियंत्रित करने के लिए ऐप में संदर्भित यूनिक कोड।",
        "एका फीचरला नियंत्रित करण्यासाठी अ‍ॅपमध्ये संदर्भित केलेला युनिक कोड.",
        "Ek feature ko gate karne ke liye app mein reference kiya jaane wala unique code.",
    ),
    "feature-flags.fieldRules.2.name": (
        "Rollout %",
        "रोलआउट %",
        "रोलआउट %",
        "Rollout %",
    ),
    "feature-flags.fieldRules.2.description": (
        "Percentage of users who see the flag as on, for staged releases.",
        "उपयोगकर्ताओं का वह प्रतिशत जिन्हें स्टेज्ड रिलीज़ के लिए फ़्लैग चालू दिखाई देता है।",
        "स्टेज्ड रिलीजसाठी ज्या वापरकर्त्यांना फ्लॅग चालू दिसतो त्यांची टक्केवारी.",
        "Staged releases ke liye jitne percentage users ko flag on dikhta hai.",
    ),
    "feature-flags.tip.title": (
        "Module vs. flag vs. permission",
        "मॉड्यूल बनाम फ़्लैग बनाम अनुमति",
        "मॉड्यूल विरुद्ध फ्लॅग विरुद्ध परवानगी",
        "Module vs. flag vs. permission",
    ),
    "feature-flags.tip.body": (
        "A module switch is tenant-wide and hides the page entirely. A feature flag is finer control within an enabled module. A role permission is per-user access to something already enabled.",
        "मॉड्यूल स्विच टेनेंट-वाइड होता है और पेज को पूरी तरह छिपा देता है। फ़ीचर फ़्लैग एक सक्षम मॉड्यूल के भीतर अधिक बारीक नियंत्रण है। भूमिका अनुमति पहले से सक्षम किसी चीज़ तक प्रति-उपयोगकर्ता पहुंच है।",
        "मॉड्यूल स्विच टेनंट-व्यापी असतो आणि पेज पूर्णपणे लपवतो. फीचर फ्लॅग हा सक्षम केलेल्या मॉड्यूलमधील अधिक बारीक नियंत्रण आहे. भूमिका परवानगी ही आधीच सक्षम असलेल्या गोष्टीसाठी प्रति-वापरकर्ता प्रवेश आहे.",
        "Module switch tenant-wide hota hai aur page ko poori tarah hide kar deta hai. Feature flag ek enabled module ke andar zyada fine control hai. Role permission pehle se enabled kisi cheez tak per-user access hai.",
    ),
}


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 FEATURE_FLAGS.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(FEATURE_FLAGS)} feature-flags keys.")


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