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

Usage: docker compose exec api python seed_translations_pageinfo_dashboard_config.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)
DASHBOARD_CONFIG = {
    "dashboard-config.title": (
        "Dashboard Configuration",
        "डैशबोर्ड कॉन्फ़िगरेशन",
        "डॅशबोर्ड कॉन्फिगरेशन",
        "Dashboard Configuration",
    ),
    "dashboard-config.subtitle": (
        "Personalize which KPIs, charts and widgets appear on your Executive Dashboard.",
        "अपने Executive Dashboard पर कौन-से KPI, चार्ट और विजेट दिखें, इसे अपनी पसंद के अनुसार सेट करें।",
        "तुमच्या Executive Dashboard वर कोणते KPI, charts आणि widgets दिसतील हे तुमच्या आवडीनुसार सेट करा.",
        "Apne Executive Dashboard par kaunse KPIs, charts aur widgets dikhein, wo personalize karein.",
    ),
    "dashboard-config.body.0": (
        "Personalize your executive dashboard layout.",
        "अपने executive dashboard के लेआउट को अपनी पसंद के अनुसार बनाएं।",
        "तुमच्या executive dashboard चा लेआउट तुमच्या आवडीनुसार तयार करा.",
        "Apne executive dashboard ka layout personalize karein.",
    ),
    "dashboard-config.body.1": (
        "Choose your KPI cards and charts, set a default landing screen, and reorder widgets — the Live Preview panel updates as you go.",
        "अपने KPI कार्ड्स और चार्ट चुनें, एक डिफ़ॉल्ट लैंडिंग स्क्रीन सेट करें, और widgets को फिर से क्रमबद्ध करें — Live Preview पैनल आपके बदलावों के साथ अपडेट होता रहता है।",
        "तुमची KPI cards आणि charts निवडा, एक डीफॉल्ट लँडिंग स्क्रीन सेट करा आणि widgets पुन्हा क्रमवारीत लावा — Live Preview panel तुम्ही बदल करताच अपडेट होते.",
        "Apne KPI cards aur charts choose karein, ek default landing screen set karein, aur widgets ko reorder karein — Live Preview panel aapke changes ke saath update hota rehta hai.",
    ),
    "dashboard-config.body.2": (
        "Saved to this browser.",
        "यह इसी ब्राउज़र में सेव होता है।",
        "हे याच ब्राउझरमध्ये सेव्ह होते.",
        "Ye isi browser mein save hota hai.",
    ),
    "dashboard-config.stepsHeading": (
        "How configuration flows",
        "कॉन्फ़िगरेशन कैसे काम करता है",
        "कॉन्फिगरेशन कसे कार्य करते",
        "Configuration kaise flow karta hai",
    ),
    "dashboard-config.steps.0.label": (
        "Pick KPIs & Charts",
        "KPI और चार्ट चुनें",
        "KPIs आणि charts निवडा",
        "KPIs & Charts pick karein",
    ),
    "dashboard-config.steps.0.caption": (
        "Check the KPI cards and charts you want visible.",
        "जो KPI कार्ड और चार्ट दिखाना चाहते हैं, उन्हें चेक करें।",
        "तुम्हाला दृश्यमान हवे असलेले KPI cards आणि charts चेक करा.",
        "Jo KPI cards aur charts visible chahiye, unhe check karein.",
    ),
    "dashboard-config.steps.1.label": (
        "Set Landing & Order",
        "लैंडिंग और क्रम सेट करें",
        "लँडिंग आणि क्रम सेट करा",
        "Landing & Order set karein",
    ),
    "dashboard-config.steps.1.caption": (
        "Choose the default landing screen and reorder widgets.",
        "डिफ़ॉल्ट लैंडिंग स्क्रीन चुनें और widgets को फिर से क्रमबद्ध करें।",
        "डीफॉल्ट लँडिंग स्क्रीन निवडा आणि widgets पुन्हा क्रमवारीत लावा.",
        "Default landing screen choose karein aur widgets ko reorder karein.",
    ),
    "dashboard-config.steps.2.label": (
        "Check Live Preview",
        "Live Preview जांचें",
        "Live Preview तपासा",
        "Live Preview check karein",
    ),
    "dashboard-config.steps.2.caption": (
        "Confirm the layout looks right before committing.",
        "commit करने से पहले पुष्टि करें कि लेआउट सही दिख रहा है।",
        "commit करण्यापूर्वी लेआउट बरोबर दिसत आहे याची खात्री करा.",
        "Commit karne se pehle confirm karein ki layout sahi dikh raha hai.",
    ),
    "dashboard-config.steps.3.label": (
        "Save or Reset",
        "सेव करें या रीसेट करें",
        "सेव्ह करा किंवा रीसेट करा",
        "Save ya Reset karein",
    ),
    "dashboard-config.steps.3.caption": (
        "Save writes to this browser; Reset restores defaults.",
        "Save इसी ब्राउज़र में डेटा लिखता है; Reset डिफ़ॉल्ट सेटिंग्स वापस कर देता है।",
        "Save याच ब्राउझरमध्ये डेटा लिहितो; Reset डीफॉल्ट सेटिंग्ज परत आणते.",
        "Save isi browser mein data likhta hai; Reset defaults wapas restore karta hai.",
    ),
    "dashboard-config.fieldRules.0.name": (
        "KPI Card Ribbon Selection",
        "KPI कार्ड रिबन चयन",
        "KPI Card Ribbon निवड",
        "KPI Card Ribbon Selection",
    ),
    "dashboard-config.fieldRules.0.description": (
        "Multi-select checkboxes controlling which KPI cards appear in the dashboard ribbon.",
        "Multi-select चेकबॉक्स जो नियंत्रित करते हैं कि dashboard रिबन में कौन-से KPI कार्ड दिखेंगे।",
        "Multi-select checkboxes जे नियंत्रित करतात की dashboard ribbon मध्ये कोणती KPI cards दिसतील.",
        "Multi-select checkboxes jo control karte hain ki dashboard ribbon mein kaunse KPI cards dikhenge.",
    ),
    "dashboard-config.fieldRules.1.name": (
        "Active Main Charts",
        "सक्रिय मुख्य चार्ट",
        "सक्रिय मुख्य Charts",
        "Active Main Charts",
    ),
    "dashboard-config.fieldRules.1.description": (
        "Toggle which analytical charts render in the main dashboard area.",
        "टॉगल करें कि मुख्य dashboard क्षेत्र में कौन-से analytical चार्ट रेंडर होंगे।",
        "मुख्य dashboard भागात कोणते analytical charts रेंडर होतील ते टॉगल करा.",
        "Toggle karein ki main dashboard area mein kaunse analytical charts render honge.",
    ),
    "dashboard-config.fieldRules.2.name": (
        "Default Landing Screen",
        "डिफ़ॉल्ट लैंडिंग स्क्रीन",
        "डीफॉल्ट लँडिंग स्क्रीन",
        "Default Landing Screen",
    ),
    "dashboard-config.fieldRules.2.description": (
        "Dropdown deciding which dashboard view opens first after login.",
        "Dropdown तय करता है कि लॉगिन के बाद सबसे पहले कौन-सा dashboard व्यू खुलेगा।",
        "Login नंतर सर्वप्रथम कोणते dashboard view उघडेल हे Dropdown ठरवते.",
        "Dropdown decide karta hai ki login ke baad sabse pehle kaunsa dashboard view khulega.",
    ),
    "dashboard-config.fieldRules.3.name": (
        "Widget Layout Order",
        "विजेट लेआउट क्रम",
        "Widget Layout क्रम",
        "Widget Layout Order",
    ),
    "dashboard-config.fieldRules.3.description": (
        "Up/down arrows reorder the KPI ribbon, charts, activity log and quick-action tray.",
        "ऊपर/नीचे तीर KPI रिबन, चार्ट, activity log और quick-action tray को फिर से क्रमबद्ध करते हैं।",
        "वर/खाली बाण KPI ribbon, charts, activity log आणि quick-action tray पुन्हा क्रमवारीत लावतात.",
        "Up/down arrows KPI ribbon, charts, activity log aur quick-action tray ko reorder karte hain.",
    ),
    "dashboard-config.fieldRules.4.name": (
        "Weekly Summary Digests",
        "साप्ताहिक सारांश डाइजेस्ट",
        "साप्ताहिक सारांश Digests",
        "Weekly Summary Digests",
    ),
    "dashboard-config.fieldRules.4.description": (
        "Toggle preference only — no email is actually sent yet.",
        "केवल preference टॉगल है — फ़िलहाल कोई email वास्तव में नहीं भेजी जाती।",
        "फक्त preference टॉगल आहे — सध्या प्रत्यक्षात कोणतीही email पाठवली जात नाही.",
        "Sirf preference toggle hai — abhi actually koi email send nahi hoti.",
    ),
    "dashboard-config.tip.title": (
        "Local to this browser",
        "इसी ब्राउज़र तक सीमित",
        "फक्त याच ब्राउझरपुरते मर्यादित",
        "Sirf isi browser tak local",
    ),
    "dashboard-config.tip.body": (
        "There is no server-side dashboard-preferences endpoint — Save writes to this browser's localStorage only. Switching devices or clearing site data resets you to defaults, and the Weekly Summary Digests toggle doesn't actually send any email.",
        "इसके लिए कोई server-side dashboard-preferences endpoint नहीं है — Save केवल इसी ब्राउज़र के localStorage में लिखता है। डिवाइस बदलने या site data क्लियर करने पर आप डिफ़ॉल्ट सेटिंग्स पर वापस चले जाते हैं, और Weekly Summary Digests टॉगल वास्तव में कोई email नहीं भेजता।",
        "यासाठी कोणताही server-side dashboard-preferences endpoint नाही — Save फक्त याच ब्राउझरच्या localStorage मध्ये लिहितो. डिव्हाइस बदलल्यास किंवा site data क्लिअर केल्यास तुम्ही डीफॉल्ट सेटिंग्जवर परत जाता, आणि Weekly Summary Digests टॉगल प्रत्यक्षात कोणतीही email पाठवत नाही.",
        "Iske liye koi server-side dashboard-preferences endpoint nahi hai — Save sirf isi browser ke localStorage mein likhta hai. Device switch karne ya site data clear karne par aap defaults par wapas chale jaate hain, aur Weekly Summary Digests toggle actually koi email send nahi karta.",
    ),
}


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 DASHBOARD_CONFIG.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(DASHBOARD_CONFIG)} dashboard-config keys.")


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