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

Usage: docker compose exec api python seed_translations_pageinfo_rfq_management.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)
RFQ_MANAGEMENT = {
    "rfq-management.title": (
        "RFQ Management",
        "RFQ प्रबंधन",
        "RFQ व्यवस्थापन",
        "RFQ Management",
    ),
    "rfq-management.subtitle": (
        "Invite vendors to quote, then close and award.",
        "Vendors को quote के लिए आमंत्रित करें, फिर close करके award करें।",
        "Vendors ना quote साठी आमंत्रित करा, नंतर close करून award करा.",
        "Vendors ko quote karne ke liye invite karo, phir close karke award karo.",
    ),
    "rfq-management.body.0": (
        "Solicit vendor quotations for approved purchase requisitions.",
        "स्वीकृत purchase requisitions के लिए vendor quotations आमंत्रित करें।",
        "मंजूर purchase requisitions साठी vendor quotations मागवा.",
        "Approved purchase requisitions ke liye vendor quotations solicit karo.",
    ),
    "rfq-management.body.1": (
        "An RFQ can stand alone or link a purchase requisition — linking splits the PR item-by-item, so items already tendered in another draft, open, or closed RFQ are locked out of the picker until that RFQ is cancelled or awarded.",
        "एक RFQ स्वतंत्र हो सकता है या किसी purchase requisition से लिंक हो सकता है — लिंक करने पर PR आइटम-दर-आइटम विभाजित हो जाता है, इसलिए जो items किसी अन्य draft, open, या closed RFQ में पहले से tender किए जा चुके हैं, वे तब तक picker से लॉक रहते हैं जब तक वह RFQ cancel या award नहीं हो जाता।",
        "एक RFQ स्वतंत्र असू शकतो किंवा एखाद्या purchase requisition शी लिंक होऊ शकतो — लिंक केल्याने PR item-by-item विभागला जातो, त्यामुळे इतर एखाद्या draft, open, किंवा closed RFQ मध्ये आधीच tender झालेले items ते RFQ cancel किंवा award होईपर्यंत picker मधून लॉक राहतात.",
        "Ek RFQ standalone ho sakta hai ya kisi purchase requisition ko link kar sakta hai — link karne se PR item-by-item split ho jaata hai, isliye jo items kisi aur draft, open, ya closed RFQ mein already tender ho chuke hain, wo tab tak picker mein se locked rehte hain jab tak wo RFQ cancel ya award nahi ho jaata.",
    ),
    "rfq-management.stepsHeading": (
        "RFQ lifecycle",
        "RFQ जीवनचक्र",
        "RFQ जीवनचक्र",
        "RFQ lifecycle",
    ),
    "rfq-management.steps.0.label": ("Draft", "मसौदा", "मसुदा", "Draft"),
    "rfq-management.steps.0.caption": (
        "Created but not yet sent to vendors.",
        "बनाया गया लेकिन अभी तक vendors को नहीं भेजा गया।",
        "तयार केले पण अद्याप vendors ना पाठवलेले नाही.",
        "Create ho chuka hai lekin abhi tak vendors ko bheja nahi gaya.",
    ),
    "rfq-management.steps.1.label": ("Open", "खुला", "खुले", "Open"),
    "rfq-management.steps.1.caption": (
        "Invites sent; vendors submit quotations until the closing date.",
        "Invites भेज दिए गए हैं; vendors closing date तक quotations सबमिट कर सकते हैं।",
        "Invites पाठवले गेले आहेत; vendors closing date पर्यंत quotations सबमिट करू शकतात.",
        "Invites bhej diye gaye hain; vendors closing date tak quotations submit kar sakte hain.",
    ),
    "rfq-management.steps.2.label": ("Closed", "बंद", "बंद", "Closed"),
    "rfq-management.steps.2.caption": (
        "No more quotes accepted; ready for comparison.",
        "अब और quotes स्वीकार नहीं किए जाते; comparison के लिए तैयार।",
        "आता आणखी quotes स्वीकारले जात नाहीत; comparison साठी तयार.",
        "Ab aur quotes accept nahi kiye jaate; comparison ke liye ready.",
    ),
    "rfq-management.steps.3.label": ("Awarded", "अवॉर्डेड", "अवॉर्डेड", "Awarded"),
    "rfq-management.steps.3.caption": (
        "A winning quotation is selected on the Quotation Comparison page.",
        "Quotation Comparison page पर एक विजेता quotation चुनी जाती है।",
        "Quotation Comparison page वर एक विजेती quotation निवडली जाते.",
        "Quotation Comparison page par ek winning quotation select ki jaati hai.",
    ),
    "rfq-management.fieldRules.0.name": (
        "Link Purchase Requisition",
        "Purchase Requisition लिंक करें",
        "Purchase Requisition लिंक करा",
        "Link Purchase Requisition",
    ),
    "rfq-management.fieldRules.0.description": (
        "Optional — pick an approved PR to tender its items; leave as standalone for RFQs with no PR.",
        "वैकल्पिक — किसी स्वीकृत PR को उसके items tender करने के लिए चुनें; बिना PR वाले RFQs के लिए इसे standalone छोड़ दें।",
        "पर्यायी — एखाद्या मंजूर PR ची items tender करण्यासाठी ती निवडा; PR नसलेल्या RFQs साठी standalone ठेवा.",
        "Optional — kisi approved PR ko uske items tender karne ke liye select karo; bina PR wale RFQs ke liye ise standalone chhod do.",
    ),
    "rfq-management.fieldRules.1.name": (
        "Items to Tender",
        "Tender करने योग्य Items",
        "Tender करावयाची Items",
        "Items to Tender",
    ),
    "rfq-management.fieldRules.1.description": (
        "Required once a PR is linked; items already locked into another active RFQ are disabled.",
        "PR लिंक होने के बाद यह आवश्यक है; किसी अन्य active RFQ में पहले से लॉक हो चुके items disabled रहते हैं।",
        "PR लिंक झाल्यावर हे आवश्यक आहे; दुसऱ्या एखाद्या active RFQ मध्ये आधीच लॉक झालेली items disabled असतात.",
        "PR link hone ke baad ye required hai; kisi aur active RFQ mein already lock ho chuke items disabled rehte hain.",
    ),
    "rfq-management.fieldRules.2.name": ("RFQ Title", "RFQ Title", "RFQ Title", "RFQ Title"),
    "rfq-management.fieldRules.2.description": (
        "Auto-filled from the linked PR's description if left blank when a PR is selected.",
        "यदि PR चुने जाने पर इसे खाली छोड़ा जाए, तो यह linked PR के description से auto-fill हो जाता है।",
        "जर PR निवडताना हे रिकामे ठेवले, तर ते linked PR च्या description वरून auto-fill होते.",
        "Agar PR select karte waqt ise blank chhoda jaaye, to ye linked PR ki description se auto-fill ho jaata hai.",
    ),
    "rfq-management.fieldRules.3.name": (
        "Closing Date",
        "समापन तिथि",
        "समाप्ती तारीख",
        "Closing Date",
    ),
    "rfq-management.fieldRules.3.description": (
        "Deadline shown to invited vendors for submitting quotations.",
        "quotations सबमिट करने के लिए invited vendors को दिखाई जाने वाली deadline।",
        "quotations सबमिट करण्यासाठी invited vendors ना दाखवली जाणारी deadline.",
        "Quotations submit karne ke liye invited vendors ko dikhayi jaane wali deadline.",
    ),
    "rfq-management.fieldRules.4.name": (
        "Invite Vendors",
        "Vendors को आमंत्रित करें",
        "Vendors ना आमंत्रित करा",
        "Invite Vendors",
    ),
    "rfq-management.fieldRules.4.description": (
        "At least one vendor must be selected before the RFQ can be published.",
        "RFQ publish होने से पहले कम से कम एक vendor चुना जाना चाहिए।",
        "RFQ publish होण्यापूर्वी किमान एक vendor निवडलेला असणे आवश्यक आहे.",
        "RFQ publish hone se pehle kam se kam ek vendor select karna zaroori hai.",
    ),
    "rfq-management.tip.title": (
        "Cancelling releases items",
        "Cancel करने पर items रिलीज़ हो जाते हैं",
        "Cancel केल्याने items रिलीज होतात",
        "Cancel karne se items release ho jaate hain",
    ),
    "rfq-management.tip.body": (
        "Cancelling a draft, open, or closed RFQ immediately frees its tendered PR items back to the pool, so they become selectable again in any new RFQ for that requisition — no need to edit the PR itself.",
        "किसी draft, open, या closed RFQ को cancel करने पर उसके tender किए गए PR items तुरंत वापस pool में free हो जाते हैं, जिससे वे उस requisition के लिए किसी भी नए RFQ में फिर से चुने जा सकते हैं — PR को खुद edit करने की ज़रूरत नहीं है।",
        "एखादी draft, open, किंवा closed RFQ cancel केल्याने तिचे tender केलेले PR items लगेच pool मध्ये परत free होतात, त्यामुळे ते त्या requisition साठी कोणत्याही नवीन RFQ मध्ये पुन्हा निवडता येतात — PR स्वतः edit करण्याची गरज नाही.",
        "Kisi draft, open, ya closed RFQ ko cancel karne se uske tender kiye gaye PR items turant wapas pool mein free ho jaate hain, isliye wo us requisition ke liye kisi bhi naye RFQ mein dobara select ho sakte hain — PR ko khud edit karne ki zaroorat nahi 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 RFQ_MANAGEMENT.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(RFQ_MANAGEMENT)} rfq-management keys.")


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