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

Usage: docker compose exec api python seed_translations_pageinfo_asset_register.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)
ASSET_REGISTER = {
    "asset-register.title": (
        "Asset Register",
        "एसेट रजिस्टर",
        "एसेट रजिस्टर",
        "Asset Register",
    ),
    "asset-register.subtitle": (
        "The master list of every tracked asset, its lifecycle state, and where it lives",
        "हर ट्रैक किए गए asset की मास्टर सूची, उसकी lifecycle स्थिति, और वह कहाँ स्थित है",
        "प्रत्येक ट्रॅक केलेल्या asset ची मास्टर यादी, त्याची lifecycle स्थिती, आणि तो कुठे आहे",
        "Har track kiye gaye asset ki master list, uski lifecycle state, aur wo kahaan hai",
    ),
    "asset-register.body.0": (
        "Every asset the organization tracks, one row each, with its current lifecycle state, location, and class. The state tiles above the table are also filters — click one to narrow the register, click it again (or \"Clear filter\") to reset.",
        "संगठन द्वारा ट्रैक किए जाने वाले हर asset की एक-एक row यहाँ दिखाई जाती है, जिसमें उसकी वर्तमान lifecycle स्थिति, location और class शामिल हैं। table के ऊपर दिए गए state tiles filters का भी काम करते हैं — register को सीमित करने के लिए किसी एक tile पर क्लिक करें, और वापस पूरी सूची देखने के लिए उसी पर दोबारा क्लिक करें (या \"Clear filter\" चुनें)।",
        "संस्था ट्रॅक करत असलेल्या प्रत्येक asset ची एक-एक row येथे दाखवली जाते, ज्यात त्याची सध्याची lifecycle स्थिती, location आणि class समाविष्ट आहे. table वरील state tiles हे filters म्हणूनही काम करतात — register मर्यादित करण्यासाठी एखाद्या tile वर क्लिक करा, आणि पुन्हा मूळ यादीवर येण्यासाठी त्याच tile वर पुन्हा क्लिक करा (किंवा \"Clear filter\" निवडा).",
        "Organization jitne bhi assets track karta hai, unki ek-ek row yahan dikhti hai, saath mein current lifecycle state, location, aur class. Table ke upar wale state tiles filters bhi hain — register ko narrow karne ke liye kisi ek tile par click karein, aur wapas reset karne ke liye usi par dobara click karein (ya \"Clear filter\" use karein).",
    ),
    "asset-register.body.1": (
        "From here you can view or edit an asset, transfer custody, change its lifecycle state, or delete it (delete is only permitted once an asset has reached the disposed state).",
        "यहाँ से आप किसी asset को देख या edit कर सकते हैं, custody transfer कर सकते हैं, उसकी lifecycle स्थिति बदल सकते हैं, या उसे delete कर सकते हैं (delete की अनुमति तभी है जब asset disposed स्थिति तक पहुँच चुका हो)।",
        "येथून तुम्ही एखादी asset पाहू किंवा edit करू शकता, custody transfer करू शकता, तिची lifecycle स्थिती बदलू शकता, किंवा ती delete करू शकता (delete करण्याची परवानगी फक्त asset disposed स्थितीत पोहोचल्यावरच मिळते).",
        "Yahan se aap kisi asset ko view ya edit kar sakte hain, custody transfer kar sakte hain, uski lifecycle state change kar sakte hain, ya use delete kar sakte hain (delete tabhi allowed hai jab asset disposed state tak pahunch chuka ho).",
    ),
    "asset-register.stepsHeading": (
        "Lifecycle states, in order",
        "Lifecycle स्थितियाँ, क्रम में",
        "Lifecycle स्थिती, क्रमाने",
        "Lifecycle states, order mein",
    ),
    "asset-register.steps.0.label": ("Draft", "ड्राफ्ट", "ड्राफ्ट", "Draft"),
    "asset-register.steps.0.caption": (
        "Just registered, gets an AST-#### reference",
        "अभी-अभी रजिस्टर हुआ, इसे एक AST-#### reference मिलता है",
        "नुकतेच रजिस्टर झाले, याला एक AST-#### reference मिळतो",
        "Abhi-abhi register hua hai, isko ek AST-#### reference milta hai",
    ),
    "asset-register.steps.1.label": (
        "Pending Commissioning",
        "कमीशनिंग लंबित",
        "कमिशनिंग प्रलंबित",
        "Pending Commissioning",
    ),
    "asset-register.steps.1.caption": (
        "Awaiting Finance capitalization",
        "Finance capitalization की प्रतीक्षा में",
        "Finance capitalization ची प्रतीक्षा",
        "Finance capitalization ka wait ho raha hai",
    ),
    "asset-register.steps.2.label": (
        "Commissioned",
        "कमीशंड",
        "कमिशन्ड",
        "Commissioned",
    ),
    "asset-register.steps.2.caption": (
        "Capitalized, ready for custody",
        "Capitalized, custody के लिए तैयार",
        "Capitalized, custody साठी तयार",
        "Capitalized ho chuka hai, custody ke liye ready",
    ),
    "asset-register.steps.3.label": (
        "In Operation",
        "परिचालन में",
        "कार्यरत",
        "In Operation",
    ),
    "asset-register.steps.3.caption": (
        "Active and in use",
        "सक्रिय और उपयोग में",
        "सक्रिय आणि वापरात",
        "Active hai aur use ho raha hai",
    ),
    "asset-register.steps.4.label": (
        "Pending Disposal / Written Off / Disposed",
        "निपटान लंबित / राइट-ऑफ़ / निपटाया गया",
        "विल्हेवाट प्रलंबित / राइट-ऑफ / विल्हेवाट लावलेले",
        "Pending Disposal / Written Off / Disposed",
    ),
    "asset-register.steps.4.caption": (
        "End of life, requires dual sign-off",
        "जीवनकाल की समाप्ति, dual sign-off ज़रूरी है",
        "आयुष्यमानाचा शेवट, dual sign-off आवश्यक आहे",
        "End of life ho gaya hai, dual sign-off zaroori hai",
    ),
    "asset-register.fieldRules.0.name": ("Name", "नाम", "नाव", "Name"),
    "asset-register.fieldRules.0.description": (
        "Display name of the asset; required when it is created.",
        "asset का display name; बनाते समय अनिवार्य है।",
        "asset चे display name; तयार करताना आवश्यक आहे.",
        "Asset ka display name hai; create karte waqt required hota hai.",
    ),
    "asset-register.fieldRules.1.name": ("Asset ID", "Asset ID", "Asset ID", "Asset ID"),
    "asset-register.fieldRules.1.description": (
        "System-generated AST-#### reference; read-only.",
        "सिस्टम द्वारा जनरेट किया गया AST-#### reference; read-only है।",
        "सिस्टमने जनरेट केलेला AST-#### reference; read-only आहे.",
        "System-generated AST-#### reference hota hai; read-only hai.",
    ),
    "asset-register.fieldRules.2.name": ("Class", "Class", "Class", "Class"),
    "asset-register.fieldRules.2.description": (
        "Asset Class master; required, drives which category/sub-category and custom fields apply.",
        "Asset Class master; अनिवार्य है, यह तय करता है कि कौन-सी category/sub-category और custom fields लागू होंगी।",
        "Asset Class master; आवश्यक आहे, कोणती category/sub-category आणि custom fields लागू होतील हे हे ठरवते.",
        "Asset Class master hai; required hai, ye decide karta hai ki kaunsi category/sub-category aur custom fields apply hongi.",
    ),
    "asset-register.fieldRules.3.name": ("State", "State", "State", "State"),
    "asset-register.fieldRules.3.description": (
        "Read-only lifecycle badge; only changes through the Change Status action, never edited directly.",
        "Read-only lifecycle badge; यह केवल Change Status action के ज़रिए बदलता है, कभी सीधे edit नहीं होता।",
        "Read-only lifecycle badge; हे फक्त Change Status action द्वारे बदलते, कधीही थेट edit केले जात नाही.",
        "Read-only lifecycle badge hai; sirf Change Status action se change hota hai, kabhi directly edit nahi hota.",
    ),
    "asset-register.fieldRules.4.name": ("Location", "Location", "Location", "Location"),
    "asset-register.fieldRules.4.description": (
        "Required at creation; move an asset afterward using Transfer, not by editing this field.",
        "creation के समय अनिवार्य; बाद में asset को इस फ़ील्ड को edit करके नहीं, बल्कि Transfer का उपयोग करके स्थानांतरित करें।",
        "creation च्या वेळी आवश्यक; नंतर asset ला हे फील्ड edit करून नव्हे, तर Transfer वापरून हलवा.",
        "Creation ke time required hai; baad mein asset ko is field ko edit karke nahi, balki Transfer use karke move karein.",
    ),
    "asset-register.tip.title": (
        "State tiles double as filters",
        "State tiles फिल्टर के रूप में भी काम करते हैं",
        "State tiles filters म्हणूनही काम करतात",
        "State tiles filters ka bhi kaam karte hain",
    ),
    "asset-register.tip.body": (
        "Clicking a lifecycle-state tile filters the table by that state and combines with the Purchase Order filter — but picking a new tile replaces the previous state filter rather than adding to it. Use \"Clear filter\" to get back to the full register.",
        "किसी lifecycle-state tile पर क्लिक करने से table उस state के अनुसार filter होती है और Purchase Order filter के साथ combine हो जाती है — लेकिन कोई नया tile चुनने पर पिछला state filter जुड़ने के बजाय replace हो जाता है। पूरे register पर वापस जाने के लिए \"Clear filter\" का उपयोग करें।",
        "एखाद्या lifecycle-state tile वर क्लिक केल्याने table त्या state नुसार filter होते आणि Purchase Order filter सोबत combine होते — पण नवीन tile निवडल्यास आधीचा state filter जोडला न जाता replace होतो. संपूर्ण register वर परत जाण्यासाठी \"Clear filter\" वापरा.",
        "Kisi lifecycle-state tile par click karne se table us state ke hisaab se filter hoti hai aur Purchase Order filter ke saath combine ho jaati hai — lekin naya tile pick karne par purana state filter add nahi hota, balki replace ho jaata hai. Poore register par wapas jaane ke liye \"Clear filter\" 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 ASSET_REGISTER.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(ASSET_REGISTER)} asset-register keys.")


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