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

Usage: docker compose exec api python seed_translations_pageinfo_asset_subcategories.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_SUBCATEGORIES = {
    "asset-subcategories.title": (
        "Asset Sub-Categories",
        "एसेट सब-कैटेगरी",
        "एसेट सब-कॅटेगरी",
        "Asset Sub-Categories",
    ),
    "asset-subcategories.subtitle": (
        "How sub-categories work and what each field controls",
        "सब-कैटेगरी कैसे काम करती हैं और प्रत्येक फ़ील्ड क्या नियंत्रित करता है",
        "सब-कॅटेगरी कशा कार्य करतात आणि प्रत्येक फील्ड काय नियंत्रित करते",
        "Sub-categories kaise kaam karti hain aur har field kya control karta hai",
    ),
    "asset-subcategories.body.0": (
        "A sub-category is a finer grouping within an Asset Category (e.g. Ultrabooks under Laptops under IT Equipment). Every sub-category must be approved by a second user before it can be selected on an asset record.",
        "सब-कैटेगरी, किसी Asset Category के भीतर एक अधिक सूक्ष्म समूहन है (उदाहरण के लिए, IT Equipment के अंतर्गत Laptops के भीतर Ultrabooks)। किसी asset record पर चुने जाने से पहले हर सब-कैटेगरी को किसी दूसरे यूज़र द्वारा अनुमोदित किया जाना ज़रूरी है।",
        "सब-कॅटेगरी म्हणजे एखाद्या Asset Category मधील अधिक सूक्ष्म गटरचना (उदा., IT Equipment अंतर्गत Laptops मधील Ultrabooks). एखाद्या asset record वर निवडण्यापूर्वी प्रत्येक सब-कॅटेगरी दुसऱ्या युजरने मंजूर करणे आवश्यक आहे.",
        "Sub-category ek Asset Category ke andar ka ek finer grouping hota hai (jaise, IT Equipment ke under Laptops ke andar Ultrabooks). Kisi asset record par select hone se pehle har sub-category ko ek doosre user se approve karwana zaroori hai.",
    ),
    "asset-subcategories.stepsHeading": (
        "Maker-checker lifecycle",
        "Maker-checker लाइफ़साइकल",
        "Maker-checker लाइफसायकल",
        "Maker-checker lifecycle",
    ),
    "asset-subcategories.steps.0.label": ("Create", "बनाएं", "तयार करा", "Create"),
    "asset-subcategories.steps.0.caption": (
        "Maker submits code, name and linked Asset Category",
        "Maker code, नाम और लिंक्ड Asset Category सबमिट करता है",
        "Maker code, नाव आणि लिंक्ड Asset Category सबमिट करतो",
        "Maker code, name aur linked Asset Category submit karta hai",
    ),
    "asset-subcategories.steps.1.label": ("Pending Approval", "अनुमोदन लंबित", "मंजुरी प्रलंबित", "Pending Approval"),
    "asset-subcategories.steps.1.caption": (
        "Not yet selectable on asset forms",
        "अभी तक asset फ़ॉर्म पर चयन योग्य नहीं है",
        "अद्याप asset फॉर्मवर निवडण्यायोग्य नाही",
        "Abhi tak asset forms par select nahi kiya ja sakta",
    ),
    "asset-subcategories.steps.2.label": ("Approve", "अनुमोदित करें", "मंजूर करा", "Approve"),
    "asset-subcategories.steps.2.caption": (
        "A different user approves it",
        "इसे कोई दूसरा यूज़र अनुमोदित करता है",
        "हे दुसरा युजर मंजूर करतो",
        "Ise ek alag user approve karta hai",
    ),
    "asset-subcategories.steps.3.label": ("Active", "सक्रिय", "सक्रिय", "Active"),
    "asset-subcategories.steps.3.caption": (
        "Available for selection until deactivated",
        "निष्क्रिय किए जाने तक चयन के लिए उपलब्ध",
        "निष्क्रिय होईपर्यंत निवडीसाठी उपलब्ध",
        "Deactivate hone tak selection ke liye available",
    ),
    "asset-subcategories.fieldRules.0.name": ("Asset Category", "एसेट कैटेगरी", "एसेट कॅटेगरी", "Asset Category"),
    "asset-subcategories.fieldRules.0.description": (
        "Parent category this sub-category belongs to. Locked once created — cannot be changed on edit.",
        "वह पैरेंट कैटेगरी जिससे यह सब-कैटेगरी संबंधित है। बनाए जाने के बाद यह लॉक हो जाती है — edit करते समय इसे बदला नहीं जा सकता।",
        "ही सब-कॅटेगरी ज्या पॅरेंट कॅटेगरीशी संबंधित आहे ती. तयार झाल्यानंतर ती लॉक होते — edit करताना ती बदलता येत नाही.",
        "Wo parent category jisse ye sub-category belong karti hai. Create hone ke baad ye lock ho jaati hai — edit karte waqt ise badla nahi ja sakta.",
    ),
    "asset-subcategories.fieldRules.1.name": ("Sub-Category Code", "सब-कैटेगरी कोड", "सब-कॅटेगरी कोड", "Sub-Category Code"),
    "asset-subcategories.fieldRules.1.description": (
        "Unique identifier, e.g. SUB-001. Read-only after creation.",
        "एक अद्वितीय पहचानकर्ता, जैसे SUB-001। बनाए जाने के बाद यह केवल-पठनीय (read-only) होता है।",
        "एक अद्वितीय ओळखकर्ता, उदा. SUB-001. तयार झाल्यानंतर हे फक्त-वाचनीय (read-only) असते.",
        "Ek unique identifier, jaise SUB-001. Creation ke baad ye read-only ho jaata hai.",
    ),
    "asset-subcategories.fieldRules.2.name": ("Sub-Category Name", "सब-कैटेगरी नाम", "सब-कॅटेगरी नाव", "Sub-Category Name"),
    "asset-subcategories.fieldRules.2.description": (
        "Display name shown on asset forms and this list. Editable at any time.",
        "asset फ़ॉर्म और इस सूची पर दिखाया जाने वाला डिस्प्ले नाम। इसे कभी भी संपादित किया जा सकता है।",
        "asset फॉर्म आणि या यादीवर दाखवले जाणारे डिस्प्ले नाव. हे कधीही संपादित करता येते.",
        "Asset forms aur is list par dikhaya jaane wala display name. Ise kabhi bhi edit kiya ja sakta hai.",
    ),
    "asset-subcategories.fieldRules.3.name": ("Status", "स्थिति", "स्थिती", "Status"),
    "asset-subcategories.fieldRules.3.description": (
        "Approval state (pending/approved) here; Deactivate/Reactivate separately controls whether it can be selected.",
        "यहाँ अनुमोदन स्थिति (pending/approved) दिखाई देती है; इसे चुना जा सकता है या नहीं, यह अलग से Deactivate/Reactivate द्वारा नियंत्रित होता है।",
        "येथे मंजुरीची स्थिती (pending/approved) दाखवली जाते; ती निवडता येते की नाही हे स्वतंत्रपणे Deactivate/Reactivate द्वारे नियंत्रित होते.",
        "Yahan approval state (pending/approved) dikhta hai; ye select ho sakta hai ya nahi, ye alag se Deactivate/Reactivate control karta hai.",
    ),
    "asset-subcategories.tip.title": (
        "Picked the wrong Asset Category?",
        "गलत Asset Category चुन ली?",
        "चुकीची Asset Category निवडली?",
        "Galat Asset Category pick kar li?",
    ),
    "asset-subcategories.tip.body": (
        "Asset Category and Sub-Category Code are both locked the moment a sub-category is created — there's no way to move it under a different category later. Delete the pending record and recreate it under the correct category instead.",
        "जैसे ही कोई सब-कैटेगरी बनाई जाती है, Asset Category और Sub-Category Code दोनों तुरंत लॉक हो जाते हैं — बाद में इसे किसी दूसरी कैटेगरी के अंतर्गत ले जाने का कोई तरीका नहीं है। इसके बजाय लंबित (pending) रिकॉर्ड को हटाएं और इसे सही कैटेगरी के अंतर्गत फिर से बनाएं।",
        "एखादी सब-कॅटेगरी तयार होताच Asset Category आणि Sub-Category Code दोन्ही लगेच लॉक होतात — नंतर ती वेगळ्या कॅटेगरीखाली हलवण्याचा कोणताही मार्ग नाही. त्याऐवजी प्रलंबित (pending) रेकॉर्ड डिलीट करा आणि योग्य कॅटेगरीखाली पुन्हा तयार करा.",
        "Jaise hi ek sub-category create hoti hai, Asset Category aur Sub-Category Code dono turant lock ho jaate hain — baad mein ise kisi alag category ke under move karne ka koi tareeka nahi hai. Iske bajaye pending record ko delete karke sahi category ke under dobara create 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_SUBCATEGORIES.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_SUBCATEGORIES)} asset-subcategories keys.")


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