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

Usage: docker compose exec api python seed_translations_pageinfo_inventory_history.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_HISTORY = {
    "inventory-history.title": (
        "Inventory Transaction History",
        "इन्वेंटरी लेनदेन इतिहास",
        "इन्व्हेंटरी व्यवहार इतिहास",
        "Inventory Transaction History",
    ),
    "inventory-history.subtitle": (
        "Ledger of every stock movement, with balances and reversal",
        "हर stock movement का लेजर, बैलेंस और रिवर्सल के साथ",
        "प्रत्येक stock movement चे लेजर, बॅलन्स आणि रिव्हर्सलसह",
        "Har stock movement ka ledger, balances aur reversal ke saath",
    ),
    "inventory-history.body.0": (
        "Full audit trail of stock movements — receipts, issues, transfers, adjustments, returns.",
        "स्टॉक मूवमेंट्स का पूरा ऑडिट ट्रेल — receipts, issues, transfers, adjustments, returns।",
        "स्टॉक मूव्हमेंट्सचा संपूर्ण ऑडिट ट्रेल — receipts, issues, transfers, adjustments, returns.",
        "Stock movements ka poora audit trail — receipts, issues, transfers, adjustments, returns.",
    ),
    "inventory-history.body.1": (
        "Every row is written automatically when a transaction happens elsewhere (Goods Receipt, Requests/Allocations, Physical Verification) — this page is read-only history, not a place to log new movements.",
        "जब भी कहीं और (Goods Receipt, Requests/Allocations, Physical Verification) कोई transaction होता है, तो हर row अपने-आप लिखी जाती है — यह पेज केवल read-only history है, नए movements दर्ज करने की जगह नहीं।",
        "जेव्हा कुठेतरी (Goods Receipt, Requests/Allocations, Physical Verification) transaction होतो, तेव्हा प्रत्येक row आपोआप लिहिली जाते — हे पेज केवळ read-only history आहे, नवीन movements नोंदवण्याचे ठिकाण नाही.",
        "Jab bhi kahin aur (Goods Receipt, Requests/Allocations, Physical Verification) koi transaction hota hai, tab har row automatically likhi jaati hai — ye page sirf read-only history hai, naye movements log karne ki jagah nahi.",
    ),
    "inventory-history.stepsHeading": (
        "How an entry reaches this ledger",
        "एक entry इस लेजर तक कैसे पहुँचती है",
        "एक entry या लेजरपर्यंत कशी पोहोचते",
        "Ek entry is ledger tak kaise pahunchti hai",
    ),
    "inventory-history.steps.0.label": (
        "Movement Recorded",
        "मूवमेंट रिकॉर्ड हुआ",
        "मूव्हमेंट रेकॉर्ड झाले",
        "Movement Recorded",
    ),
    "inventory-history.steps.0.caption": (
        "Receipt, issue, transfer, adjustment or return posts a transaction against an item.",
        "Receipt, issue, transfer, adjustment या return किसी item के विरुद्ध एक transaction पोस्ट करता है।",
        "Receipt, issue, transfer, adjustment किंवा return एखाद्या item विरुद्ध transaction पोस्ट करते.",
        "Receipt, issue, transfer, adjustment ya return kisi item ke against ek transaction post karta hai.",
    ),
    "inventory-history.steps.1.label": (
        "Balance Updated",
        "बैलेंस अपडेट हुआ",
        "बॅलन्स अपडेट झाले",
        "Balance Updated",
    ),
    "inventory-history.steps.1.caption": (
        "The item's running stock balance is recalculated immediately after.",
        "उसके तुरंत बाद item का running stock balance फिर से calculate किया जाता है।",
        "त्यानंतर लगेच त्या item चा running stock balance पुन्हा calculate केला जातो.",
        "Uske turant baad item ka running stock balance dobara calculate hota hai.",
    ),
    "inventory-history.steps.2.label": (
        "Reviewed",
        "समीक्षा की गई",
        "पुनरावलोकन केले",
        "Reviewed",
    ),
    "inventory-history.steps.2.caption": (
        "Search by item/reason or filter by type and year to audit what happened.",
        "क्या हुआ इसका ऑडिट करने के लिए item/reason से search करें या type और year से filter करें।",
        "काय झाले याचे ऑडिट करण्यासाठी item/reason ने search करा किंवा type आणि year ने filter करा.",
        "Kya hua ye audit karne ke liye item/reason se search karein ya type aur year se filter karein.",
    ),
    "inventory-history.steps.3.label": (
        "Reversed (optional)",
        "रिवर्स किया गया (वैकल्पिक)",
        "रिव्हर्स केले (ऐच्छिक)",
        "Reversed (optional)",
    ),
    "inventory-history.steps.3.caption": (
        "An authorized user can reverse an incorrect entry, posting an offsetting transaction.",
        "एक authorized user किसी गलत entry को reverse कर सकता है, जिससे एक offsetting transaction पोस्ट होता है।",
        "एक authorized user चुकीची entry reverse करू शकतो, ज्यामुळे एक offsetting transaction पोस्ट होतो.",
        "Ek authorized user kisi galat entry ko reverse kar sakta hai, jisse ek offsetting transaction post hota hai.",
    ),
    "inventory-history.fieldRules.0.name": (
        "Type",
        "प्रकार",
        "प्रकार",
        "Type",
    ),
    "inventory-history.fieldRules.0.description": (
        "Movement category — stock in, stock out, adjustment, transfer or return; reversals show their own entries.",
        "मूवमेंट की कैटेगरी — stock in, stock out, adjustment, transfer या return; reversals अपनी अलग entries दिखाते हैं।",
        "मूव्हमेंटची कॅटेगरी — stock in, stock out, adjustment, transfer किंवा return; reversals स्वतःच्या स्वतंत्र entries दाखवतात.",
        "Movement ki category — stock in, stock out, adjustment, transfer ya return; reversals apni alag entries dikhate hain.",
    ),
    "inventory-history.fieldRules.1.name": (
        "Quantity",
        "मात्रा",
        "प्रमाण",
        "Quantity",
    ),
    "inventory-history.fieldRules.1.description": (
        "Signed amount moved on this transaction (negative for stock-out/issue types).",
        "इस transaction पर मूव हुई signed मात्रा (stock-out/issue types के लिए negative)।",
        "या transaction वर हलवलेले signed प्रमाण (stock-out/issue types साठी negative).",
        "Is transaction par move hui signed quantity (stock-out/issue types ke liye negative).",
    ),
    "inventory-history.fieldRules.2.name": (
        "Balance",
        "बैलेंस",
        "बॅलन्स",
        "Balance",
    ),
    "inventory-history.fieldRules.2.description": (
        "Running stock balance for the item immediately after this transaction applied.",
        "यह transaction apply होने के तुरंत बाद item का running stock balance।",
        "हा transaction apply झाल्यानंतर लगेच त्या item चा running stock balance.",
        "Ye transaction apply hone ke turant baad item ka running stock balance.",
    ),
    "inventory-history.fieldRules.3.name": (
        "Reason",
        "कारण",
        "कारण",
        "Reason",
    ),
    "inventory-history.fieldRules.3.description": (
        "Free-text note captured when the transaction was created; matched by the search box.",
        "transaction बनाते समय दर्ज किया गया free-text नोट; search box द्वारा मैच किया जाता है।",
        "transaction तयार करताना नोंदवलेली free-text नोट; search box द्वारे जुळवली जाते.",
        "Transaction banate waqt capture hua free-text note; search box se match hota hai.",
    ),
    "inventory-history.fieldRules.4.name": (
        "Performed At",
        "किए जाने का समय",
        "केल्याची वेळ",
        "Performed At",
    ),
    "inventory-history.fieldRules.4.description": (
        "Timestamp the transaction was recorded; drives the Year filter.",
        "जिस समय transaction रिकॉर्ड हुआ उसका timestamp; यह Year filter को नियंत्रित करता है।",
        "transaction रेकॉर्ड झाल्याची timestamp; ही Year filter नियंत्रित करते.",
        "Transaction jis time record hua uska timestamp; ye Year filter ko drive karta hai.",
    ),
    "inventory-history.tip.title": (
        "Reversal never edits history",
        "रिवर्सल कभी भी history को एडिट नहीं करता",
        "रिव्हर्सल कधीही history एडिट करत नाही",
        "Reversal kabhi bhi history ko edit nahi karta",
    ),
    "inventory-history.tip.body": (
        "Reverse posts a brand-new offsetting transaction and marks the original as \"Reversed\" — it never deletes or edits the original row. A reversal transaction itself has no Reverse button, so you can't reverse a reversal.",
        "Reverse एक बिल्कुल नया offsetting transaction पोस्ट करता है और original को \"Reversed\" के रूप में mark करता है — यह original row को कभी delete या edit नहीं करता। एक reversal transaction में खुद का कोई Reverse बटन नहीं होता, इसलिए आप किसी reversal को reverse नहीं कर सकते।",
        "Reverse एक अगदी नवीन offsetting transaction पोस्ट करतो आणि मूळ entry ला \"Reversed\" असे mark करतो — तो मूळ row कधीही delete किंवा edit करत नाही. एका reversal transaction ला स्वतःचे Reverse बटण नसते, त्यामुळे तुम्ही reversal ला reverse करू शकत नाही.",
        "Reverse ek bilkul naya offsetting transaction post karta hai aur original ko \"Reversed\" mark karta hai — ye original row ko kabhi delete ya edit nahi karta. Ek reversal transaction ke paas khud ka Reverse button nahi hota, isliye aap kisi reversal ko reverse nahi kar sakte.",
    ),
}


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_HISTORY.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_HISTORY)} inventory-history keys.")


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