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

Usage: docker compose exec api python seed_translations_pageinfo_vendor_masters.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)
VENDOR_MASTERS = {
    "vendor-masters.title": (
        "Vendor Masters Registry",
        "वेंडर मास्टर रजिस्ट्री",
        "व्हेंडर मास्टर रजिस्ट्री",
        "Vendor Masters Registry",
    ),
    "vendor-masters.subtitle": (
        "How this registry works and what each field controls",
        "यह रजिस्ट्री कैसे काम करती है और प्रत्येक फ़ील्ड क्या नियंत्रित करती है",
        "ही रजिस्ट्री कशी कार्य करते आणि प्रत्येक फील्ड काय नियंत्रित करते",
        "Ye registry kaise kaam karti hai aur har field kya control karta hai",
    ),
    "vendor-masters.body.0": (
        "Registry of authorized enterprise suppliers, contractors, OEMs, and GeM vendors. A vendor must be registered and Active here before it can be picked on a purchase requisition, RFQ, PO, or contract.",
        "यह अधिकृत enterprise suppliers, contractors, OEMs, और GeM vendors की रजिस्ट्री है। किसी vendor को purchase requisition, RFQ, PO, या contract पर चुने जाने से पहले यहाँ registered और Active होना ज़रूरी है।",
        "ही अधिकृत enterprise suppliers, contractors, OEMs आणि GeM vendors ची रजिस्ट्री आहे. एखाद्या vendor ला purchase requisition, RFQ, PO किंवा contract वर निवडण्यापूर्वी येथे registered आणि Active असणे आवश्यक आहे.",
        "Ye authorized enterprise suppliers, contractors, OEMs, aur GeM vendors ki registry hai. Kisi vendor ko purchase requisition, RFQ, PO, ya contract par select karne se pehle yahan registered aur Active hona zaroori hai.",
    ),
    "vendor-masters.body.1": (
        "Vendor Code, GSTIN/PAN and bank details are captured once and reused across every procurement document; 'Sync GeM' pulls vendor records from the Government e-Marketplace into this same registry.",
        "Vendor Code, GSTIN/PAN और bank details एक बार दर्ज की जाती हैं और हर procurement document में दोबारा उपयोग होती हैं; 'Sync GeM' Government e-Marketplace से vendor records खींचकर इसी रजिस्ट्री में लाता है।",
        "Vendor Code, GSTIN/PAN आणि bank details एकदाच नोंदवल्या जातात आणि प्रत्येक procurement document मध्ये पुन्हा वापरल्या जातात; 'Sync GeM' Government e-Marketplace मधून vendor records खेचून याच रजिस्ट्रीमध्ये आणते.",
        "Vendor Code, GSTIN/PAN aur bank details ek baar capture hoti hain aur har procurement document mein reuse hoti hain; 'Sync GeM' Government e-Marketplace se vendor records khinch kar isi registry mein le aata hai.",
    ),
    "vendor-masters.stepsHeading": (
        "How a vendor's status moves",
        "किसी vendor की स्थिति कैसे बदलती है",
        "एखाद्या vendor ची स्थिती कशी बदलते",
        "Ek vendor ka status kaise badalta hai",
    ),
    "vendor-masters.steps.0.label": ("Registered", "पंजीकृत", "नोंदणीकृत", "Registered"),
    "vendor-masters.steps.0.caption": (
        "Vendor code + GSTIN/PAN captured",
        "Vendor code + GSTIN/PAN दर्ज",
        "Vendor code + GSTIN/PAN नोंदवले",
        "Vendor code + GSTIN/PAN capture hota hai",
    ),
    "vendor-masters.steps.1.label": ("Active", "सक्रिय", "सक्रिय", "Active"),
    "vendor-masters.steps.1.caption": (
        "Selectable on POs, RFQs, contracts",
        "POs, RFQs, contracts पर चयन योग्य",
        "POs, RFQs, contracts वर निवडण्यायोग्य",
        "POs, RFQs, contracts par selectable",
    ),
    "vendor-masters.steps.2.label": ("Suspended", "निलंबित", "निलंबित", "Suspended"),
    "vendor-masters.steps.2.caption": (
        "Blocked with a reason; hidden from new deals",
        "कारण सहित अवरुद्ध; नए deals से छिपा हुआ",
        "कारणासह अवरोधित; नवीन deals मधून लपवलेले",
        "Reason ke saath block hota hai; naye deals se hidden",
    ),
    "vendor-masters.steps.3.label": ("Reinstated", "पुनर्बहाल", "पुनर्स्थापित", "Reinstated"),
    "vendor-masters.steps.3.caption": (
        "Restored to Active in one click",
        "एक क्लिक में Active पर पुनर्स्थापित",
        "एका क्लिकमध्ये Active वर पुनर्संचयित",
        "Ek click mein Active pe restore ho jaata hai",
    ),
    "vendor-masters.fieldRules.0.name": ("Vendor Code", "Vendor Code", "Vendor Code", "Vendor Code"),
    "vendor-masters.fieldRules.0.description": (
        "Auto-suggested as VND-YYYY-NNNNN when you open Add Vendor; edit it to keep a legacy code instead.",
        "Add Vendor खोलने पर VND-YYYY-NNNNN के रूप में auto-suggest होता है; legacy code रखने के लिए इसे edit करें।",
        "Add Vendor उघडल्यावर VND-YYYY-NNNNN स्वरूपात auto-suggest होते; legacy code ठेवण्यासाठी ते edit करा.",
        "Add Vendor open karne par VND-YYYY-NNNNN ke roop mein auto-suggest hota hai; legacy code rakhne ke liye ise edit karein.",
    ),
    "vendor-masters.fieldRules.1.name": ("Vendor Name", "Vendor Name", "Vendor Name", "Vendor Name"),
    "vendor-masters.fieldRules.1.description": (
        "Registered business name shown on every PO, RFQ, and contract referencing this vendor.",
        "इस vendor का संदर्भ देने वाले हर PO, RFQ, और contract पर दिखाया जाने वाला registered business name।",
        "या vendor चा संदर्भ देणाऱ्या प्रत्येक PO, RFQ, आणि contract वर दाखवले जाणारे registered business name.",
        "Is vendor ko reference karne wale har PO, RFQ, aur contract par dikhaya jaane wala registered business name.",
    ),
    "vendor-masters.fieldRules.2.name": ("Vendor Type", "Vendor Type", "Vendor Type", "Vendor Type"),
    "vendor-masters.fieldRules.2.description": (
        "Supplier, Contractor, Service Provider, OEM, GeM Vendor, or Other — controls which procurement forms list this vendor.",
        "Supplier, Contractor, Service Provider, OEM, GeM Vendor, या Other — यह नियंत्रित करता है कि कौन-से procurement forms में यह vendor सूचीबद्ध होगा।",
        "Supplier, Contractor, Service Provider, OEM, GeM Vendor, किंवा Other — हे ठरवते की कोणत्या procurement forms मध्ये हा vendor सूचीबद्ध होईल.",
        "Supplier, Contractor, Service Provider, OEM, GeM Vendor, ya Other — ye control karta hai ki kaunse procurement forms mein ye vendor list hoga.",
    ),
    "vendor-masters.fieldRules.3.name": ("GSTIN", "GSTIN", "GSTIN", "GSTIN"),
    "vendor-masters.fieldRules.3.description": (
        "Must match the 15-character GST format if entered; 'Fetch company data' can auto-fill the name from it.",
        "यदि दर्ज किया जाए तो 15-character GST format से मेल खाना चाहिए; 'Fetch company data' इससे name auto-fill कर सकता है।",
        "जर नोंदवले असेल तर 15-character GST format शी जुळले पाहिजे; 'Fetch company data' यावरून name auto-fill करू शकते.",
        "Agar enter kiya jaaye to 15-character GST format se match hona chahiye; 'Fetch company data' isse name auto-fill kar sakta hai.",
    ),
    "vendor-masters.fieldRules.4.name": ("Bank IFSC Code", "Bank IFSC Code", "Bank IFSC Code", "Bank IFSC Code"),
    "vendor-masters.fieldRules.4.description": (
        "Validated against the 11-character IFSC format before it's saved for payments.",
        "payments के लिए save होने से पहले इसे 11-character IFSC format के विरुद्ध validate किया जाता है।",
        "payments साठी save होण्यापूर्वी ते 11-character IFSC format विरुद्ध validate केले जाते.",
        "Payments ke liye save hone se pehle ise 11-character IFSC format ke against validate kiya jaata hai.",
    ),
    "vendor-masters.tip.title": (
        "GST auto-fill is partial",
        "GST auto-fill अधूरा है",
        "GST auto-fill अपूर्ण आहे",
        "GST auto-fill partial hota hai",
    ),
    "vendor-masters.tip.body": (
        "'Fetch company data' next to GSTIN only pulls the registered name and GST status — email and phone are never returned by that API, so re-enter contact details manually even after a successful fetch.",
        "GSTIN के बगल में 'Fetch company data' केवल registered name और GST status लाता है — email और phone उस API से कभी नहीं मिलते, इसलिए successful fetch के बाद भी contact details मैन्युअल रूप से दोबारा दर्ज करें।",
        "GSTIN च्या शेजारी असलेले 'Fetch company data' फक्त registered name आणि GST status आणते — email आणि phone त्या API कडून कधीच मिळत नाहीत, त्यामुळे successful fetch नंतरही contact details मॅन्युअली पुन्हा नोंदवा.",
        "GSTIN ke bagal mein 'Fetch company data' sirf registered name aur GST status laata hai — email aur phone us API se kabhi nahi milte, isliye successful fetch ke baad bhi contact details manually re-enter 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 VENDOR_MASTERS.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(VENDOR_MASTERS)} vendor-masters keys.")


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