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

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


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_CATEGORIES.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_CATEGORIES)} asset-categories keys.")


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