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

Usage: docker compose exec api python seed_translations_pageinfo_custodian_dashboard.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)
CUSTODIAN_DASHBOARD = {
    "custodian-dashboard.title": (
        "Custodian Dashboard",
        "कस्टोडियन डैशबोर्ड",
        "कस्टोडियन डॅशबोर्ड",
        "Custodian Dashboard",
    ),
    "custodian-dashboard.subtitle": (
        "Your custody workload at a glance",
        "एक नज़र में आपका custody कार्यभार",
        "एका दृष्टीक्षेपात तुमचा custody कार्यभार",
        "Ek nazar mein aapka custody workload",
    ),
    "custodian-dashboard.body.0": (
        "Your assigned assets, pending transfers, and outstanding acknowledgements.",
        "आपको सौंपे गए assets, लंबित transfers, और बकाया acknowledgements।",
        "तुम्हाला नियुक्त केलेल्या assets, प्रलंबित transfers, आणि प्रलंबित acknowledgements.",
        "Aapko assign kiye gaye assets, pending transfers, aur outstanding acknowledgements.",
    ),
    "custodian-dashboard.body.1": (
        "Click any card to see its records below.",
        "नीचे रिकॉर्ड देखने के लिए किसी भी card पर क्लिक करें।",
        "खाली records पाहण्यासाठी कोणत्याही card वर क्लिक करा.",
        "Neeche records dekhne ke liye kisi bhi card par click karein.",
    ),
    "custodian-dashboard.stepsHeading": (
        "Life of an asset in your custody",
        "आपकी custody में asset का जीवनचक्र",
        "तुमच्या custody मधील asset चे जीवनचक्र",
        "Aapki custody mein asset ki life",
    ),
    "custodian-dashboard.steps.0.label": ("Assigned", "सौंपा गया", "नियुक्त", "Assigned"),
    "custodian-dashboard.steps.0.caption": (
        "An Asset Manager assigns an asset to you — it lands in Pending Acceptance.",
        "एक Asset Manager आपको एक asset सौंपता है — यह Pending Acceptance में आता है।",
        "एक Asset Manager तुम्हाला एक asset नियुक्त करतो — ते Pending Acceptance मध्ये येते.",
        "Ek Asset Manager aapko ek asset assign karta hai — ye Pending Acceptance mein land hota hai.",
    ),
    "custodian-dashboard.steps.1.label": ("Accepted", "स्वीकृत", "स्वीकृत", "Accepted"),
    "custodian-dashboard.steps.1.caption": (
        "You accept it, and it moves to Active Assets in Custody.",
        "आप इसे स्वीकार करते हैं, और यह Active Assets in Custody में चला जाता है।",
        "तुम्ही ते स्वीकारता, आणि ते Active Assets in Custody मध्ये जाते.",
        "Aap ise accept karte hain, aur ye Active Assets in Custody mein move ho jaata hai.",
    ),
    "custodian-dashboard.steps.2.label": ("Transfer In", "Transfer इन", "Transfer इन", "Transfer In"),
    "custodian-dashboard.steps.2.caption": (
        "If someone transfers an asset to you, it waits under Pending Transfers to Me until you accept.",
        "यदि कोई आपको एक asset transfer करता है, तो वह आपके स्वीकार करने तक Pending Transfers to Me के अंतर्गत प्रतीक्षा करता है।",
        "जर कोणी तुम्हाला एखादी asset transfer केली, तर ती तुम्ही स्वीकारेपर्यंत Pending Transfers to Me अंतर्गत प्रतीक्षा करते.",
        "Agar koi aapko ek asset transfer karta hai, to wo aapke accept karne tak Pending Transfers to Me ke under wait karta hai.",
    ),
    "custodian-dashboard.steps.3.label": ("Acknowledged", "स्वीकृति दी गई", "स्वीकृती दिली", "Acknowledged"),
    "custodian-dashboard.steps.3.caption": (
        "Periodically you must re-confirm you still hold it, tracked under Acknowledgements Due.",
        "समय-समय पर आपको फिर से पुष्टि करनी होती है कि यह अभी भी आपके पास है, जिसे Acknowledgements Due के अंतर्गत ट्रैक किया जाता है।",
        "वेळोवेळी तुम्हाला पुन्हा पुष्टी करावी लागते की ते अजूनही तुमच्याकडे आहे, जे Acknowledgements Due अंतर्गत ट्रॅक केले जाते.",
        "Periodically aapko phir se confirm karna hota hai ki ye abhi bhi aapke paas hai, jo Acknowledgements Due ke under track hota hai.",
    ),
    "custodian-dashboard.fieldRules.0.name": ("Asset ID", "Asset ID", "Asset ID", "Asset ID"),
    "custodian-dashboard.fieldRules.0.description": (
        "Unique reference code (asset_ref) for the asset in each row.",
        "प्रत्येक row में asset के लिए अद्वितीय reference code (asset_ref)।",
        "प्रत्येक row मधील asset साठी अद्वितीय reference code (asset_ref).",
        "Har row mein asset ke liye unique reference code (asset_ref).",
    ),
    "custodian-dashboard.fieldRules.1.name": ("Status", "स्थिति", "स्थिती", "Status"),
    "custodian-dashboard.fieldRules.1.description": (
        "Current custody state — active, pending_acceptance, or pending transfer.",
        "वर्तमान custody स्थिति — active, pending_acceptance, या pending transfer।",
        "सद्य custody स्थिती — active, pending_acceptance, किंवा pending transfer.",
        "Current custody state — active, pending_acceptance, ya pending transfer.",
    ),
    "custodian-dashboard.fieldRules.2.name": ("Since / Accepted", "से / स्वीकृत", "पासून / स्वीकृत", "Since / Accepted"),
    "custodian-dashboard.fieldRules.2.description": (
        "Effective-from date the assignment started, and when you actually accepted it.",
        "वह effective-from तारीख जब assignment शुरू हुआ, और जब आपने वास्तव में इसे स्वीकार किया।",
        "assignment सुरू झाल्याची effective-from तारीख, आणि तुम्ही प्रत्यक्षात ते कधी स्वीकारले.",
        "Wo effective-from date jab assignment start hua, aur jab aapne actually ise accept kiya.",
    ),
    "custodian-dashboard.fieldRules.3.name": ("From", "से", "कडून", "From"),
    "custodian-dashboard.fieldRules.3.description": (
        "The current custodian handing the asset over, shown only on Pending Transfers to Me.",
        "वर्तमान custodian जो asset सौंप रहा है, यह केवल Pending Transfers to Me पर दिखाया जाता है।",
        "सध्याचा custodian जो asset सुपूर्द करत आहे, हे फक्त Pending Transfers to Me वर दाखवले जाते.",
        "Current custodian jo asset hand over kar raha hai, ye sirf Pending Transfers to Me par dikhta hai.",
    ),
    "custodian-dashboard.tip.title": (
        "Acknowledgements are view-only here",
        "यहाँ Acknowledgements केवल देखने के लिए हैं",
        "येथे Acknowledgements फक्त पाहण्यासाठी आहेत",
        "Yahan Acknowledgements sirf view-only hain",
    ),
    "custodian-dashboard.tip.body": (
        "The Acknowledgements Due card only lists what's outstanding — it can't confirm anything. Use the 'Clear Acknowledgements' shortcut below to actually acknowledge, and refresh the dashboard afterwards since these counts are a snapshot from page-load.",
        "Acknowledgements Due card केवल यह सूचीबद्ध करता है कि क्या बकाया है — यह कुछ भी पुष्ट नहीं कर सकता। वास्तव में acknowledge करने के लिए नीचे दिए गए 'Clear Acknowledgements' शॉर्टकट का उपयोग करें, और बाद में dashboard को रिफ्रेश करें क्योंकि ये counts page-load के समय का एक snapshot हैं।",
        "Acknowledgements Due card फक्त काय प्रलंबित आहे याची यादी देते — ते काहीही पुष्टी करू शकत नाही. प्रत्यक्षात acknowledge करण्यासाठी खालील 'Clear Acknowledgements' शॉर्टकट वापरा, आणि नंतर dashboard रिफ्रेश करा कारण हे counts page-load वेळचे एक snapshot आहेत.",
        "Acknowledgements Due card sirf ye list karta hai ki kya outstanding hai — ye kuch bhi confirm nahi kar sakta. Actually acknowledge karne ke liye neeche diye gaye 'Clear Acknowledgements' shortcut ka use karein, aur baad mein dashboard refresh karein kyunki ye counts page-load ke time ka ek snapshot hain.",
    ),
}


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 CUSTODIAN_DASHBOARD.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(CUSTODIAN_DASHBOARD)} custodian-dashboard keys.")


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