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

Usage: docker compose exec api python seed_translations_pageinfo_roles_edit.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)
ROLES_EDIT = {
    "roles-edit.title": (
        "Edit Security Role",
        "सुरक्षा रोल संपादित करें",
        "सुरक्षा रोल संपादित करा",
        "Security Role Edit karein",
    ),
    "roles-edit.subtitle": (
        "Update role details, status, and permission grants",
        "रोल विवरण, स्थिति और परमिशन ग्रांट्स अपडेट करें",
        "रोल तपशील, स्थिती आणि परमिशन ग्रांट्स अपडेट करा",
        "Role details, status, aur permission grants update karein",
    ),
    "roles-edit.body.0": (
        "Update a role's name, description, active status, and the permissions it grants. The system identifier and role type (System vs Custom) are fixed once the role is created.",
        "किसी रोल का नाम, विवरण, सक्रिय स्थिति और उसके द्वारा दी गई परमिशन्स अपडेट करें। एक बार रोल बन जाने पर सिस्टम आइडेंटिफायर और रोल टाइप (System बनाम Custom) तय हो जाते हैं और फिर बदले नहीं जा सकते।",
        "एखाद्या रोलचे नाव, वर्णन, सक्रिय स्थिती आणि त्याद्वारे दिल्या जाणाऱ्या परमिशन्स अपडेट करा. एकदा रोल तयार झाल्यावर सिस्टम आयडेंटिफायर आणि रोल टाइप (System विरुद्ध Custom) निश्चित होतात आणि नंतर बदलता येत नाहीत.",
        "Kisi role ka naam, description, active status, aur usse milne wali permissions update karein. Role create hone ke baad system identifier aur role type (System vs Custom) fixed ho jaate hain, phir badle nahi ja sakte.",
    ),
    "roles-edit.body.1": (
        "Users are not assigned to a role from here — the Assigned Users list on the right is a read-only preview of who currently holds it.",
        "यहाँ से users को रोल असाइन नहीं किया जाता — दाईं ओर की Assigned Users सूची केवल यह देखने के लिए एक read-only प्रीव्यू है कि फिलहाल यह रोल किसके पास है।",
        "येथून users ला रोल नियुक्त केला जात नाही — उजवीकडील Assigned Users यादी ही फक्त हे पाहण्यासाठी एक read-only प्रिव्ह्यू आहे की सध्या हा रोल कोणाकडे आहे.",
        "Yahan se users ko role assign nahi kiya jaata — right side ki Assigned Users list sirf ek read-only preview hai ki abhi ye role kiske paas hai.",
    ),
    "roles-edit.stepsHeading": (
        "How editing works",
        "एडिटिंग कैसे काम करती है",
        "एडिटिंग कशी कार्य करते",
        "Editing kaise kaam karti hai",
    ),
    "roles-edit.steps.0.label": ("Review Details", "विवरण जाँचें", "तपशील तपासा", "Details Review karein"),
    "roles-edit.steps.0.caption": (
        "Edit name, description, and status; System roles lock name and type.",
        "नाम, विवरण और स्थिति संपादित करें; System roles में नाम और टाइप लॉक रहते हैं।",
        "नाव, वर्णन आणि स्थिती संपादित करा; System roles मध्ये नाव आणि टाइप लॉक असतात.",
        "Naam, description, aur status edit karein; System roles mein naam aur type lock rehte hain.",
    ),
    "roles-edit.steps.1.label": ("Adjust Permissions", "परमिशन्स समायोजित करें", "परमिशन्स समायोजित करा", "Permissions Adjust karein"),
    "roles-edit.steps.1.caption": (
        "Check individual permissions or toggle a whole module; search to filter.",
        "अलग-अलग परमिशन्स चेक करें या पूरे मॉड्यूल को टॉगल करें; फ़िल्टर करने के लिए सर्च करें।",
        "वैयक्तिक परमिशन्स चेक करा किंवा संपूर्ण मॉड्यूल टॉगल करा; फिल्टर करण्यासाठी सर्च करा.",
        "Individual permissions check karein ya poore module ko toggle karein; filter karne ke liye search karein.",
    ),
    "roles-edit.steps.2.label": ("Update Profile", "प्रोफाइल अपडेट करें", "प्रोफाइल अपडेट करा", "Profile Update karein"),
    "roles-edit.steps.2.caption": (
        "Saves the role in one call — this also overwrites its permission set.",
        "यह रोल को एक ही कॉल में सेव करता है — इससे इसका परमिशन सेट भी overwrite हो जाता है।",
        "हे रोलला एकाच कॉलमध्ये सेव्ह करते — यामुळे त्याचा परमिशन सेट देखील overwrite होतो.",
        "Ye role ko ek hi call mein save karta hai — isse iska permission set bhi overwrite ho jaata hai.",
    ),
    "roles-edit.steps.3.label": ("Revert", "पूर्ववत करें", "पूर्ववत करा", "Revert karein"),
    "roles-edit.steps.3.caption": (
        "Discards unsaved edits and reloads the values last fetched from the server.",
        "असेव्ड बदलावों को छोड़ देता है और सर्वर से आखिरी बार फ़ेच की गई वैल्यूज़ को फिर से लोड करता है।",
        "न सेव्ह केलेले बदल टाकून देते आणि सर्व्हरवरून शेवटच्या वेळी फेच केलेल्या व्हॅल्यूज पुन्हा लोड करते.",
        "Unsaved edits discard kar deta hai aur server se last fetch ki gayi values ko dobara reload karta hai.",
    ),
    "roles-edit.fieldRules.0.name": ("Role Name", "रोल नाम", "रोल नाव", "Role Name"),
    "roles-edit.fieldRules.0.description": (
        "Display name for the role; cannot be blank.",
        "रोल के लिए डिस्प्ले नाम; खाली नहीं हो सकता।",
        "रोलसाठी डिस्प्ले नाव; रिकामे राहू शकत नाही.",
        "Role ke liye display naam; blank nahi ho sakta.",
    ),
    "roles-edit.fieldRules.1.name": ("Functional Description", "फंक्शनल विवरण", "फंक्शनल वर्णन", "Functional Description"),
    "roles-edit.fieldRules.1.description": (
        "Plain-English summary of what the role is for.",
        "सरल भाषा में सारांश कि यह रोल किसलिए है।",
        "सोप्या भाषेत सारांश की हा रोल कशासाठी आहे.",
        "Plain-English summary ki ye role kis liye hai.",
    ),
    "roles-edit.fieldRules.2.name": ("Role Status", "रोल स्थिति", "रोल स्थिती", "Role Status"),
    "roles-edit.fieldRules.2.description": (
        "Active roles apply their permissions; Inactive roles are suspended.",
        "Active रोल अपनी परमिशन्स लागू करते हैं; Inactive रोल निलंबित रहते हैं।",
        "Active roles त्यांच्या परमिशन्स लागू करतात; Inactive roles निलंबित असतात.",
        "Active roles apni permissions apply karte hain; Inactive roles suspended rehte hain.",
    ),
    "roles-edit.fieldRules.3.name": ("Permissions", "परमिशन्स", "परमिशन्स", "Permissions"),
    "roles-edit.fieldRules.3.description": (
        "Grants checked here replace the role's entire permission set on save — not merged.",
        "यहाँ चेक की गई ग्रांट्स सेव करने पर रोल के पूरे परमिशन सेट की जगह ले लेती हैं — merge नहीं होतीं।",
        "येथे चेक केलेल्या ग्रांट्स सेव्ह केल्यावर रोलच्या संपूर्ण परमिशन सेटची जागा घेतात — merge होत नाहीत.",
        "Yahan check ki gayi grants save karne par role ke poore permission set ki jagah le leti hain — merge nahi hoti.",
    ),
    "roles-edit.fieldRules.4.name": ("Role Profile Type", "रोल प्रोफाइल प्रकार", "रोल प्रोफाइल प्रकार", "Role Profile Type"),
    "roles-edit.fieldRules.4.description": (
        "System vs Custom; read-only, set only at creation and never editable here.",
        "System बनाम Custom; यह read-only है, केवल creation के समय सेट होता है और यहाँ कभी संपादित नहीं किया जा सकता।",
        "System विरुद्ध Custom; हे read-only आहे, फक्त creation च्या वेळी सेट होते आणि येथे कधीही संपादित करता येत नाही.",
        "System vs Custom; ye read-only hai, sirf creation ke time set hota hai aur yahan kabhi edit nahi kiya ja sakta.",
    ),
    "roles-edit.tip.title": (
        "Save replaces, it doesn't merge",
        "सेव रिप्लेस करता है, मर्ज नहीं",
        "सेव्ह रिप्लेस करते, मर्ज करत नाही",
        "Save replace karta hai, merge nahi",
    ),
    "roles-edit.tip.body": (
        "Update Profile sends whatever is currently checked as the role's complete permission list. If you unchecked something while testing and forgot to recheck it, saving removes it for every user with this role — use Revert Changes first if you're unsure.",
        "Update Profile जो कुछ भी फिलहाल चेक किया गया है उसे रोल की पूरी परमिशन लिस्ट के रूप में भेजता है। अगर आपने टेस्टिंग के दौरान कुछ अनचेक किया और फिर से चेक करना भूल गए, तो सेव करने पर वह इस रोल वाले हर user के लिए हट जाएगा — अगर निश्चित न हों तो पहले Revert Changes का उपयोग करें।",
        "Update Profile सध्या जे काही चेक केलेले आहे ते रोलची संपूर्ण परमिशन यादी म्हणून पाठवते. जर तुम्ही टेस्टिंग करताना काही अनचेक केले आणि पुन्हा चेक करायला विसरलात, तर सेव्ह केल्यावर ते या रोल असलेल्या प्रत्येक user साठी काढून टाकले जाईल — खात्री नसल्यास आधी Revert Changes वापरा.",
        "Update Profile abhi jo bhi checked hai use role ki poori permission list ke roop mein bhejta hai. Agar aapne testing ke dauraan kuch uncheck kiya aur dobara check karna bhool gaye, to save karne par wo is role wale har user ke liye remove ho jaayega — agar sure na ho to pehle Revert Changes use karein.",
    ),
}


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 ROLES_EDIT.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(ROLES_EDIT)} roles-edit keys.")


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