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

Usage: docker compose exec api python seed_translations_pageinfo_custody_assigned_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)
CUSTODY_ASSIGNED_ASSETS = {
    "custody-assigned-assets.title": (
        "Assigned Assets",
        "असाइन्ड एसेट्स",
        "असाइन्ड एसेट्स",
        "Assigned Assets",
    ),
    "custody-assigned-assets.subtitle": (
        "Full custody trail for a chosen custodian",
        "चयनित custodian के लिए पूरा custody trail",
        "निवडलेल्या custodian साठी संपूर्ण custody trail",
        "Chosen custodian ke liye full custody trail",
    ),
    "custody-assigned-assets.body.0": (
        "Every asset ever assigned to a custodian, plus its current status. Switch between the three tabs to see the full history, only what they hold today, or only past (superseded) assignments.",
        "किसी custodian को अब तक assign किया गया हर asset, साथ ही उसकी current स्थिति। पूरी history देखने के लिए, आज जो उनके पास है वह देखने के लिए, या केवल past (superseded) assignments देखने के लिए तीनों tabs के बीच switch करें।",
        "एखाद्या custodian ला आजपर्यंत assign केलेली प्रत्येक asset, तसेच तिची सध्याची स्थिती. संपूर्ण history पाहण्यासाठी, आज त्यांच्याकडे काय आहे ते पाहण्यासाठी, किंवा फक्त past (superseded) assignments पाहण्यासाठी तिन्ही tabs मध्ये switch करा.",
        "Kisi bhi custodian ko ab tak assign kiya gaya har asset, plus uski current status. Full history dekhne ke liye, aaj jo unke paas hai wo dekhne ke liye, ya sirf past (superseded) assignments dekhne ke liye teeno tabs ke beech switch karo.",
    ),
    "custody-assigned-assets.body.1": (
        "Managers and admins can pick any custodian here; a plain Custodian only ever sees their own list, and the picker is hidden for them.",
        "Managers और admins यहाँ किसी भी custodian को चुन सकते हैं; एक सामान्य Custodian हमेशा केवल अपनी ही list देखता है, और उनके लिए picker छिपा रहता है।",
        "Managers आणि admins येथे कोणत्याही custodian ला निवडू शकतात; साध्या Custodian ला नेहमी फक्त स्वतःची list दिसते, आणि त्यांच्यासाठी picker लपवलेला असतो.",
        "Managers aur admins yahan kisi bhi custodian ko pick kar sakte hain; ek plain Custodian ko hamesha sirf apni list dikhti hai, aur unke liye picker hidden rehta hai.",
    ),
    "custody-assigned-assets.stepsHeading": (
        "Custody lifecycle",
        "Custody जीवनचक्र",
        "Custody जीवनचक्र",
        "Custody lifecycle",
    ),
    "custody-assigned-assets.steps.0.label": ("Assigned", "आवंटित", "वाटप केलेले", "Assigned"),
    "custody-assigned-assets.steps.0.caption": (
        "Manager assigns the asset — record starts as \"pending acceptance\".",
        "Manager asset assign करता है — record \"pending acceptance\" के रूप में शुरू होता है।",
        "Manager asset assign करतो — record \"pending acceptance\" म्हणून सुरू होते.",
        "Manager asset ko assign karta hai — record \"pending acceptance\" ke roop mein start hota hai.",
    ),
    "custody-assigned-assets.steps.1.label": ("Accepted", "स्वीकृत", "स्वीकृत", "Accepted"),
    "custody-assigned-assets.steps.1.caption": (
        "Only the named custodian can accept it; status becomes \"active\".",
        "केवल नामित custodian ही इसे accept कर सकता है; status \"active\" हो जाता है।",
        "फक्त नामांकित custodian हीच ती accept करू शकते; status \"active\" होते.",
        "Sirf named custodian hi ise accept kar sakta hai; status \"active\" ho jaata hai.",
    ),
    "custody-assigned-assets.steps.2.label": ("Held", "धारित", "धारण केलेले", "Held"),
    "custody-assigned-assets.steps.2.caption": (
        "While active, the custodian can Return it or a manager can Transfer/set its Cost Centre.",
        "Active रहते हुए, custodian इसे Return कर सकता है या manager इसे Transfer कर सकता है/इसका Cost Centre सेट कर सकता है।",
        "Active असताना, custodian ती Return करू शकतो किंवा manager ती Transfer करू शकतो/तिचे Cost Centre सेट करू शकतो.",
        "Active rehte hue, custodian ise Return kar sakta hai ya manager Transfer kar sakta hai/uska Cost Centre set kar sakta hai.",
    ),
    "custody-assigned-assets.steps.3.label": ("Superseded", "प्रतिस्थापित", "प्रतिस्थापित", "Superseded"),
    "custody-assigned-assets.steps.3.caption": (
        "Returned or transferred away — record becomes read-only history.",
        "Return कर दिया गया या transfer हो गया — record read-only history बन जाता है।",
        "Return केले किंवा transfer झाले — record read-only history बनते.",
        "Return ho gaya ya transfer ho gaya — record read-only history ban jaata hai.",
    ),
    "custody-assigned-assets.fieldRules.0.name": ("Status", "स्थिति", "स्थिती", "Status"),
    "custody-assigned-assets.fieldRules.0.description": (
        "pending_acceptance, active, or superseded — drives which action buttons appear on that row.",
        "pending_acceptance, active, या superseded — यह तय करता है कि उस row पर कौन-से action buttons दिखेंगे।",
        "pending_acceptance, active, किंवा superseded — हे ठरवते की त्या row वर कोणती action buttons दिसतील.",
        "pending_acceptance, active, ya superseded — ye decide karta hai ki us row par kaunse action buttons dikhenge.",
    ),
    "custody-assigned-assets.fieldRules.1.name": ("Effective From", "प्रभावी दिनांक", "प्रभावी दिनांक", "Effective From"),
    "custody-assigned-assets.fieldRules.1.description": (
        "Date the custody assignment starts; set when the manager assigns it.",
        "वह तारीख जब custody assignment शुरू होता है; यह तब सेट होती है जब manager इसे assign करता है।",
        "custody assignment सुरू होण्याची तारीख; manager जेव्हा ती assign करतो तेव्हा ती सेट होते.",
        "Wo date jab custody assignment start hoti hai; manager jab assign karta hai tab set hoti hai.",
    ),
    "custody-assigned-assets.fieldRules.2.name": ("Accepted At", "स्वीकृति समय", "स्वीकृती वेळ", "Accepted At"),
    "custody-assigned-assets.fieldRules.2.description": (
        "Timestamp the custodian accepted — blank until Accept is clicked.",
        "वह timestamp जब custodian ने accept किया — जब तक Accept क्लिक न हो, यह खाली रहता है।",
        "custodian ने accept केल्याची timestamp — Accept क्लिक होईपर्यंत ती रिकामी राहते.",
        "Custodian ne jab accept kiya uska timestamp — Accept click hone tak ye blank rehta hai.",
    ),
    "custody-assigned-assets.fieldRules.3.name": ("Return reason", "Return का कारण", "Return चे कारण", "Return reason"),
    "custody-assigned-assets.fieldRules.3.description": (
        "Mandatory free-text note when handing an asset back with no incoming custodian.",
        "जब कोई asset बिना किसी नए incoming custodian के वापस सौंपी जाती है, तो यह free-text note अनिवार्य है।",
        "जेव्हा एखादी asset कोणत्याही नवीन incoming custodian शिवाय परत सोपवली जाते, तेव्हा हे free-text note अनिवार्य आहे.",
        "Jab koi asset bina kisi incoming custodian ke wapas handover ki jaati hai, tab ye free-text note mandatory hai.",
    ),
    "custody-assigned-assets.tip.title": (
        "Actions are per-role, not per-page",
        "Actions role के अनुसार होते हैं, page के अनुसार नहीं",
        "Actions role नुसार असतात, page नुसार नाहीत",
        "Actions role ke hisaab se hote hain, page ke hisaab se nahi",
    ),
    "custody-assigned-assets.tip.body": (
        "Accept and Return only ever show up for the custodian themselves; Transfer and Cost Centre only for managers/admins — unless the viewed custodian has resigned or been terminated, in which case Transfer stays available so someone else can pick up the asset.",
        "Accept और Return हमेशा केवल custodian खुद के लिए दिखते हैं; Transfer और Cost Centre केवल managers/admins के लिए — जब तक कि देखा जा रहा custodian resign न कर चुका हो या terminate न हुआ हो, ऐसी स्थिति में Transfer उपलब्ध रहता है ताकि कोई और वह asset ले सके।",
        "Accept आणि Return नेहमी फक्त custodian स्वतःसाठीच दिसतात; Transfer आणि Cost Centre फक्त managers/admins साठी — जोपर्यंत पाहिला जाणारा custodian resign झालेला नसेल किंवा terminate झालेला नसेल, अशा स्थितीत Transfer उपलब्ध राहते जेणेकरून कोणी दुसरी व्यक्ती ती asset घेऊ शकेल.",
        "Accept aur Return hamesha sirf custodian khud ke liye dikhte hain; Transfer aur Cost Centre sirf managers/admins ke liye — jab tak dekha jaa raha custodian resign ya terminate na ho chuka ho, us case mein Transfer available rehta hai taaki koi aur wo asset le sake.",
    ),
}


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 CUSTODY_ASSIGNED_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(CUSTODY_ASSIGNED_ASSETS)} custody-assigned-assets keys.")


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