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

Usage: docker compose exec api python seed_translations_pageinfo_inventory_register.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_REGISTER = {
    "inventory-register.title": (
        "Inventory Item Register",
        "इन्वेंटरी आइटम रजिस्टर",
        "इन्व्हेंटरी आयटम रजिस्टर",
        "Inventory Item Register",
    ),
    "inventory-register.subtitle": (
        "The master item catalog behind every stock action",
        "हर stock action के पीछे मौजूद मास्टर आइटम कैटलॉग",
        "प्रत्येक stock action मागील मास्टर आयटम कॅटलॉग",
        "Har stock action ke peeche ka master item catalog",
    ),
    "inventory-register.body.0": (
        "Master list of inventory items with reorder rules and stock actions.",
        "reorder नियमों और stock actions के साथ inventory items की मास्टर सूची।",
        "reorder नियम आणि stock actions सह inventory items ची मास्टर यादी.",
        "Reorder rules aur stock actions ke saath inventory items ki master list.",
    ),
    "inventory-register.body.1": (
        "Every stock-in, stock-out, adjustment, transfer, and return is recorded against an item registered here. Qty shown in the table is the on-hand total across all locations combined — click an item's name or quantity to see the per-location breakdown.",
        "हर stock-in, stock-out, adjustment, transfer और return यहाँ registered किसी item के विरुद्ध दर्ज किया जाता है। table में दिखाई गई Qty सभी locations को मिलाकर on-hand कुल है — per-location breakdown देखने के लिए किसी item के नाम या quantity पर क्लिक करें।",
        "प्रत्येक stock-in, stock-out, adjustment, transfer आणि return इथे registered असलेल्या item विरुद्ध नोंदवला जातो. table मध्ये दाखवलेली Qty सर्व locations एकत्र करून on-hand एकूण आहे — per-location breakdown पाहण्यासाठी item च्या नावावर किंवा quantity वर क्लिक करा.",
        "Har stock-in, stock-out, adjustment, transfer, aur return yahan register hui kisi item ke against record hota hai. Table mein dikhayi gayi Qty saari locations milakar on-hand total hai — per-location breakdown dekhne ke liye item ke naam ya quantity par click karein.",
    ),
    "inventory-register.stepsHeading": (
        "How an item is used",
        "एक item का उपयोग कैसे होता है",
        "एखादी item कशी वापरली जाते",
        "Ek item kaise use hoti hai",
    ),
    "inventory-register.steps.0.label": ("Register", "रजिस्टर करें", "रजिस्टर करा", "Register"),
    "inventory-register.steps.0.caption": (
        "Unique code, unit, reorder rule",
        "अद्वितीय code, unit, reorder नियम",
        "अद्वितीय code, unit, reorder नियम",
        "Unique code, unit, reorder rule",
    ),
    "inventory-register.steps.1.label": ("Stock Actions", "स्टॉक क्रियाएँ", "स्टॉक क्रिया", "Stock Actions"),
    "inventory-register.steps.1.caption": (
        "In, out, adjust, transfer, return",
        "In, out, adjust, transfer, return",
        "In, out, adjust, transfer, return",
        "In, out, adjust, transfer, return",
    ),
    "inventory-register.steps.2.label": ("Monitor", "निगरानी करें", "निरीक्षण करा", "Monitor"),
    "inventory-register.steps.2.caption": (
        "Qty turns amber at reorder level",
        "reorder level पर पहुँचने पर Qty amber हो जाती है",
        "reorder level वर पोहोचल्यावर Qty amber होते",
        "Reorder level par pahunchte hi Qty amber ho jaati hai",
    ),
    "inventory-register.steps.3.label": ("Deactivate", "निष्क्रिय करें", "निष्क्रिय करा", "Deactivate"),
    "inventory-register.steps.3.caption": (
        "Delete is non-destructive",
        "Delete विनाशकारी नहीं है",
        "Delete विध्वंसक नाही",
        "Delete non-destructive hota hai",
    ),
    "inventory-register.fieldRules.0.name": ("Item Code", "आइटम कोड", "आयटम कोड", "Item Code"),
    "inventory-register.fieldRules.0.description": (
        "Unique identifier; locked once created and checked case-insensitively against existing codes before save.",
        "अद्वितीय पहचानकर्ता; बनने के बाद लॉक हो जाता है और save से पहले मौजूदा codes के विरुद्ध case-insensitive रूप से जाँचा जाता है।",
        "अद्वितीय ओळखकर्ता; तयार झाल्यावर लॉक होतो आणि save करण्यापूर्वी विद्यमान codes विरुद्ध case-insensitive पद्धतीने तपासला जातो.",
        "Unique identifier hai; create hone ke baad lock ho jaata hai aur save se pehle existing codes ke against case-insensitive check hota hai.",
    ),
    "inventory-register.fieldRules.1.name": ("Unit of Measure", "माप की इकाई", "मोजमापाचे एकक", "Unit of Measure"),
    "inventory-register.fieldRules.1.description": (
        "Selected from UOM masters; a legacy free-text unit not in that list is preserved when editing an existing item.",
        "UOM masters से select किया जाता है; यदि किसी मौजूदा item में उस list में न होने वाला legacy free-text unit हो, तो edit करते समय वह सुरक्षित रहता है।",
        "UOM masters मधून निवडले जाते; एखाद्या विद्यमान item मध्ये त्या list मध्ये नसलेले legacy free-text unit असल्यास, edit करताना ते जतन केले जाते.",
        "UOM masters se select hota hai; agar kisi existing item mein us list mein na hone wala legacy free-text unit ho, to edit karte waqt wo preserve rehta hai.",
    ),
    "inventory-register.fieldRules.2.name": ("Reorder Level", "पुनः-आदेश स्तर", "पुनर्आदेश स्तर", "Reorder Level"),
    "inventory-register.fieldRules.2.description": (
        "Threshold that turns the Qty column amber once on-hand stock falls to or below it.",
        "वह सीमा जिस पर on-hand stock पहुँचने या उससे नीचे जाने पर Qty column amber हो जाता है।",
        "ती मर्यादा जिथे on-hand stock पोहोचल्यावर किंवा त्याखाली गेल्यावर Qty column amber होतो.",
        "Wo threshold jahan on-hand stock pahunchne ya usse neeche jaane par Qty column amber ho jaata hai.",
    ),
    "inventory-register.fieldRules.3.name": ("Reorder Quantity", "पुनः-आदेश मात्रा", "पुनर्आदेश प्रमाण", "Reorder Quantity"),
    "inventory-register.fieldRules.3.description": (
        "Suggested quantity to reorder when stock is low; informational only, not enforced automatically.",
        "stock कम होने पर पुनः-आदेश हेतु सुझाई गई मात्रा; यह केवल सूचनात्मक है, स्वतः लागू नहीं होती।",
        "stock कमी असताना पुनर्आदेशासाठी सुचवलेले प्रमाण; हे फक्त माहितीसाठी आहे, आपोआप लागू होत नाही.",
        "Stock kam hone par reorder ke liye suggested quantity; ye sirf informational hai, automatically enforce nahi hoti.",
    ),
    "inventory-register.fieldRules.4.name": ("Costing Method", "लागत निर्धारण विधि", "किंमत निर्धारण पद्धत", "Costing Method"),
    "inventory-register.fieldRules.4.description": (
        "FIFO, LIFO, or Weighted Average used for stock valuation; defaults to FIFO.",
        "stock valuation के लिए FIFO, LIFO, या Weighted Average का उपयोग किया जाता है; डिफ़ॉल्ट रूप से FIFO होता है।",
        "stock valuation साठी FIFO, LIFO, किंवा Weighted Average वापरले जाते; डिफॉल्टने FIFO असते.",
        "Stock valuation ke liye FIFO, LIFO, ya Weighted Average use hota hai; default FIFO hota hai.",
    ),
    "inventory-register.tip.title": (
        "Bulk uploads are all-or-nothing",
        "Bulk uploads पूरी तरह से या बिल्कुल नहीं वाले होते हैं",
        "Bulk uploads सर्वकाही किंवा काहीच नाही या तत्त्वावर चालतात",
        "Bulk uploads all-or-nothing hote hain",
    ),
    "inventory-register.tip.body": (
        "Stock bulk uploads run as a single transaction — if any row has an unknown item_code, invalid quantity, or (for transfers) a missing from/to location, the entire file is rejected and zero rows are recorded. Download the template first; rows are matched to items purely by item_code, which must already exist in the register above.",
        "Stock bulk uploads एक ही transaction के रूप में चलते हैं — यदि किसी row में अज्ञात item_code, अमान्य quantity, या (transfers के लिए) from/to location गायब है, तो पूरी file reject हो जाती है और शून्य rows दर्ज होते हैं। पहले template download करें; rows को items से मिलाने का आधार केवल item_code है, जो ऊपर दिए गए register में पहले से मौजूद होना चाहिए।",
        "Stock bulk uploads एका single transaction म्हणून चालतात — जर एखाद्या row मध्ये अज्ञात item_code, अवैध quantity, किंवा (transfers साठी) from/to location गहाळ असेल, तर संपूर्ण file नाकारली जाते आणि शून्य rows नोंदवल्या जातात. आधी template डाउनलोड करा; rows items शी जुळवण्याचा आधार फक्त item_code आहे, जो वरील register मध्ये आधीच अस्तित्वात असणे आवश्यक आहे.",
        "Stock bulk uploads ek hi single transaction ke roop mein chalte hain — agar kisi row mein unknown item_code, invalid quantity, ya (transfers ke liye) missing from/to location ho, to poori file reject ho jaati hai aur zero rows record hote hain. Pehle template download karein; rows ko items se match karne ka aadhaar sirf item_code hai, jo upar wale register mein pehle se exist karna chahiye.",
    ),
}


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_REGISTER.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_REGISTER)} inventory-register keys.")


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