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

Usage: docker compose exec api python seed_translations_pageinfo_label_workspace.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)
LABEL_WORKSPACE = {
    "label-workspace.title": (
        "Label Workspace",
        "लेबल वर्कस्पेस",
        "लेबल वर्कस्पेस",
        "Label Workspace",
    ),
    "label-workspace.subtitle": (
        "Design label templates, print in bulk, and track code coverage",
        "लेबल टेम्पलेट डिज़ाइन करें, बल्क में प्रिंट करें, और कोड कवरेज ट्रैक करें",
        "लेबल टेम्पलेट डिझाइन करा, बल्कमध्ये प्रिंट करा आणि कोड कव्हरेज ट्रॅक करा",
        "Label templates design karein, bulk mein print karein, aur code coverage track karein",
    ),
    "label-workspace.body.0": (
        "Print templates, bulk label generation, the unmapped label pool, and coverage stats.",
        "प्रिंट टेम्पलेट, बल्क लेबल जनरेशन, अनमैप्ड लेबल पूल, और कवरेज आँकड़े।",
        "प्रिंट टेम्पलेट्स, बल्क लेबल जनरेशन, अनमॅप्ड लेबल पूल, आणि कव्हरेज आकडेवारी.",
        "Print templates, bulk label generation, unmapped label pool, aur coverage stats.",
    ),
    "label-workspace.body.1": (
        "Assigning a label to one specific asset happens on that asset's own Labels tab, not here.",
        "किसी एक विशिष्ट asset को लेबल असाइन करना उस asset के अपने Labels tab पर होता है, यहाँ नहीं।",
        "एखाद्या विशिष्ट asset ला लेबल असाइन करणे त्या asset च्या स्वतःच्या Labels tab वर होते, इथे नाही.",
        "Kisi ek specific asset ko label assign karna us asset ke apne Labels tab par hota hai, yahan nahi.",
    ),
    "label-workspace.stepsHeading": (
        "How labels move through the workspace",
        "वर्कस्पेस में लेबल कैसे आगे बढ़ते हैं",
        "वर्कस्पेसमध्ये लेबल्स कशी पुढे सरकतात",
        "Workspace mein labels kaise move karte hain",
    ),
    "label-workspace.steps.0.label": ("Template", "टेम्पलेट", "टेम्पलेट", "Template"),
    "label-workspace.steps.0.caption": (
        "Set paper size and print layout, then activate it",
        "पेपर साइज़ और प्रिंट लेआउट सेट करें, फिर इसे activate करें",
        "पेपर साइझ आणि प्रिंट लेआउट सेट करा, नंतर ते activate करा",
        "Paper size aur print layout set karein, phir ise activate karein",
    ),
    "label-workspace.steps.1.label": ("Print Job", "प्रिंट जॉब", "प्रिंट जॉब", "Print Job"),
    "label-workspace.steps.1.caption": (
        "Generate a batch of labels for matching assets from a template",
        "किसी template से मैचिंग assets के लिए लेबल का batch जनरेट करें",
        "एखाद्या template वरून जुळणाऱ्या assets साठी लेबल्सचा batch जनरेट करा",
        "Ek template se matching assets ke liye labels ka batch generate karein",
    ),
    "label-workspace.steps.2.label": ("Label Pool", "लेबल पूल", "लेबल पूल", "Label Pool"),
    "label-workspace.steps.2.caption": (
        "Pre-print blank codes ahead of time, then map each to an asset later",
        "खाली कोड पहले से प्री-प्रिंट करें, फिर बाद में हर एक को किसी asset से map करें",
        "रिकामे कोड आधीच प्री-प्रिंट करा, नंतर प्रत्येकाला एखाद्या asset शी map करा",
        "Blank codes pehle se pre-print karein, phir baad mein har ek ko kisi asset se map karein",
    ),
    "label-workspace.steps.3.label": ("Auto-Tag", "ऑटो-टैग", "ऑटो-टॅग", "Auto-Tag"),
    "label-workspace.steps.3.caption": (
        "Optionally auto-assign a label whenever a new asset is created",
        "वैकल्पिक रूप से, जब भी कोई नया asset बनाया जाए तो लेबल को ऑटो-असाइन करें",
        "पर्यायाने, जेव्हा नवीन asset तयार होते तेव्हा लेबल आपोआप असाइन करा",
        "Optionally, jab bhi koi naya asset banaya jaaye to label auto-assign ho jaaye",
    ),
    "label-workspace.fieldRules.0.name": (
        "Template Name",
        "टेम्पलेट नाम",
        "टेम्पलेट नाव",
        "Template Name",
    ),
    "label-workspace.fieldRules.0.description": (
        "Identifies the template in the Print Jobs dropdown; can't be blank.",
        "यह Print Jobs dropdown में टेम्पलेट की पहचान करता है; इसे खाली नहीं छोड़ा जा सकता।",
        "हे Print Jobs dropdown मध्ये टेम्पलेटची ओळख करते; ते रिकामे ठेवता येत नाही.",
        "Ye Print Jobs dropdown mein template ko identify karta hai; isse blank nahi chhoda ja sakta.",
    ),
    "label-workspace.fieldRules.1.name": (
        "Width / Height (mm)",
        "चौड़ाई / ऊँचाई (mm)",
        "रुंदी / उंची (mm)",
        "Width / Height (mm)",
    ),
    "label-workspace.fieldRules.1.description": (
        "Physical label dimensions — must match your printer's label stock or codes print misaligned or cut off.",
        "भौतिक लेबल आयाम — आपके printer के लेबल स्टॉक से मेल खाने चाहिए, वरना कोड misaligned print होंगे या कट जाएँगे।",
        "भौतिक लेबल परिमाणे — तुमच्या printer च्या लेबल स्टॉकशी जुळणे आवश्यक आहे, अन्यथा कोड misaligned प्रिंट होतील किंवा कापले जातील.",
        "Physical label dimensions — aapke printer ke label stock se match hone chahiye, warna codes misaligned print honge ya cut ho jaayenge.",
    ),
    "label-workspace.fieldRules.2.name": (
        "Rows / Cols per Page",
        "प्रति पेज Rows / Cols",
        "प्रति पेज Rows / Cols",
        "Rows / Cols per Page",
    ),
    "label-workspace.fieldRules.2.description": (
        "Sheet layout for the print PDF; leave blank to omit it and let the printer's default apply.",
        "print PDF के लिए sheet layout; इसे खाली छोड़ने पर यह omit हो जाएगा और printer का default लागू होगा।",
        "print PDF साठी sheet layout; रिकामे ठेवल्यास ते वगळले जाईल आणि printer चा default लागू होईल.",
        "Print PDF ke liye sheet layout; blank chhodne par ye omit ho jaayega aur printer ka default apply hoga.",
    ),
    "label-workspace.fieldRules.3.name": (
        "Template (Print Job)",
        "टेम्पलेट (Print Job)",
        "टेम्पलेट (Print Job)",
        "Template (Print Job)",
    ),
    "label-workspace.fieldRules.3.description": (
        "Must be selected — the Generate button stays disabled until a template is chosen.",
        "इसे चुना जाना ज़रूरी है — जब तक कोई टेम्पलेट न चुना जाए, Generate button disabled रहता है।",
        "हे निवडणे आवश्यक आहे — जोपर्यंत टेम्पलेट निवडले जात नाही, तोपर्यंत Generate button disabled राहते.",
        "Ise select karna zaroori hai — jab tak koi template choose nahi hota, Generate button disabled rehta hai.",
    ),
    "label-workspace.fieldRules.4.name": (
        "Count (Pool)",
        "काउंट (Pool)",
        "काउंट (Pool)",
        "Count (Pool)",
    ),
    "label-workspace.fieldRules.4.description": (
        "How many pre-printed blank codes to generate; rejected client-side outside the 1-1000 range.",
        "कितने प्री-प्रिंटेड खाली कोड जनरेट करने हैं; 1-1000 की रेंज से बाहर होने पर client-side पर reject हो जाता है।",
        "किती pre-printed रिकामे कोड जनरेट करायचे; 1-1000 च्या रेंजच्या बाहेर असल्यास client-side वर reject होते.",
        "Kitne pre-printed blank codes generate karne hain; 1-1000 ki range se bahar hone par client-side reject ho jaata hai.",
    ),
    "label-workspace.tip.title": (
        "Permission gate is label:*, not tag:*",
        "Permission gate label:* है, tag:* नहीं",
        "Permission gate label:* आहे, tag:* नाही",
        "Permission gate label:* hai, tag:* nahi",
    ),
    "label-workspace.tip.body": (
        "Create/generate/update actions here (templates, print jobs, pool generation, auto-tag config) are gated on label:create or label:update — not asset:tag_manage. A user with only tag-management permissions won't see any of the management controls on this page.",
        "यहाँ के Create/generate/update actions (templates, print jobs, pool generation, auto-tag config) label:create या label:update पर gated हैं — asset:tag_manage पर नहीं। केवल tag-management permissions रखने वाले user को इस page पर कोई भी management control नहीं दिखेगा।",
        "इथले Create/generate/update actions (templates, print jobs, pool generation, auto-tag config) label:create किंवा label:update वर gated आहेत — asset:tag_manage वर नाहीत. फक्त tag-management permissions असलेल्या user ला या page वर कोणतेही management control दिसणार नाही.",
        "Yahan ke Create/generate/update actions (templates, print jobs, pool generation, auto-tag config) label:create ya label:update par gated hain — asset:tag_manage par nahi. Sirf tag-management permissions wale user ko is page par koi bhi management control nahi dikhega.",
    ),
}


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 LABEL_WORKSPACE.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(LABEL_WORKSPACE)} label-workspace keys.")


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