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

Usage: docker compose exec api python seed_translations_pageinfo_inventory_reports.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)
INVENTORY_REPORTS = {
    "inventory-reports.title": (
        "Inventory Reports",
        "इन्वेंटरी रिपोर्ट्स",
        "इन्व्हेंटरी रिपोर्ट्स",
        "Inventory Reports",
    ),
    "inventory-reports.subtitle": (
        "Eight live views into stock health, valuation and movement",
        "स्टॉक की स्थिति, वैल्यूएशन और मूवमेंट पर आठ लाइव व्यू",
        "स्टॉकची स्थिती, व्हॅल्युएशन आणि हालचालीवर आठ लाइव्ह व्ह्यूज",
        "Stock health, valuation aur movement ke liye eight live views",
    ),
    "inventory-reports.body.0": (
        "Low-stock alerts and inventory valuation, computed live from current stock levels.",
        "लो-स्टॉक अलर्ट और इन्वेंटरी वैल्यूएशन, जो वर्तमान स्टॉक स्तरों से लाइव कैलकुलेट किए जाते हैं।",
        "लो-स्टॉक अलर्ट्स आणि इन्व्हेंटरी व्हॅल्युएशन, जे सध्याच्या स्टॉक पातळीवरून लाइव्ह कॅल्क्युलेट केले जातात.",
        "Low-stock alerts aur inventory valuation, jo current stock levels se live calculate hoti hain.",
    ),
    "inventory-reports.body.1": (
        "Every tab is computed on demand from current stock and transaction data — nothing here is a saved snapshot, so numbers always reflect the latest receipts, issues and counts.",
        "हर tab, current stock और transaction data से on-demand कैलकुलेट होता है — यहाँ कुछ भी saved snapshot नहीं है, इसलिए आंकड़े हमेशा नवीनतम receipts, issues और counts को दर्शाते हैं।",
        "प्रत्येक tab सध्याच्या stock आणि transaction data वरून on-demand कॅल्क्युलेट केला जातो — येथे काहीही saved snapshot नाही, त्यामुळे आकडे नेहमी नवीनतम receipts, issues आणि counts दर्शवतात.",
        "Har tab current stock aur transaction data se on-demand calculate hota hai — yahan kuch bhi saved snapshot nahi hai, isliye numbers hamesha latest receipts, issues aur counts reflect karte hain.",
    ),
    "inventory-reports.stepsHeading": (
        "How to read this page",
        "इस पेज को कैसे पढ़ें",
        "हे पेज कसे वाचावे",
        "Is page ko kaise padhein",
    ),
    "inventory-reports.steps.0.label": ("Pick a Tab", "एक Tab चुनें", "एक Tab निवडा", "Ek Tab pick karein"),
    "inventory-reports.steps.0.caption": (
        "Each tab is an independent report",
        "हर tab एक स्वतंत्र रिपोर्ट है",
        "प्रत्येक tab एक स्वतंत्र रिपोर्ट आहे",
        "Har tab ek independent report hai",
    ),
    "inventory-reports.steps.1.label": (
        "Filter by Year",
        "वर्ष के अनुसार फ़िल्टर करें",
        "वर्षानुसार फिल्टर करा",
        "Year ke hisaab se filter karein",
    ),
    "inventory-reports.steps.1.caption": (
        "Only applies to Ledger, Audit Variance, Aging",
        "यह केवल Ledger, Audit Variance और Aging पर लागू होता है",
        "हे फक्त Ledger, Audit Variance आणि Aging वर लागू होते",
        "Ye sirf Ledger, Audit Variance aur Aging par apply hota hai",
    ),
    "inventory-reports.steps.2.label": (
        "Review Rows",
        "पंक्तियों की समीक्षा करें",
        "रो (rows) चे पुनरावलोकन करा",
        "Rows review karein",
    ),
    "inventory-reports.steps.2.caption": (
        "Colors flag shortages and negative variance",
        "रंग shortages और negative variance को उजागर करते हैं",
        "रंग shortages आणि negative variance दर्शवतात",
        "Colors shortages aur negative variance ko flag karte hain",
    ),
    "inventory-reports.steps.3.label": ("Export", "एक्सपोर्ट करें", "एक्सपोर्ट करा", "Export karein"),
    "inventory-reports.steps.3.caption": (
        "Copy, Excel or PDF from the table toolbar",
        "table toolbar से Copy, Excel या PDF में एक्सपोर्ट करें",
        "table toolbar वरून Copy, Excel किंवा PDF मध्ये एक्सपोर्ट करा",
        "Table toolbar se Copy, Excel ya PDF mein export karein",
    ),
    "inventory-reports.fieldRules.0.name": (
        "Reorder Level",
        "रीऑर्डर लेवल",
        "रीऑर्डर लेव्हल",
        "Reorder Level",
    ),
    "inventory-reports.fieldRules.0.description": (
        "Threshold that puts an item on the Low Stock / Reorder tabs once on-hand quantity falls at or below it.",
        "वह threshold जो on-hand quantity के उस स्तर पर या उससे नीचे गिरने पर किसी item को Low Stock / Reorder tabs पर डाल देता है।",
        "ते threshold जे on-hand quantity त्या स्तरावर किंवा त्याखाली आल्यावर एखाद्या item ला Low Stock / Reorder tabs वर टाकते.",
        "Wo threshold jo on-hand quantity uss level par ya usse neeche girne par kisi item ko Low Stock / Reorder tabs par daal deta hai.",
    ),
    "inventory-reports.fieldRules.1.name": (
        "Variance",
        "वेरिएंस (Variance)",
        "व्हेरियन्स (Variance)",
        "Variance",
    ),
    "inventory-reports.fieldRules.1.description": (
        "Counted quantity minus system quantity from a physical audit; negative (red) means missing stock, positive (green) means an overage.",
        "physical audit से counted quantity में से system quantity घटाकर मिलने वाला अंतर; negative (लाल) का मतलब है stock गायब है, positive (हरा) का मतलब है overage।",
        "physical audit मधील counted quantity मधून system quantity वजा करून मिळणारा फरक; negative (लाल) म्हणजे stock गहाळ आहे, positive (हिरवा) म्हणजे overage आहे.",
        "Physical audit se counted quantity minus system quantity; negative (red) ka matlab stock missing hai, positive (green) ka matlab overage hai.",
    ),
    "inventory-reports.fieldRules.2.name": (
        "Age (days) / Bucket",
        "आयु (दिन) / बकेट",
        "वय (दिवस) / बकेट",
        "Age (days) / Bucket",
    ),
    "inventory-reports.fieldRules.2.description": (
        "Days since that stock's last movement of any kind, not since original receipt — any transaction resets it to 0.",
        "उस stock की किसी भी प्रकार की अंतिम movement के बाद से बीते दिन, न कि original receipt से — कोई भी transaction इसे 0 पर रीसेट कर देता है।",
        "त्या stock च्या कोणत्याही प्रकारच्या शेवटच्या movement नंतरचे दिवस, original receipt पासून नाही — कोणताही transaction ते 0 वर रीसेट करतो.",
        "Uss stock ki kisi bhi tarah ki last movement ke baad se guzre din, original receipt se nahi — koi bhi transaction ise 0 par reset kar deta hai.",
    ),
    "inventory-reports.fieldRules.3.name": (
        "Costing Method",
        "कॉस्टिंग मेथड",
        "कॉस्टिंग मेथड",
        "Costing Method",
    ),
    "inventory-reports.fieldRules.3.description": (
        "Valuation method (e.g. FIFO, weighted average) applied per item to compute Total Value.",
        "Total Value की गणना के लिए प्रत्येक item पर लागू किया जाने वाला valuation method (जैसे FIFO, weighted average)।",
        "Total Value मोजण्यासाठी प्रत्येक item वर लागू केली जाणारी valuation method (उदा. FIFO, weighted average).",
        "Total Value calculate karne ke liye har item par apply hone wala valuation method (jaise FIFO, weighted average).",
    ),
    "inventory-reports.tip.title": (
        "Stock Ledger is capped at 200 rows",
        "Stock Ledger अधिकतम 200 पंक्तियों तक सीमित है",
        "Stock Ledger जास्तीत जास्त 200 रो (rows) पर्यंत मर्यादित आहे",
        "Stock Ledger sirf 200 rows tak capped hai",
    ),
    "inventory-reports.tip.body": (
        "The Ledger tab loads only the most recent 200 transactions. If an item has more movement history than that, older entries won't appear — or export — even after applying the Year filter. Use the item's own transaction history for the full trail.",
        "Ledger tab केवल सबसे हाल की 200 transactions लोड करता है। अगर किसी item की movement history इससे ज़्यादा है, तो पुरानी entries न तो दिखेंगी और न ही export होंगी — Year filter लगाने के बाद भी। पूरा ट्रेल देखने के लिए item की अपनी transaction history का उपयोग करें।",
        "Ledger tab फक्त सर्वात अलीकडील 200 transactions लोड करतो. जर एखाद्या item ची movement history त्यापेक्षा जास्त असेल, तर जुन्या entries दिसणार नाहीत — किंवा export होणार नाहीत — Year filter लावल्यानंतरही. संपूर्ण trail पाहण्यासाठी item च्या स्वतःच्या transaction history चा वापर करा.",
        "Ledger tab sirf sabse recent 200 transactions load karta hai. Agar kisi item ki movement history usse zyada hai, to purani entries nazar nahi aayengi — na hi export hongi — Year filter lagane ke baad bhi. Poora trail dekhne ke liye item ki apni transaction history 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 INVENTORY_REPORTS.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(INVENTORY_REPORTS)} inventory-reports keys.")


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