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

Usage: docker compose exec api python seed_translations_pageinfo_risk_assets.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)
RISK_ASSETS = {
    "risk-assets.title": (
        "Risk Assets",
        "रिस्क एसेट्स",
        "रिस्क एसेट्स",
        "Risk Assets",
    ),
    "risk-assets.subtitle": (
        "High-criticality assets flagged from the asset register",
        "asset register से चिह्नित उच्च-criticality वाले assets",
        "asset register मधून चिन्हांकित उच्च-criticality असलेले assets",
        "Asset register se flag kiye gaye high-criticality assets",
    ),
    "risk-assets.body.0": (
        "Lists every asset with a criticality score of 3 or higher, pulled from the same asset register the Executive Dashboard's top-risk widget uses – there is no separate risk-registry record type, so nothing here can be logged, mitigated, or transferred independently of the underlying asset.",
        "यह उन सभी assets को सूचीबद्ध करता है जिनका criticality score 3 या उससे अधिक है, जो उसी asset register से लिया गया है जिसे Executive Dashboard का top-risk widget उपयोग करता है – यहाँ कोई अलग risk-registry record type नहीं है, इसलिए यहाँ किसी भी चीज़ को अंतर्निहित asset से स्वतंत्र रूप से log, mitigate या transfer नहीं किया जा सकता।",
        "यामध्ये criticality score 3 किंवा त्याहून अधिक असलेल्या सर्व assets ची यादी दिली आहे, जी त्याच asset register मधून घेतली आहे ज्याचा वापर Executive Dashboard चा top-risk widget करतो – येथे स्वतंत्र risk-registry record type नाही, त्यामुळे येथील कोणतीही गोष्ट संबंधित asset पासून स्वतंत्रपणे log, mitigate किंवा transfer करता येत नाही.",
        "Ye un sabhi assets ko list karta hai jinka criticality score 3 ya usse zyada hai, jo usi asset register se liya gaya hai jise Executive Dashboard ka top-risk widget use karta hai – yahan koi separate risk-registry record type nahi hai, isliye yahan kuch bhi underlying asset se independent log, mitigate, ya transfer nahi kiya ja sakta.",
    ),
    "risk-assets.body.1": (
        "Use the severity filter and the summary cards to triage which assets need custodian follow-up or a closer look, then jump to the full asset record with the eye icon.",
        "यह तय करने के लिए severity filter और summary cards का उपयोग करें कि किन assets को custodian follow-up या करीबी नज़र की ज़रूरत है, फिर eye icon के ज़रिए पूरे asset record पर जाएँ।",
        "कोणत्या assets ना custodian follow-up किंवा बारकाईने पाहण्याची गरज आहे हे ठरवण्यासाठी severity filter आणि summary cards वापरा, नंतर eye icon द्वारे संपूर्ण asset record वर जा.",
        "Ye decide karne ke liye severity filter aur summary cards use karein ki kaunse assets ko custodian follow-up ya closer look chahiye, phir eye icon se full asset record par jaayein.",
    ),
    "risk-assets.stepsHeading": (
        "Severity tiers",
        "गंभीरता स्तर",
        "तीव्रता स्तर",
        "Severity tiers",
    ),
    "risk-assets.steps.0.label": ("Medium", "मध्यम", "मध्यम", "Medium"),
    "risk-assets.steps.0.caption": (
        "Criticality score = 3",
        "क्रिटिकैलिटी स्कोर = 3",
        "क्रिटिकॅलिटी स्कोअर = 3",
        "Criticality score = 3",
    ),
    "risk-assets.steps.1.label": ("High", "उच्च", "उच्च", "High"),
    "risk-assets.steps.1.caption": (
        "Criticality score = 4",
        "क्रिटिकैलिटी स्कोर = 4",
        "क्रिटिकॅलिटी स्कोअर = 4",
        "Criticality score = 4",
    ),
    "risk-assets.steps.2.label": ("Critical", "क्रिटिकल", "क्रिटिकल", "Critical"),
    "risk-assets.steps.2.caption": (
        "Criticality score ≥ 5",
        "क्रिटिकैलिटी स्कोर ≥ 5",
        "क्रिटिकॅलिटी स्कोअर ≥ 5",
        "Criticality score ≥ 5",
    ),
    "risk-assets.fieldRules.0.name": ("Severity", "गंभीरता", "तीव्रता", "Severity"),
    "risk-assets.fieldRules.0.description": (
        "Computed from the asset's criticality score, not a stored/editable field.",
        "asset के criticality score से गणना की जाती है, यह कोई stored/editable field नहीं है।",
        "asset च्या criticality score वरून काढले जाते, हे कोणतेही stored/editable field नाही.",
        "Asset ke criticality score se calculate hoti hai, ye koi stored/editable field nahi hai.",
    ),
    "risk-assets.fieldRules.1.name": ("Acquisition Cost", "अधिग्रहण लागत", "अधिग्रहण किंमत", "Acquisition Cost"),
    "risk-assets.fieldRules.1.description": (
        "Feeds the “Total Value at Risk” card; blank costs show as — and are excluded from the total.",
        "“Total Value at Risk” card में जोड़ा जाता है; खाली costs — के रूप में दिखते हैं और total में शामिल नहीं होते।",
        "“Total Value at Risk” कार्डमध्ये जोडले जाते; रिकाम्या costs — असे दिसतात आणि total मध्ये समाविष्ट होत नाहीत.",
        "“Total Value at Risk” card mein feed hoti hai; blank costs — ke roop mein dikhte hain aur total mein exclude ho jaate hain.",
    ),
    "risk-assets.fieldRules.2.name": ("Custodian", "कस्टोडियन", "कस्टोडियन", "Custodian"),
    "risk-assets.fieldRules.2.description": (
        "Shows “Unassigned” when no custodian is currently linked to the asset.",
        "जब asset से कोई custodian लिंक नहीं है, तो “Unassigned” दिखाता है।",
        "asset शी सध्या कोणताही custodian लिंक नसल्यास “Unassigned” दाखवते.",
        "Jab asset se koi custodian currently link nahi hai, to “Unassigned” dikhata hai.",
    ),
    "risk-assets.fieldRules.3.name": ("Lifecycle State", "लाइफसाइकिल स्टेट", "लाइफसायकल स्टेट", "Lifecycle State"),
    "risk-assets.fieldRules.3.description": (
        "Read-only asset lifecycle status (e.g. active, retired) shown for context, not filterable here.",
        "संदर्भ के लिए दिखाया गया read-only asset lifecycle status (जैसे active, retired), यहाँ filter नहीं किया जा सकता।",
        "संदर्भासाठी दाखवलेली read-only asset lifecycle status (उदा. active, retired), येथे filter करता येत नाही.",
        "Context ke liye dikhaya gaya read-only asset lifecycle status (jaise active, retired), yahan filter nahi kiya ja sakta.",
    ),
    "risk-assets.tip.title": (
        "Only the first 200 high-criticality assets load",
        "केवल पहले 200 high-criticality assets ही लोड होते हैं",
        "फक्त पहिले 200 high-criticality assets लोड होतात",
        "Sirf pehle 200 high-criticality assets hi load hote hain",
    ),
    "risk-assets.tip.body": (
        "This view fetches min_criticality=3 assets with a page_size of 200. If your register has more than 200 assets at that criticality or above, the excess simply won't appear – the severity cards and totals only reflect what loaded, not your full risk exposure.",
        "यह view min_criticality=3 वाले assets को page_size 200 के साथ fetch करता है। यदि आपके register में उस criticality या उससे अधिक के 200 से ज़्यादा assets हैं, तो बाकी assets बस दिखाई नहीं देंगे – severity cards और totals केवल उतना ही दर्शाते हैं जितना लोड हुआ, आपके पूरे risk exposure को नहीं।",
        "हे view min_criticality=3 असलेल्या assets ला page_size 200 सह fetch करते. जर तुमच्या register मध्ये त्या criticality किंवा त्याहून अधिकच्या 200 पेक्षा जास्त assets असतील, तर उर्वरित assets फक्त दिसणार नाहीत – severity cards आणि totals फक्त जेवढे load झाले तेवढेच दाखवतात, तुमचा संपूर्ण risk exposure नाही.",
        "Ye view min_criticality=3 wale assets ko page_size 200 ke saath fetch karta hai. Agar aapke register mein us criticality ya usse upar ke 200 se zyada assets hain, to baaki assets simply nahi dikhenge – severity cards aur totals sirf utna hi reflect karte hain jitna load hua, aapka poora risk exposure nahi.",
    ),
}


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 RISK_ASSETS.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(RISK_ASSETS)} risk-assets keys.")


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