"""One-off seed: registers translation_keys + hi/mr/hinglish translation_values for the Workflow Approvals PageInfoButton content.

Usage: docker compose exec api python seed_translations_pageinfo_workflow_approvals.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_APPROVALS = {
    "workflow-approvals.title": (
        "Workflow Approvals",
        "वर्कफ़्लो अनुमोदन",
        "वर्कफ्लो मंजुरी",
        "Workflow Approvals",
    ),
    "workflow-approvals.subtitle": (
        "How this register works and what each field controls",
        "यह रजिस्टर कैसे काम करता है और प्रत्येक फ़ील्ड क्या नियंत्रित करती है",
        "हे रजिस्टर कसे कार्य करते आणि प्रत्येक फील्ड काय नियंत्रित करते",
        "Ye register kaise kaam karta hai aur har field kya control karti hai",
    ),
    "workflow-approvals.body.0": (
        "Multi-step business approvals — configured on Workflow Templates — land here for the assigned approver to act on. This is separate from master-data maker-checker: it drives business documents like purchase orders and disposals through their own approval chain.",
        "मल्टी-स्टेप बिज़नेस अनुमोदन — जो Workflow Templates पर कॉन्फ़िगर किए जाते हैं — यहाँ नियत अनुमोदक द्वारा कार्रवाई के लिए आते हैं। यह मास्टर-डेटा मेकर-चेकर से अलग है: यह purchase orders और disposals जैसे बिज़नेस दस्तावेज़ों को उनकी अपनी अनुमोदन श्रृंखला के माध्यम से आगे बढ़ाता है।",
        "मल्टी-स्टेप बिझनेस मंजुऱ्या — ज्या Workflow Templates वर कॉन्फिगर केलेल्या असतात — नेमलेल्या मंजूरकर्त्याकडून कारवाईसाठी येथे येतात. हे मास्टर-डेटा मेकर-चेकरपेक्षा वेगळे आहे: हे purchase orders आणि disposals सारखी बिझनेस कागदपत्रे त्यांच्या स्वतःच्या मंजुरी साखळीतून पुढे नेते.",
        "Multi-step business approvals — jo Workflow Templates par configure kiye jaate hain — yahan assigned approver ke action ke liye aate hain. Ye master-data maker-checker se alag hai: ye purchase orders aur disposals jaise business documents ko unki apni approval chain ke through drive karta hai.",
    ),
    "workflow-approvals.stepsHeading": (
        "What an approver can do",
        "एक अनुमोदक क्या कर सकता है",
        "मंजूरकर्ता काय करू शकतो",
        "Ek approver kya kar sakta hai",
    ),
    "workflow-approvals.steps.0.label": (
        "Pending",
        "लंबित",
        "प्रलंबित",
        "Pending",
    ),
    "workflow-approvals.steps.0.caption": (
        "Awaiting you",
        "आपकी प्रतीक्षा में",
        "तुमची वाट पाहत आहे",
        "Aapka wait ho raha hai",
    ),
    "workflow-approvals.steps.1.label": (
        "Act",
        "कार्रवाई करें",
        "कारवाई करा",
        "Act",
    ),
    "workflow-approvals.steps.1.caption": (
        "Approve/reject/forward/escalate",
        "अनुमोदित करें/अस्वीकार करें/आगे भेजें/एस्केलेट करें",
        "मंजूर करा/नाकारा/पुढे पाठवा/एस्केलेट करा",
        "Approve/reject/forward/escalate karein",
    ),
    "workflow-approvals.steps.2.label": (
        "Instance",
        "इंस्टेंस",
        "इन्स्टन्स",
        "Instance",
    ),
    "workflow-approvals.steps.2.caption": (
        "Full history",
        "पूरा इतिहास",
        "संपूर्ण इतिहास",
        "Poora history",
    ),
    "workflow-approvals.steps.3.label": (
        "Stats",
        "आँकड़े",
        "आकडेवारी",
        "Stats",
    ),
    "workflow-approvals.steps.3.caption": (
        "SLA compliance",
        "SLA अनुपालन",
        "SLA अनुपालन",
        "SLA compliance",
    ),
    "workflow-approvals.fieldRules.0.name": (
        "Template",
        "टेम्पलेट",
        "टेम्पलेट",
        "Template",
    ),
    "workflow-approvals.fieldRules.0.description": (
        "Which configured approval chain this instance is running.",
        "यह इंस्टेंस कौन सी कॉन्फ़िगर की गई अनुमोदन श्रृंखला के तहत चल रहा है।",
        "हा इन्स्टन्स कोणत्या कॉन्फिगर केलेल्या मंजुरी साखळीखाली चालू आहे.",
        "Ye instance kaunsi configured approval chain ke under chal raha hai.",
    ),
    "workflow-approvals.fieldRules.1.name": (
        "Entity",
        "एंटिटी",
        "एंटिटी",
        "Entity",
    ),
    "workflow-approvals.fieldRules.1.description": (
        "The record being approved — a PO, disposal, transfer, etc.",
        "जिस रिकॉर्ड को अनुमोदित किया जा रहा है — एक PO, disposal, transfer, आदि।",
        "ज्या रेकॉर्डला मंजुरी दिली जात आहे — एक PO, disposal, transfer, इ.",
        "Jo record approve kiya ja raha hai — ek PO, disposal, transfer, etc.",
    ),
    "workflow-approvals.fieldRules.2.name": (
        "SLA Deadline",
        "SLA समय सीमा",
        "SLA अंतिम मुदत",
        "SLA Deadline",
    ),
    "workflow-approvals.fieldRules.2.description": (
        "When this step should be actioned by, per the template's SLA.",
        "टेम्पलेट के SLA के अनुसार इस चरण पर कार्रवाई कब तक की जानी चाहिए।",
        "टेम्पलेटच्या SLA नुसार या टप्प्यावर कारवाई कधीपर्यंत केली जावी.",
        "Template ke SLA ke hisaab se is step par action kab tak ho jaana chahiye.",
    ),
    "workflow-approvals.tip.title": (
        "Delegating your approvals",
        "अपने अनुमोदन प्रत्यायोजित करना",
        "तुमच्या मंजुऱ्या प्रत्यायोजित करणे",
        "Apni approvals delegate karna",
    ),
    "workflow-approvals.tip.body": (
        "Going on leave? Use the Delegations tab to route your pending approvals to someone else for a date range, without changing your role.",
        "छुट्टी पर जा रहे हैं? अपनी भूमिका बदले बिना, एक निश्चित तिथि सीमा के लिए अपने लंबित अनुमोदन किसी और को भेजने के लिए Delegations टैब का उपयोग करें।",
        "सुट्टीवर जात आहात? तुमची भूमिका न बदलता, एका ठराविक कालावधीसाठी तुमच्या प्रलंबित मंजुऱ्या इतर कोणाकडे पाठवण्यासाठी Delegations टॅब वापरा.",
        "Leave par jaa rahe hain? Apna role change kiye bina, ek date range ke liye apni pending approvals kisi aur ko route karne ke liye Delegations tab use 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 WORKFLOW_APPROVALS.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_APPROVALS)} workflow-approvals keys.")


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