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

Usage: docker compose exec api python seed_translations_pageinfo_virement_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)
VIREMENT_APPROVALS = {
    "virement-approvals.title": (
        "Budget Virement",
        "बजट वायरमेंट",
        "बजट वायरमेंट",
        "Budget Virement",
    ),
    "virement-approvals.subtitle": (
        "Move approved budget between heads, with maker-checker sign-off",
        "स्वीकृत budget को heads के बीच स्थानांतरित करें, maker-checker sign-off के साथ",
        "मंजूर budget हेड्समध्ये स्थानांतरित करा, maker-checker sign-off सह",
        "Approved budget ko heads ke beech move karein, maker-checker sign-off ke saath",
    ),
    "virement-approvals.body.0": (
        "Request a transfer of approved budget between heads — a different user must approve.",
        "स्वीकृत budget के heads के बीच transfer का अनुरोध करें — किसी दूसरे उपयोगकर्ता को इसे approve करना ज़रूरी है।",
        "मंजूर budget च्या heads दरम्यान transfer साठी विनंती करा — दुसऱ्या वापरकर्त्याने ते approve करणे आवश्यक आहे.",
        "Approved budget ka heads ke beech transfer request karein — kisi alag user ko ise approve karna zaroori hai.",
    ),
    "virement-approvals.body.1": (
        "Also includes PFMS sync and zero-based budgeting tools.",
        "इसमें PFMS sync और zero-based budgeting टूल्स भी शामिल हैं।",
        "यामध्ये PFMS sync आणि zero-based budgeting टूल्सचाही समावेश आहे.",
        "Isme PFMS sync aur zero-based budgeting tools bhi included hain.",
    ),
    "virement-approvals.stepsHeading": (
        "Virement lifecycle",
        "Virement जीवनचक्र",
        "Virement जीवनचक्र",
        "Virement lifecycle",
    ),
    "virement-approvals.steps.0.label": ("Request", "अनुरोध", "विनंती", "Request"),
    "virement-approvals.steps.0.caption": (
        "Maker submits From/To budget IDs and an amount.",
        "Maker From/To budget IDs और एक amount सबमिट करता है।",
        "Maker From/To budget IDs आणि एक amount सबमिट करतो.",
        "Maker From/To budget IDs aur ek amount submit karta hai.",
    ),
    "virement-approvals.steps.1.label": ("Pending Approval", "अनुमोदन लंबित", "मंजुरी प्रलंबित", "Pending Approval"),
    "virement-approvals.steps.1.caption": (
        "Request sits in the queue below; no balance moves yet.",
        "अनुरोध नीचे queue में रहता है; अभी तक कोई balance स्थानांतरित नहीं होता।",
        "विनंती खालील queue मध्ये राहते; अद्याप कोणताही balance स्थानांतरित होत नाही.",
        "Request neeche queue mein pending rehta hai; abhi tak koi balance move nahi hota.",
    ),
    "virement-approvals.steps.2.label": ("Checker Approves", "Checker अनुमोदन करता है", "Checker मंजुरी देतो", "Checker Approves"),
    "virement-approvals.steps.2.caption": (
        "A different user with budget:approve signs off.",
        "budget:approve वाला कोई दूसरा उपयोगकर्ता sign off करता है।",
        "budget:approve असलेला दुसरा वापरकर्ता sign off करतो.",
        "budget:approve wala koi alag user sign off karta hai.",
    ),
    "virement-approvals.steps.3.label": ("Balance Transferred", "Balance स्थानांतरित", "Balance स्थानांतरित", "Balance Transferred"),
    "virement-approvals.steps.3.caption": (
        "Amount moves from the source head to the target head.",
        "Amount source head से target head में स्थानांतरित होता है।",
        "Amount source head वरून target head मध्ये स्थानांतरित होते.",
        "Amount source head se target head mein move ho jaata hai.",
    ),
    "virement-approvals.fieldRules.0.name": ("From Budget ID", "फ्रॉम बजट ID", "फ्रॉम बजट ID", "From Budget ID"),
    "virement-approvals.fieldRules.0.description": (
        "Source budget head the amount is debited from.",
        "वह source budget head जिससे amount debit होता है।",
        "तो source budget head ज्यातून amount debit होते.",
        "Wo source budget head jisse amount debit hota hai.",
    ),
    "virement-approvals.fieldRules.1.name": ("To Budget ID", "टू बजट ID", "टू बजट ID", "To Budget ID"),
    "virement-approvals.fieldRules.1.description": (
        "Destination budget head the amount is credited to.",
        "वह destination budget head जिसमें amount credit होता है।",
        "तो destination budget head ज्यामध्ये amount credit होते.",
        "Wo destination budget head jisme amount credit hota hai.",
    ),
    "virement-approvals.fieldRules.2.name": ("Amount", "राशि", "रक्कम", "Amount"),
    "virement-approvals.fieldRules.2.description": (
        "Numeric value to move; Submit Request rejects with an error if this or either ID is left blank.",
        "स्थानांतरित करने के लिए numeric value; यदि यह या कोई भी ID खाली छोड़ी जाती है तो Submit Request एक error के साथ reject करता है।",
        "स्थानांतरित करण्यासाठी numeric value; जर हे किंवा कोणतीही ID रिकामी ठेवली तर Submit Request एक error सह reject करते.",
        "Move karne ke liye numeric value; agar ye ya koi bhi ID blank chhodi jaati hai to Submit Request ek error ke saath reject ho jaata hai.",
    ),
    "virement-approvals.fieldRules.3.name": ("Reason", "कारण", "कारण", "Reason"),
    "virement-approvals.fieldRules.3.description": (
        "Optional free-text justification, shown to the approver in the queue.",
        "वैकल्पिक free-text justification, जो queue में approver को दिखाई देता है।",
        "पर्यायी free-text justification, जे queue मध्ये approver ला दाखवले जाते.",
        "Optional free-text justification, jo queue mein approver ko dikhta hai.",
    ),
    "virement-approvals.tip.title": (
        "Maker-checker is enforced server-side",
        "Maker-checker server-side पर लागू किया जाता है",
        "Maker-checker server-side वर लागू केले जाते",
        "Maker-checker server-side par enforce hota hai",
    ),
    "virement-approvals.tip.body": (
        "The approve button only shows for budget:approve holders, but the API also rejects a checker approving their own request — the requester and approver must be different users. Note also that PFMS / IFMS Sync is a Phase 2 stub: it always returns a 501 response in this environment.",
        "Approve बटन केवल budget:approve रखने वालों के लिए दिखता है, लेकिन API किसी checker को अपने ही request को approve करने से भी reject करता है — requester और approver अलग-अलग users होने चाहिए। यह भी ध्यान दें कि PFMS / IFMS Sync एक Phase 2 stub है: यह इस environment में हमेशा 501 response लौटाता है।",
        "Approve बटण फक्त budget:approve असलेल्यांनाच दिसते, पण API एखाद्या checker ला स्वतःची request approve करण्यापासूनही reject करते — requester आणि approver वेगवेगळे users असणे आवश्यक आहे. हे देखील लक्षात घ्या की PFMS / IFMS Sync हा एक Phase 2 stub आहे: तो या environment मध्ये नेहमी 501 response देतो.",
        "Approve button sirf budget:approve waalon ko dikhta hai, lekin API kisi checker ko apni hi request approve karne se bhi reject kar deta hai — requester aur approver alag-alag users hone chahiye. Ye bhi note karein ki PFMS / IFMS Sync ek Phase 2 stub hai: ye is environment mein hamesha 501 response deta hai.",
    ),
}


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 VIREMENT_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(VIREMENT_APPROVALS)} virement-approvals keys.")


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