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

Usage: docker compose exec api python seed_translations_pageinfo_purchase_orders.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)
PURCHASE_ORDERS = {
    "purchase-orders.title": (
        "Purchase Orders",
        "परचेज़ ऑर्डर",
        "परचेस ऑर्डर",
        "Purchase Orders",
    ),
    "purchase-orders.subtitle": (
        "How a PO moves from draft to closure",
        "PO मसौदे से समापन तक कैसे आगे बढ़ता है",
        "PO मसुद्यापासून समाप्तीपर्यंत कसा पुढे जातो",
        "PO draft se closure tak kaise move karta hai",
    ),
    "purchase-orders.body.0": (
        "Register of every purchase order issued to vendors, from draft through closure.",
        "vendors को जारी किए गए हर purchase order (PO) का रजिस्टर, मसौदे से लेकर समापन तक।",
        "vendors ना जारी केलेल्या प्रत्येक purchase order (PO) चा रजिस्टर, मसुद्यापासून समाप्तीपर्यंत.",
        "Vendors ko issue kiye gaye har purchase order (PO) ka register, draft se leke closure tak.",
    ),
    "purchase-orders.body.1": (
        "A PO is either raised manually against a vendor and freeform line items, or created from an awarded quotation — in which case the vendor, items, and total are locked to the agreed terms and only the delivery date and description stay editable.",
        "एक PO या तो किसी vendor और freeform line items के आधार पर मैन्युअल रूप से बनाया जाता है, या किसी awarded quotation से जनरेट किया जाता है — ऐसी स्थिति में vendor, items और total सहमत शर्तों पर लॉक हो जाते हैं, और केवल delivery date व description ही एडिट किए जा सकते हैं।",
        "एक PO एकतर एखाद्या vendor आणि freeform line items च्या आधारे manually तयार केला जातो, किंवा एखाद्या awarded quotation मधून तयार केला जातो — अशा स्थितीत vendor, items आणि total हे मान्य केलेल्या अटींनुसार लॉक होतात, आणि फक्त delivery date व description हेच एडिट करण्यायोग्य राहतात.",
        "Ek PO ya to kisi vendor aur freeform line items ke against manually raise kiya jaata hai, ya kisi awarded quotation se create hota hai — is case mein vendor, items, aur total agreed terms ke hisaab se lock ho jaate hain, aur sirf delivery date aur description hi editable rehte hain.",
    ),
    "purchase-orders.stepsHeading": (
        "PO lifecycle",
        "PO जीवनचक्र",
        "PO जीवनचक्र",
        "PO lifecycle",
    ),
    "purchase-orders.steps.0.label": ("Draft", "मसौदा", "मसुदा", "Draft"),
    "purchase-orders.steps.0.caption": (
        "Created and awaiting approval",
        "बनाया गया और अनुमोदन की प्रतीक्षा में",
        "तयार केले असून मंजुरीच्या प्रतीक्षेत",
        "Create ho chuka hai aur approval ka wait ho raha hai",
    ),
    "purchase-orders.steps.1.label": ("Approved", "स्वीकृत", "मंजूर", "Approved"),
    "purchase-orders.steps.1.caption": (
        "Signed off in PO Approvals; opens for receiving",
        "PO Approvals में साइन-ऑफ हो चुका; अब receiving के लिए खुल जाता है",
        "PO Approvals मध्ये साइन-ऑफ झाले; आता receiving साठी खुले होते",
        "PO Approvals mein sign-off ho chuka hai; ab receiving ke liye open ho jaata hai",
    ),
    "purchase-orders.steps.2.label": ("Open", "खुला", "खुले", "Open"),
    "purchase-orders.steps.2.caption": (
        "Goods can be received against it via Create GRN",
        "Create GRN के ज़रिए इसके विरुद्ध goods प्राप्त की जा सकती हैं",
        "Create GRN द्वारे याविरुद्ध goods प्राप्त करता येतात",
        "Create GRN ke through iske against goods receive ki ja sakti hain",
    ),
    "purchase-orders.steps.3.label": ("Closed", "बंद", "बंद", "Closed"),
    "purchase-orders.steps.3.caption": (
        "Manually closed once fully received or settled",
        "पूरी तरह received या settle होने पर मैन्युअली बंद किया जाता है",
        "पूर्णपणे received किंवा settle झाल्यावर manually बंद केला जातो",
        "Fully receive ya settle hone ke baad manually close kiya jaata hai",
    ),
    "purchase-orders.fieldRules.0.name": ("Vendor", "Vendor", "Vendor", "Vendor"),
    "purchase-orders.fieldRules.0.description": (
        "Required for a manual PO; auto-filled and locked when created from an awarded quotation.",
        "मैन्युअल PO के लिए आवश्यक; awarded quotation से बनाए जाने पर यह अपने-आप भर जाता है और लॉक हो जाता है।",
        "manual PO साठी आवश्यक; awarded quotation मधून तयार केल्यावर हे आपोआप भरले जाते आणि लॉक होते.",
        "Manual PO ke liye required hai; awarded quotation se create hone par ye auto-fill ho jaata hai aur lock ho jaata hai.",
    ),
    "purchase-orders.fieldRules.1.name": ("Line Items", "Line Items", "Line Items", "Line Items"),
    "purchase-orders.fieldRules.1.description": (
        "At least one item is required for a manual PO; quotation-derived POs inherit the quoted items instead.",
        "मैन्युअल PO के लिए कम से कम एक item ज़रूरी है; quotation से बने POs में इसके बजाय quoted items ही इनहेरिट होते हैं।",
        "manual PO साठी किमान एक item आवश्यक आहे; quotation मधून तयार झालेल्या POs मध्ये त्याऐवजी quoted items इनहेरिट होतात.",
        "Manual PO ke liye kam se kam ek item zaroori hai; quotation-derived POs mein iske bajaye quoted items hi inherit hote hain.",
    ),
    "purchase-orders.fieldRules.2.name": ("Total Amount", "कुल राशि", "एकूण रक्कम", "Total Amount"),
    "purchase-orders.fieldRules.2.description": (
        "Auto-computed from line items and GST; for a quotation-derived PO it's the quoted amount, not editable.",
        "line items और GST से अपने-आप कैलकुलेट होती है; quotation से बने PO के लिए यह quoted amount होती है, जिसे edit नहीं किया जा सकता।",
        "line items आणि GST वरून आपोआप calculate होते; quotation मधून तयार झालेल्या PO साठी ही quoted amount असते, जी edit करता येत नाही.",
        "Line items aur GST se auto-calculate hoti hai; quotation-derived PO ke liye ye quoted amount hoti hai, jise edit nahi kiya ja sakta.",
    ),
    "purchase-orders.fieldRules.3.name": ("PO Status", "PO स्थिति", "PO स्थिती", "PO Status"),
    "purchase-orders.fieldRules.3.description": (
        "Draft, Open, or Closed — driven by the approval decision and the Close PO action, not directly editable.",
        "मसौदा (Draft), खुला (Open), या बंद (Closed) — यह approval decision और Close PO action से तय होती है, इसे सीधे edit नहीं किया जा सकता।",
        "मसुदा (Draft), खुले (Open), किंवा बंद (Closed) — हे approval decision आणि Close PO action वरून ठरते, थेट edit करता येत नाही.",
        "Draft, Open, ya Closed — ye approval decision aur Close PO action se decide hoti hai, isse directly edit nahi kiya ja sakta.",
    ),
    "purchase-orders.fieldRules.4.name": ("Approval", "अनुमोदन", "मंजुरी", "Approval"),
    "purchase-orders.fieldRules.4.description": (
        "Pending, Approved, or Rejected — decided separately in the PO Approvals queue.",
        "लंबित (Pending), स्वीकृत (Approved), या अस्वीकृत (Rejected) — यह PO Approvals queue में अलग से तय होता है।",
        "प्रलंबित (Pending), मंजूर (Approved), किंवा नाकारलेले (Rejected) — हे PO Approvals queue मध्ये स्वतंत्रपणे ठरवले जाते.",
        "Pending, Approved, ya Rejected — ye PO Approvals queue mein alag se decide hota hai.",
    ),
    "purchase-orders.tip.title": (
        "No Create GRN / Close PO buttons?",
        "Create GRN / Close PO बटन नहीं दिख रहे?",
        "Create GRN / Close PO बटण दिसत नाहीत का?",
        "Create GRN / Close PO buttons nahi dikh rahe?",
    ),
    "purchase-orders.tip.body": (
        "Those actions only appear on rows already in Open status. A freshly created PO stays Draft/Pending until someone approves it in PO Approvals — approve it first, then the receiving actions show up here.",
        "ये actions सिर्फ उन्हीं rows पर दिखते हैं जो पहले से Open स्थिति में हैं। कोई नया बनाया गया PO तब तक मसौदा/लंबित (Draft/Pending) रहता है जब तक कोई उसे PO Approvals में अनुमोदित नहीं करता — पहले इसे अनुमोदित करें, फिर receiving actions यहाँ दिखने लगेंगे।",
        "ही actions फक्त आधीच Open स्थितीत असलेल्या rows वर दिसतात. नव्याने तयार केलेला PO तोपर्यंत मसुदा/प्रलंबित (Draft/Pending) राहतो जोपर्यंत कोणी PO Approvals मध्ये त्याला मंजुरी देत नाही — आधी त्याला मंजुरी द्या, मग receiving actions इथे दिसू लागतील.",
        "Ye actions sirf un rows par dikhte hain jo already Open status mein hain. Fresh create hua PO tab tak Draft/Pending rehta hai jab tak koi PO Approvals mein use approve nahi karta — pehle approve karo, phir receiving actions yahan dikhne lagenge.",
    ),
}


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 PURCHASE_ORDERS.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(PURCHASE_ORDERS)} purchase-orders keys.")


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