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

Usage: docker compose exec api python seed_translations_pageinfo_asset_classes.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_CLASSES = {
    "asset-classes.title": (
        "Asset Classes",
        "एसेट क्लासेज़",
        "एसेट क्लासेस",
        "Asset Classes",
    ),
    "asset-classes.subtitle": (
        "How this register works and what each field controls",
        "यह रजिस्टर कैसे काम करता है और प्रत्येक फ़ील्ड क्या नियंत्रित करता है",
        "हे रजिस्टर कसे कार्य करते आणि प्रत्येक फील्ड काय नियंत्रित करते",
        "Ye register kaise kaam karta hai aur har field kya control karta hai",
    ),
    "asset-classes.body.0": (
        "Asset Classes are the top-level grouping every asset, category, and sub-category is tagged against (e.g. Plant & Machinery, IT Equipment, Furniture). A class must exist and be Active here before it can be picked when creating an Asset Category or registering an asset.",
        "Asset Classes वह शीर्ष-स्तरीय समूह है जिसके विरुद्ध हर asset, category और sub-category को टैग किया जाता है (जैसे Plant & Machinery, IT Equipment, Furniture)। किसी Asset Category बनाने या asset रजिस्टर करने से पहले संबंधित class का यहाँ मौजूद और Active होना ज़रूरी है।",
        "Asset Classes हा सर्वोच्च-स्तरीय गट आहे ज्याविरुद्ध प्रत्येक asset, category आणि sub-category टॅग केली जाते (उदा. Plant & Machinery, IT Equipment, Furniture). एखादी Asset Category तयार करण्यापूर्वी किंवा asset नोंदवण्यापूर्वी संबंधित class येथे अस्तित्वात असणे आणि Active असणे आवश्यक आहे.",
        "Asset Classes wo top-level grouping hai jiske against har asset, category, aur sub-category tag hoti hai (jaise Plant & Machinery, IT Equipment, Furniture). Kisi Asset Category banane ya asset register karne se pehle us class ka yahan exist karna aur Active hona zaroori hai.",
    ),
    "asset-classes.stepsHeading": (
        "Lifecycle of a class",
        "Class का Lifecycle",
        "Class चे Lifecycle",
        "Class ka lifecycle",
    ),
    "asset-classes.steps.0.label": ("Pending Approval", "अनुमोदन लंबित", "मंजुरी प्रलंबित", "Pending Approval"),
    "asset-classes.steps.0.caption": (
        "Saved, awaiting sign-off",
        "सहेजा गया, sign-off की प्रतीक्षा में",
        "जतन केले, sign-off ची प्रतीक्षा",
        "Save ho gaya, sign-off ka wait",
    ),
    "asset-classes.steps.1.label": ("Active", "सक्रिय", "सक्रिय", "Active"),
    "asset-classes.steps.1.caption": (
        "Approved, selectable",
        "अनुमोदित, चयन योग्य",
        "मंजूर, निवडण्यायोग्य",
        "Approve ho gaya, select karne ke liye ready",
    ),
    "asset-classes.steps.2.label": ("Inactive", "निष्क्रिय", "निष्क्रिय", "Inactive"),
    "asset-classes.steps.2.caption": (
        "Deactivated, hidden",
        "निष्क्रिय किया गया, छिपा हुआ",
        "निष्क्रिय केले, लपवलेले",
        "Deactivate ho gaya, hidden",
    ),
    "asset-classes.steps.3.label": ("Reactivated", "पुनः सक्रिय", "पुन्हा सक्रिय", "Reactivated"),
    "asset-classes.steps.3.caption": (
        "Back to Active",
        "पुनः Active",
        "पुन्हा Active",
        "Wapas Active",
    ),
    "asset-classes.fieldRules.0.name": ("Asset Class Code", "एसेट क्लास कोड", "एसेट क्लास कोड", "Asset Class Code"),
    "asset-classes.fieldRules.0.description": (
        "Unique identifier (e.g. AC-001). Becomes read-only forever once the class is first saved.",
        "अद्वितीय पहचानकर्ता (जैसे AC-001)। class के पहली बार सहेजे जाने के बाद यह हमेशा के लिए read-only हो जाता है।",
        "अद्वितीय ओळखकर्ता (उदा. AC-001). class प्रथम जतन केल्यानंतर हे कायमचे read-only होते.",
        "Unique identifier hota hai (jaise AC-001). Class ko pehli baar save karne ke baad ye hamesha ke liye read-only ho jaata hai.",
    ),
    "asset-classes.fieldRules.1.name": ("Asset Class Name", "एसेट क्लास नाम", "एसेट क्लास नाव", "Asset Class Name"),
    "asset-classes.fieldRules.1.description": (
        "Display name shown wherever the class is picked — categories, assets, depreciation runs.",
        "जहाँ भी class चुनी जाती है वहाँ दिखाया जाने वाला display name — categories, assets, depreciation runs में।",
        "class जिथे जिथे निवडली जाते तिथे दाखवले जाणारे display name — categories, assets, depreciation runs मध्ये.",
        "Jahan bhi class select hoti hai wahan dikhne wala display name — categories, assets, depreciation runs mein.",
    ),
    "asset-classes.fieldRules.2.name": ("Effective From", "प्रभावी तिथि (From)", "प्रभावी तारीख (From)", "Effective From"),
    "asset-classes.fieldRules.2.description": (
        "Date the class comes into force. Locked and non-editable once the record exists.",
        "वह तारीख जब class प्रभाव में आती है। record बनने के बाद यह locked और non-editable हो जाती है।",
        "class कधी प्रभावी होते ती तारीख. record अस्तित्वात आल्यानंतर ही locked आणि non-editable होते.",
        "Wo date jab class effect mein aati hai. Record banne ke baad ye locked aur non-editable ho jaati hai.",
    ),
    "asset-classes.fieldRules.3.name": ("Effective To", "प्रभावी तिथि (To)", "प्रभावी तारीख (To)", "Effective To"),
    "asset-classes.fieldRules.3.description": (
        "Date the class is superseded or retired. The only date field you can still change after saving.",
        "वह तारीख जब class को superseded या retire किया जाता है। सहेजे जाने के बाद भी बदला जा सकने वाला यही एकमात्र date field है।",
        "class कधी superseded किंवा retire केली जाते ती तारीख. जतन केल्यानंतरही बदलता येणारे हे एकमेव date field आहे.",
        "Wo date jab class supersede ya retire hoti hai. Save karne ke baad bhi change kar sakne wala yahi ek date field hai.",
    ),
    "asset-classes.tip.title": (
        "Code and start date lock immediately",
        "Code और start date तुरंत lock हो जाते हैं",
        "Code आणि start date लगेच lock होतात",
        "Code aur start date turant lock ho jaate hain",
    ),
    "asset-classes.tip.body": (
        "The Asset Class Code and Effective From fields are editable only when you first create the class — the Edit form disables both. Get the coding scheme and start date right up front, since fixing either later means deleting and recreating the class.",
        "Asset Class Code और Effective From फ़ील्ड केवल class को पहली बार बनाते समय ही editable होते हैं — Edit फ़ॉर्म में दोनों disable कर दिए जाते हैं। coding scheme और start date शुरुआत में ही सही तय कर लें, क्योंकि बाद में इन्हें ठीक करने के लिए class को delete करके फिर से बनाना पड़ता है।",
        "Asset Class Code आणि Effective From ही फील्ड्स फक्त class प्रथम तयार करताना editable असतात — Edit फॉर्ममध्ये दोन्ही disable केली जातात. coding scheme आणि start date सुरुवातीलाच निश्चित करा, कारण नंतर त्या दुरुस्त करण्यासाठी class delete करून पुन्हा तयार करावी लागते.",
        "Asset Class Code aur Effective From fields sirf class pehli baar create karte waqt hi editable hote hain — Edit form mein dono disable ho jaate hain. Coding scheme aur start date shuru mein hi sahi tay kar lo, kyunki baad mein inhe fix karne ka matlab hai class ko delete karke dobara banana.",
    ),
}


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_CLASSES.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_CLASSES)} asset-classes keys.")


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