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

Usage: docker compose exec api python seed_translations_pageinfo_workflow_templates.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)
WORKFLOW_TEMPLATES = {
    "workflow-templates.title": (
        "Workflow Templates",
        "वर्कफ़्लो टेम्पलेट्स",
        "वर्कफ्लो टेम्पलेट्स्",
        "Workflow Templates",
    ),
    "workflow-templates.subtitle": (
        "Define reusable approval chains, then trigger them from real events.",
        "पुनः उपयोग होने वाली approval chains परिभाषित करें, फिर उन्हें वास्तविक events से trigger करें।",
        "पुनर्वापर करता येणाऱ्या approval chains परिभाषित करा, नंतर त्यांना प्रत्यक्ष events द्वारे trigger करा.",
        "Reusable approval chains define karein, phir unhe real events se trigger karein.",
    ),
    "workflow-templates.body.0": (
        "Define approval chains — steps, approvers, and SLAs — per module/trigger event.",
        "approval chains परिभाषित करें — steps, approvers, और SLAs — प्रत्येक module/trigger event के अनुसार।",
        "approval chains परिभाषित करा — steps, approvers, आणि SLAs — प्रत्येक module/trigger event नुसार.",
        "Approval chains define karein — steps, approvers, aur SLAs — har module/trigger event ke hisaab se.",
    ),
    "workflow-templates.body.1": (
        "Each template is scoped to one module and one trigger event (e.g. asset.disposal_requested). When that event fires, the template's steps become actionable tasks in Workflow Approvals.",
        "हर template एक module और एक trigger event तक सीमित होता है (जैसे asset.disposal_requested)। जब वह event fire होता है, तो template के steps Workflow Approvals में actionable tasks बन जाते हैं।",
        "प्रत्येक template एका module आणि एका trigger event पुरता मर्यादित असते (उदा. asset.disposal_requested). जेव्हा तो event fire होतो, तेव्हा template चे steps Workflow Approvals मध्ये actionable tasks बनतात.",
        "Har template ek module aur ek trigger event tak scoped hota hai (jaise asset.disposal_requested). Jab wo event fire hota hai, template ke steps Workflow Approvals mein actionable tasks ban jaate hain.",
    ),
    "workflow-templates.stepsHeading": (
        "Template lifecycle",
        "टेम्पलेट लाइफ़साइकल",
        "टेम्पलेट लाइफसायकल",
        "Template ka lifecycle",
    ),
    "workflow-templates.steps.0.label": ("Create Template", "टेम्पलेट बनाएं", "टेम्पलेट तयार करा", "Template Banayein"),
    "workflow-templates.steps.0.caption": (
        "Name it, pick module + trigger event",
        "नाम दें, module + trigger event चुनें",
        "नाव द्या, module + trigger event निवडा",
        "Naam dein, module + trigger event pick karein",
    ),
    "workflow-templates.steps.1.label": ("Add Steps", "Steps जोड़ें", "Steps जोडा", "Steps Add Karein"),
    "workflow-templates.steps.1.caption": (
        "Sequential/parallel/conditional, assign approvers",
        "Sequential/parallel/conditional, approvers assign करें",
        "Sequential/parallel/conditional, approvers assign करा",
        "Sequential/parallel/conditional, approvers assign karein",
    ),
    "workflow-templates.steps.2.label": ("Activate", "Activate करें", "Activate करा", "Activate Karein"),
    "workflow-templates.steps.2.caption": (
        "Only active templates route new tasks",
        "केवल active templates ही नए tasks route करते हैं",
        "फक्त active templates नवीन tasks route करतात",
        "Sirf active templates hi naye tasks route karte hain",
    ),
    "workflow-templates.steps.3.label": ("Applied", "लागू हुआ", "लागू झाले", "Applied"),
    "workflow-templates.steps.3.caption": (
        "Matching events create approval tasks automatically",
        "मेल खाने वाले events स्वतः approval tasks बनाते हैं",
        "जुळणारे events आपोआप approval tasks तयार करतात",
        "Matching events automatically approval tasks create karte hain",
    ),
    "workflow-templates.fieldRules.0.name": ("Module", "Module", "Module", "Module"),
    "workflow-templates.fieldRules.0.description": (
        "Which module this template governs (e.g. asset, procurement, finance).",
        "यह template किस module को नियंत्रित करता है (जैसे asset, procurement, finance)।",
        "हे template कोणत्या module ला नियंत्रित करते (उदा. asset, procurement, finance).",
        "Ye template kaunse module ko govern karta hai (jaise asset, procurement, finance).",
    ),
    "workflow-templates.fieldRules.1.name": ("Trigger Event", "Trigger Event", "Trigger Event", "Trigger Event"),
    "workflow-templates.fieldRules.1.description": (
        "The exact event name that activates this template — must match the emitted event, e.g. asset.disposal_requested.",
        "वह exact event नाम जो इस template को activate करता है — emitted event से मेल खाना चाहिए, जैसे asset.disposal_requested।",
        "हे template activate करणारे exact event नाव — emitted event शी जुळायला हवे, उदा. asset.disposal_requested.",
        "Wo exact event naam jo is template ko activate karta hai — emitted event se match hona chahiye, jaise asset.disposal_requested.",
    ),
    "workflow-templates.fieldRules.2.name": ("Step Type", "Step Type", "Step Type", "Step Type"),
    "workflow-templates.fieldRules.2.description": (
        "Sequential waits for the prior step; parallel runs approvers together; conditional branches on rules.",
        "Sequential पिछले step का इंतज़ार करता है; parallel approvers को एक साथ चलाता है; conditional rules के आधार पर branch करता है।",
        "Sequential आधीच्या step ची वाट पाहते; parallel approvers ला एकत्र चालवते; conditional rules नुसार branch करते.",
        "Sequential pichhle step ka wait karta hai; parallel approvers ko saath mein chalata hai; conditional rules ke aadhar par branch karta hai.",
    ),
    "workflow-templates.fieldRules.3.name": ("Approver Type", "Approver Type", "Approver Type", "Approver Type"),
    "workflow-templates.fieldRules.3.description": (
        "Route to a specific user, a role, the OU head, or a custom resolver.",
        "किसी विशिष्ट user, role, OU head, या custom resolver को route करें।",
        "एखाद्या विशिष्ट user, role, OU head, किंवा custom resolver कडे route करा.",
        "Kisi specific user, role, OU head, ya custom resolver ko route karein.",
    ),
    "workflow-templates.fieldRules.4.name": ("SLA Hours", "SLA Hours", "SLA Hours", "SLA Hours"),
    "workflow-templates.fieldRules.4.description": (
        "Optional escalation window; leave blank for no SLA timer on that step.",
        "वैकल्पिक escalation window; उस step पर कोई SLA timer न रखने के लिए इसे खाली छोड़ें।",
        "पर्यायी escalation window; त्या step वर SLA timer नको असल्यास रिकामे सोडा.",
        "Optional escalation window; us step par SLA timer nahi chahiye to isse blank chhod dein.",
    ),
    "workflow-templates.tip.title": (
        "Steps decide readiness",
        "Steps ही readiness तय करते हैं",
        "Steps च readiness ठरवतात",
        "Steps hi readiness decide karte hain",
    ),
    "workflow-templates.tip.body": (
        "A template with zero steps can be activated but can't actually be started — add at least one approval step before flipping it to Active, or triggered events will have nowhere to route.",
        "बिना किसी step वाला template activate तो किया जा सकता है, लेकिन वास्तव में शुरू नहीं किया जा सकता — इसे Active करने से पहले कम से कम एक approval step जोड़ें, वरना triggered events के पास route करने के लिए कोई जगह नहीं होगी।",
        "शून्य steps असलेले template activate करता येते, पण प्रत्यक्षात सुरू करता येत नाही — ते Active करण्यापूर्वी किमान एक approval step जोडा, नाहीतर triggered events ला route करण्यासाठी जागाच राहणार नाही.",
        "Zero steps wala template activate to ho sakta hai, lekin actually start nahi ho sakta — ise Active karne se pehle kam se kam ek approval step add karein, warna triggered events ke paas route karne ke liye kahin jagah nahi hogi.",
    ),
}


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 WORKFLOW_TEMPLATES.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(WORKFLOW_TEMPLATES)} workflow-templates keys.")


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