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

Usage: docker compose exec api python seed_translations_pageinfo_procurement.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)
PROCUREMENT = {
    "procurement.title": (
        "Procurement Dashboard",
        "प्रोक्योरमेंट डैशबोर्ड",
        "प्रोक्युरमेंट डॅशबोर्ड",
        "Procurement Dashboard",
    ),
    "procurement.subtitle": (
        "KPI overview — not a form; use it to spot bottlenecks and jump into the right page.",
        "KPI अवलोकन — यह कोई form नहीं है; bottlenecks पहचानने और सही page पर जाने के लिए इसका उपयोग करें।",
        "KPI आढावा — हा form नाही; bottlenecks ओळखण्यासाठी आणि योग्य page वर जाण्यासाठी याचा वापर करा.",
        "KPI overview hai — ye form nahi hai; bottlenecks spot karne aur sahi page par jaane ke liye ise use karein.",
    ),
    "procurement.body.0": (
        "Requisition and purchase order activity across the organization.",
        "पूरे organization में requisition और purchase order की गतिविधि।",
        "संपूर्ण organization मधील requisition आणि purchase order क्रियाकलाप.",
        "Poore organization mein requisition aur purchase order ki activity.",
    ),
    "procurement.body.1": (
        "This page only reads and links — it has no create/edit actions of its own. Click a KPI card to drill into its live records inline, or use Quick Links to open the page where you actually raise, approve, or process something.",
        "यह page केवल data पढ़ता और link करता है — इसका अपना कोई create/edit action नहीं है। किसी KPI card पर क्लिक करके उसके live records को inline देखें, या Quick Links का उपयोग करके उस page पर जाएं जहाँ आप वास्तव में कुछ raise, approve, या process करते हैं।",
        "हे page फक्त data वाचते आणि लिंक करते — याची स्वतःची कोणतीही create/edit action नाही. एखाद्या KPI card वर क्लिक करून त्याचे live records inline पहा, किंवा Quick Links वापरून त्या page वर जा जिथे तुम्ही प्रत्यक्षात काहीतरी raise, approve किंवा process करता.",
        "Ye page sirf data read aur link karta hai — iska apna koi create/edit action nahi hai. Kisi KPI card par click karke uske live records inline dekhein, ya Quick Links use karke us page par jaayein jahan aap actually kuch raise, approve, ya process karte hain.",
    ),
    "procurement.stepsHeading": (
        "Procurement lifecycle",
        "प्रोक्योरमेंट जीवनचक्र",
        "प्रोक्युरमेंट जीवनचक्र",
        "Procurement lifecycle",
    ),
    "procurement.steps.0.label": ("Requisition", "रिक्विज़िशन", "रिक्विझिशन", "Requisition"),
    "procurement.steps.0.caption": (
        "Raise a PR, then get it approved.",
        "एक PR raise करें, फिर उसे approve करवाएं।",
        "एक PR raise करा, नंतर तो approve करवा.",
        "Ek PR raise karein, phir use approve karvayein.",
    ),
    "procurement.steps.1.label": ("RFQ & Quotes", "RFQ और Quotes", "RFQ आणि Quotes", "RFQ & Quotes"),
    "procurement.steps.1.caption": (
        "Request quotes, compare, pick a vendor.",
        "Quotes का अनुरोध करें, तुलना करें, एक vendor चुनें।",
        "Quotes साठी विनंती करा, तुलना करा, एक vendor निवडा.",
        "Quotes request karein, compare karein, ek vendor pick karein.",
    ),
    "procurement.steps.2.label": ("Purchase Order", "परचेज़ ऑर्डर", "परचेस ऑर्डर", "Purchase Order"),
    "procurement.steps.2.caption": (
        "Raise the PO, then get it approved.",
        "PO raise करें, फिर उसे approve करवाएं।",
        "PO raise करा, नंतर तो approve करवा.",
        "PO raise karein, phir use approve karvayein.",
    ),
    "procurement.steps.3.label": ("Goods Receipt", "गुड्स रिसीट", "गुड्स रिसीट", "Goods Receipt"),
    "procurement.steps.3.caption": (
        "Log what actually arrived against the PO.",
        "PO के विरुद्ध वास्तव में जो पहुंचा उसे लॉग करें।",
        "PO च्या विरुद्ध प्रत्यक्षात जे आले ते log करा.",
        "PO ke against jo actually aaya use log karein.",
    ),
    "procurement.steps.4.label": ("Invoice Check", "इनवॉइस चेक", "इनव्हॉइस चेक", "Invoice Check"),
    "procurement.steps.4.caption": (
        "Match the vendor invoice to PO/GRN before payment.",
        "payment से पहले vendor invoice को PO/GRN से match करें।",
        "payment करण्यापूर्वी vendor invoice ला PO/GRN शी match करा.",
        "Payment se pehle vendor invoice ko PO/GRN se match karein.",
    ),
    "procurement.fieldRules.0.name": (
        "Pending PR Approvals",
        "पेंडिंग PR अप्रूवल्स",
        "पेंडिंग PR अप्रूव्हल्स",
        "Pending PR Approvals",
    ),
    "procurement.fieldRules.0.description": (
        'Requisitions awaiting approval right now — a different count than "Total Requisitions", not just a status filter on it.',
        'वे requisitions जो अभी approval का इंतज़ार कर रही हैं — यह "Total Requisitions" से अलग count है, केवल उस पर एक status filter नहीं।',
        'सध्या approval ची वाट पाहत असलेल्या requisitions — हा "Total Requisitions" पेक्षा वेगळा count आहे, केवळ त्यावरील एक status filter नाही.',
        'Wo requisitions jo abhi approval ka wait kar rahi hain — ye "Total Requisitions" se alag count hai, sirf uspar ek status filter nahi.',
    ),
    "procurement.fieldRules.1.name": (
        "Pending PO Approvals",
        "पेंडिंग PO अप्रूवल्स",
        "पेंडिंग PO अप्रूव्हल्स",
        "Pending PO Approvals",
    ),
    "procurement.fieldRules.1.description": (
        "Purchase orders whose approval_status is pending — separate query from the PO total below it.",
        "वे purchase orders जिनका approval_status pending है — यह उसके नीचे दिए गए PO total से अलग query है।",
        "ज्या purchase orders चा approval_status pending आहे — हा त्याखालील PO total पेक्षा वेगळा query आहे.",
        "Wo purchase orders jinka approval_status pending hai — ye uske neeche diye PO total se alag query hai.",
    ),
    "procurement.fieldRules.2.name": (
        "PO Status / Approval Status",
        "PO स्थिति / अप्रूवल स्थिति",
        "PO स्थिती / अप्रूव्हल स्थिती",
        "PO Status / Approval Status",
    ),
    "procurement.fieldRules.2.description": (
        'PO lifecycle state and its sign-off state are tracked independently — a PO can be "approved" but still "draft", or vice versa.',
        'PO का lifecycle state और उसका sign-off state स्वतंत्र रूप से track किए जाते हैं — एक PO "approved" हो सकता है लेकिन फिर भी "draft" रह सकता है, या इसके विपरीत।',
        'PO चे lifecycle state आणि त्याचे sign-off state स्वतंत्रपणे track केले जातात — एखादा PO "approved" असू शकतो पण तरीही "draft" असू शकतो, किंवा उलट.',
        'PO ka lifecycle state aur uska sign-off state alag-alag track hote hain — ek PO "approved" ho sakta hai lekin phir bhi "draft" reh sakta hai, ya iske ulta.',
    ),
    "procurement.fieldRules.3.name": ("Total Value", "कुल मूल्य", "एकूण मूल्य", "Total Value"),
    "procurement.fieldRules.3.description": (
        "Sum of PO amounts for that status row; the page footer total sums across all rows.",
        "उस status row के लिए PO amounts का योग; page footer का total सभी rows में जोड़ता है।",
        "त्या status row साठी PO amounts ची बेरीज; page footer चा total सर्व rows मध्ये बेरीज करतो.",
        "Us status row ke liye PO amounts ka sum; page footer ka total sabhi rows mein sum karta hai.",
    ),
    "procurement.tip.title": (
        "Cards toggle, they don't navigate",
        "Cards toggle होते हैं, navigate नहीं करते",
        "Cards toggle होतात, navigate करत नाहीत",
        "Cards toggle hote hain, navigate nahi karte",
    ),
    "procurement.tip.body": (
        "Clicking a KPI card expands a live data table in place; clicking it again collapses it. Nothing here can be edited — to actually create or approve a PR/PO, use Quick Links below to open the real workspace page.",
        "किसी KPI card पर क्लिक करने से वहीं एक live data table खुल जाता है; दोबारा क्लिक करने पर यह collapse हो जाता है। यहाँ कुछ भी edit नहीं किया जा सकता — किसी PR/PO को वास्तव में create या approve करने के लिए, नीचे दिए Quick Links का उपयोग करके असली workspace page खोलें।",
        "एखाद्या KPI card वर क्लिक केल्याने तिथेच एक live data table उघडतो; पुन्हा क्लिक केल्यास तो collapse होतो. इथे काहीही edit करता येत नाही — एखादा PR/PO प्रत्यक्षात create किंवा approve करण्यासाठी, खालील Quick Links वापरून खरे workspace page उघडा.",
        "Kisi KPI card par click karne se wahin ek live data table expand hota hai; dobara click karne par wo collapse ho jaata hai. Yahan kuch bhi edit nahi kiya ja sakta — kisi PR/PO ko actually create ya approve karne ke liye, neeche diye Quick Links use karke asli workspace page kholein.",
    ),
}


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 PROCUREMENT.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(PROCUREMENT)} procurement keys.")


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