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

Usage: docker compose exec api python seed_translations_pageinfo_capitalization_review.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)
CAPITALIZATION_REVIEW = {
    "capitalization-review.title": (
        "Capitalization Review",
        "पूंजीकरण समीक्षा",
        "भांडवलीकरण पुनरावलोकन",
        "Capitalization Review",
    ),
    "capitalization-review.subtitle": (
        "Inspect one pending asset in depth before approving",
        "अनुमोदन से पहले किसी एक लंबित asset का विस्तार से निरीक्षण करें",
        "मंजुरी देण्यापूर्वी एका प्रलंबित asset ची सखोल तपासणी करा",
        "Approve karne se pehle kisi ek pending asset ko detail mein inspect karein",
    ),
    "capitalization-review.body.0": (
        "Detailed review of assets pending commissioning, with full lifecycle history.",
        "Commissioning हेतु लंबित assets की, पूरी lifecycle history के साथ विस्तृत समीक्षा।",
        "Commissioning साठी प्रलंबित असलेल्या assets चे, संपूर्ण lifecycle history सह सविस्तर पुनरावलोकन.",
        "Commissioning ke liye pending assets ki, poori lifecycle history ke saath detailed review.",
    ),
    "capitalization-review.body.1": (
        "Pick an asset from the list on the left to see its full details and lifecycle timeline on the right. Add an optional remark, then either approve it (moves it to \"Commissioned\" and starts depreciation) or send it back to Draft for correction.",
        "बाईं ओर की सूची से कोई asset चुनें ताकि दाईं ओर उसका पूरा विवरण और lifecycle timeline दिखे। एक वैकल्पिक remark जोड़ें, फिर या तो उसे approve करें (यह उसे \"Commissioned\" में ले जाता है और depreciation शुरू करता है) या सुधार के लिए उसे वापस Draft में भेज दें।",
        "डावीकडील यादीतून एखादी asset निवडा, म्हणजे उजवीकडे तिचे संपूर्ण तपशील आणि lifecycle timeline दिसेल. एक ऐच्छिक remark जोडा, नंतर एकतर तिला approve करा (यामुळे ती \"Commissioned\" मध्ये जाते आणि depreciation सुरू होते) किंवा दुरुस्तीसाठी ती परत Draft मध्ये पाठवा.",
        "Left side ki list se koi asset select karein taaki right side par uska poora detail aur lifecycle timeline dikhe. Ek optional remark add karein, phir ya to use approve karein (ye use \"Commissioned\" mein move kar deta hai aur depreciation start karta hai) ya correction ke liye use wapas Draft mein bhej dein.",
    ),
    "capitalization-review.stepsHeading": (
        "Lifecycle flow",
        "Lifecycle प्रवाह",
        "Lifecycle प्रवाह",
        "Lifecycle flow",
    ),
    "capitalization-review.steps.0.label": ("Draft", "Draft", "Draft", "Draft"),
    "capitalization-review.steps.0.caption": (
        "Asset created, not yet in service.",
        "Asset बना दिया गया है, अभी सेवा में नहीं है।",
        "Asset तयार झाली आहे, अजून सेवेत नाही.",
        "Asset create ho gaya hai, abhi service mein nahi hai.",
    ),
    "capitalization-review.steps.1.label": (
        "Pending Commissioning",
        "Pending Commissioning",
        "Pending Commissioning",
        "Pending Commissioning",
    ),
    "capitalization-review.steps.1.caption": (
        "Listed here, awaiting Finance review.",
        "यहाँ सूचीबद्ध है, Finance की समीक्षा की प्रतीक्षा में।",
        "येथे सूचीबद्ध आहे, Finance च्या पुनरावलोकनाची वाट पाहत आहे.",
        "Yahan list hui hai, Finance ke review ka wait kar rahi hai.",
    ),
    "capitalization-review.steps.2.label": ("Commissioned", "Commissioned", "Commissioned", "Commissioned"),
    "capitalization-review.steps.2.caption": (
        "Approved — depreciation schedule begins.",
        "Approve हो गया — depreciation schedule शुरू होता है।",
        "Approve झाले — depreciation schedule सुरू होते.",
        "Approve ho gaya — depreciation schedule shuru hota hai.",
    ),
    "capitalization-review.fieldRules.0.name": ("Acquisition Cost", "Acquisition Cost", "Acquisition Cost", "Acquisition Cost"),
    "capitalization-review.fieldRules.0.description": (
        "Cost carried onto the books once commissioned; the basis for depreciation.",
        "Commissioned होते ही यह लागत books में दर्ज हो जाती है; यही depreciation का आधार है।",
        "Commissioned झाल्यावर ही किंमत books मध्ये नोंदवली जाते; हाच depreciation चा आधार आहे.",
        "Commissioned hote hi ye cost books mein carry ho jaati hai; yahi depreciation ka basis hai.",
    ),
    "capitalization-review.fieldRules.1.name": ("Category", "Category", "Category", "Category"),
    "capitalization-review.fieldRules.1.description": (
        "Asset class, used for depreciation method/rate lookup after commissioning.",
        "Asset class, जिसका उपयोग commissioning के बाद depreciation method/rate जानने के लिए किया जाता है।",
        "Asset class, जी commissioning नंतर depreciation method/rate शोधण्यासाठी वापरली जाते.",
        "Asset class, jo commissioning ke baad depreciation method/rate lookup ke liye use hoti hai.",
    ),
    "capitalization-review.fieldRules.2.name": ("Useful Life", "Useful Life", "Useful Life", "Useful Life"),
    "capitalization-review.fieldRules.2.description": (
        "Override (in years) for the asset class's default depreciation period, if set.",
        "यदि सेट किया गया हो, तो asset class की default depreciation period के लिए override (वर्षों में)।",
        "जर सेट केले असेल, तर asset class च्या default depreciation period साठी override (वर्षांमध्ये).",
        "Agar set kiya gaya ho, to asset class ki default depreciation period ke liye override (years mein).",
    ),
    "capitalization-review.fieldRules.3.name": ("Remarks", "Remarks", "Remarks", "Remarks"),
    "capitalization-review.fieldRules.3.description": (
        "Optional justification saved against the transition; appears in Lifecycle History.",
        "transition के विरुद्ध सहेजा गया वैकल्पिक औचित्य; यह Lifecycle History में दिखाई देता है।",
        "transition विरुद्ध जतन केलेले ऐच्छिक औचित्य; हे Lifecycle History मध्ये दिसते.",
        "Transition ke against save hua optional justification; ye Lifecycle History mein dikhta hai.",
    ),
    "capitalization-review.tip.title": (
        "Remarks don't clear when you switch assets",
        "Asset बदलने पर Remarks साफ़ नहीं होते",
        "Asset बदलल्यावर Remarks साफ होत नाहीत",
        "Asset switch karne par Remarks clear nahi hote",
    ),
    "capitalization-review.tip.body": (
        "Clicking a different asset in the left list keeps whatever text is in Remarks — it's only cleared after a successful Approve or Send Back. Clear it manually before acting on the newly selected asset, or a note meant for one asset can end up on another's history.",
        "बाईं ओर की सूची में किसी दूसरे asset पर क्लिक करने पर Remarks में जो भी टेक्स्ट है वह बना रहता है — यह केवल सफल Approve या Send Back के बाद ही साफ़ होता है। नए चुने गए asset पर कार्रवाई करने से पहले इसे मैन्युअली साफ़ करें, वरना एक asset के लिए लिखा गया note किसी दूसरे asset की history में जा सकता है।",
        "डावीकडील यादीत वेगळ्या asset वर क्लिक केल्यास Remarks मध्ये असलेला मजकूर तसाच राहतो — तो फक्त यशस्वी Approve किंवा Send Back नंतरच साफ होतो. नव्याने निवडलेल्या asset वर कारवाई करण्यापूर्वी तो manually साफ करा, अन्यथा एका asset साठी लिहिलेली note दुसऱ्याच्या history मध्ये जाऊ शकते.",
        "Left list mein koi different asset click karne par Remarks mein jo bhi text hai wo waisa hi rehta hai — ye sirf successful Approve ya Send Back ke baad hi clear hota hai. Newly selected asset par action lene se pehle ise manually clear karein, warna ek asset ke liye likha note kisi doosre asset ki history mein chala jaa sakta hai.",
    ),
}


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 CAPITALIZATION_REVIEW.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(CAPITALIZATION_REVIEW)} capitalization-review keys.")


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