"""One-off seed: registers translation_keys + hi/mr/hinglish translation_values
for the "dynamic-fields" PageInfoButton content (Dynamic Fields & Forms page).

Usage: docker compose exec api python seed_translations_pageinfo_dynamic_fields.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)
DYNAMIC_FIELDS = {
    "dynamic-fields.title": (
        "Dynamic Fields & Forms",
        "डायनेमिक फ़ील्ड्स और फ़ॉर्म्स",
        "डायनॅमिक फील्ड्स आणि फॉर्म्स",
        "Dynamic Fields aur Forms",
    ),
    "dynamic-fields.subtitle": (
        "How this register works and what each field controls",
        "यह रजिस्टर कैसे काम करता है और प्रत्येक फ़ील्ड क्या नियंत्रित करती है",
        "हे रजिस्टर कसे कार्य करते आणि प्रत्येक फील्ड काय नियंत्रित करते",
        "Ye register kaise kaam karta hai aur har field kya control karti hai",
    ),
    "dynamic-fields.body.0": (
        "Add tenant-specific fields to a module (e.g. warranty vendor, GIS code) without a code change. Rules control whether a field is mandatory, hidden, read-only, or shown conditionally.",
        "बिना कोई कोड बदले किसी मॉड्यूल में टेनेंट-विशिष्ट फ़ील्ड जोड़ें (जैसे वारंटी वेंडर, GIS कोड)। नियम यह नियंत्रित करते हैं कि कोई फ़ील्ड अनिवार्य है, छिपी हुई है, केवल-पढ़ने योग्य है, या सशर्त रूप से दिखाई जाती है।",
        "कोणताही कोड बदल न करता मॉड्यूलमध्ये टेनंट-विशिष्ट फील्ड्स जोडा (उदा. वॉरंटी वेंडर, GIS कोड). नियम हे नियंत्रित करतात की एखादी फील्ड अनिवार्य आहे, लपवलेली आहे, फक्त-वाचनीय आहे, की सशर्तपणे दाखवली जाते.",
        "Kisi module mein tenant-specific fields add karein (jaise warranty vendor, GIS code) bina koi code change kiye. Rules control karte hain ki field mandatory hai, hidden hai, read-only hai, ya conditionally show hoti hai.",
    ),
    "dynamic-fields.stepsHeading": (
        "How a custom field goes live",
        "एक कस्टम फ़ील्ड कैसे लाइव होती है",
        "एक कस्टम फील्ड कशी लाइव्ह होते",
        "Ek custom field kaise live hoti hai",
    ),
    "dynamic-fields.steps.0.label": (
        "Define",
        "परिभाषित करें",
        "व्याख्या करा",
        "Define karein",
    ),
    "dynamic-fields.steps.0.caption": (
        "Module + field type",
        "मॉड्यूल + फ़ील्ड प्रकार",
        "मॉड्यूल + फील्ड प्रकार",
        "Module + field type",
    ),
    "dynamic-fields.steps.1.label": (
        "Add rules",
        "नियम जोड़ें",
        "नियम जोडा",
        "Rules add karein",
    ),
    "dynamic-fields.steps.1.caption": (
        "Mandatory, hidden...",
        "अनिवार्य, छिपा हुआ...",
        "अनिवार्य, लपवलेले...",
        "Mandatory, hidden...",
    ),
    "dynamic-fields.steps.2.label": (
        "On the form",
        "फ़ॉर्म पर",
        "फॉर्मवर",
        "Form par",
    ),
    "dynamic-fields.steps.2.caption": (
        "Appears for that module",
        "उस मॉड्यूल के लिए दिखाई देता है",
        "त्या मॉड्यूलसाठी दिसते",
        "Us module ke liye appear hota hai",
    ),
    "dynamic-fields.steps.3.label": (
        "Bulk import",
        "बल्क इम्पोर्ट",
        "बल्क इम्पोर्ट",
        "Bulk import",
    ),
    "dynamic-fields.steps.3.caption": (
        "Backfill values",
        "मान बैकफ़िल करें",
        "व्हॅल्यूज बॅकफिल करा",
        "Values backfill karein",
    ),
    "dynamic-fields.fieldRules.0.name": (
        "Module",
        "मॉड्यूल",
        "मॉड्यूल",
        "Module",
    ),
    "dynamic-fields.fieldRules.0.description": (
        "Which screen this field appears on, e.g. asset, ticket.",
        "यह फ़ील्ड किस स्क्रीन पर दिखाई देती है, जैसे एसेट, टिकट।",
        "ही फील्ड कोणत्या स्क्रीनवर दिसते, उदा. asset, ticket.",
        "Ye field kis screen par appear hoti hai, jaise asset, ticket.",
    ),
    "dynamic-fields.fieldRules.1.name": (
        "Field Name",
        "फ़ील्ड नाम",
        "फील्ड नाव",
        "Field Name",
    ),
    "dynamic-fields.fieldRules.1.description": (
        "Internal snake_case identifier — used in exports and the API.",
        "आंतरिक snake_case पहचानकर्ता — एक्सपोर्ट और API में उपयोग होता है।",
        "अंतर्गत snake_case ओळखकर्ता — एक्सपोर्ट्स आणि API मध्ये वापरला जातो.",
        "Internal snake_case identifier — exports aur API mein use hota hai.",
    ),
    "dynamic-fields.fieldRules.2.name": (
        "Field Type",
        "फ़ील्ड प्रकार",
        "फील्ड प्रकार",
        "Field Type",
    ),
    "dynamic-fields.fieldRules.2.description": (
        "Text, number, date, dropdown, file upload, and more.",
        "टेक्स्ट, संख्या, तारीख, ड्रॉपडाउन, फ़ाइल अपलोड, और अन्य।",
        "टेक्स्ट, नंबर, तारीख, ड्रॉपडाउन, फाइल अपलोड आणि इतर.",
        "Text, number, date, dropdown, file upload, aur bhi bahut kuch.",
    ),
    "dynamic-fields.tip.title": (
        "Rule types",
        "नियम प्रकार",
        "नियम प्रकार",
        "Rule types",
    ),
    "dynamic-fields.tip.body": (
        "Mandatory blocks save until filled; Hidden removes it from the form; Read Only shows it without editing; Conditional shows it only when another field matches.",
        "अनिवार्य (Mandatory) भरे जाने तक सेव को रोकता है; छिपा हुआ (Hidden) इसे फ़ॉर्म से हटा देता है; केवल-पढ़ने योग्य (Read Only) इसे बिना एडिट किए दिखाता है; सशर्त (Conditional) इसे तभी दिखाता है जब कोई अन्य फ़ील्ड मेल खाती हो।",
        "अनिवार्य (Mandatory) भरेपर्यंत सेव्ह अडवते; लपवलेले (Hidden) ते फॉर्ममधून काढून टाकते; फक्त-वाचनीय (Read Only) ते एडिट न करता दाखवते; सशर्त (Conditional) ते फक्त दुसरी फील्ड जुळल्यावरच दाखवते.",
        "Mandatory field bharne tak save block karta hai; Hidden ise form se hata deta hai; Read Only ise bina edit kiye dikhata hai; Conditional ise tabhi dikhata hai jab koi doosri field match kare.",
    ),
}


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 DYNAMIC_FIELDS.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(DYNAMIC_FIELDS)} dynamic-fields keys.")


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