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

Usage: docker compose exec api python seed_translations_pageinfo_capitalization_queue.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_QUEUE = {
    "capitalization-queue.title": (
        "Asset Capitalization Queue",
        "एसेट कैपिटलाइज़ेशन क्यू",
        "एसेट कॅपिटलायझेशन क्यू",
        "Asset Capitalization Queue",
    ),
    "capitalization-queue.subtitle": (
        "Commission pending assets and start depreciation",
        "पेंडिंग assets को commission करें और depreciation शुरू करें",
        "प्रलंबित assets commission करा आणि depreciation सुरू करा",
        "Pending assets ko commission karein aur depreciation start karein",
    ),
    "capitalization-queue.body.0": (
        "Assets pending commissioning, ready to be capitalized into active depreciation ledgers.",
        "Commissioning के लिए पेंडिंग assets, जो active depreciation ledgers में capitalize करने के लिए तैयार हैं।",
        "Commissioning साठी प्रलंबित assets, जे active depreciation ledgers मध्ये capitalize करण्यासाठी तयार आहेत.",
        "Commissioning ke liye pending assets, jo active depreciation ledgers mein capitalize karne ke liye ready hain.",
    ),
    "capitalization-queue.body.1": (
        "Every row here is an asset in the \"Pending Commissioning\" lifecycle state. Select one, add an optional remark, then either capitalize it (moves it to \"Commissioned\" and starts its depreciation schedule) or send it back to Draft for correction.",
        "यहाँ हर row एक asset है जो \"Pending Commissioning\" lifecycle state में है। किसी एक को चुनें, एक वैकल्पिक remark जोड़ें, फिर या तो उसे capitalize करें (यह \"Commissioned\" में बदल जाता है और इसका depreciation schedule शुरू हो जाता है) या सुधार के लिए इसे Draft में वापस भेजें।",
        "येथे प्रत्येक row एक asset आहे जी \"Pending Commissioning\" lifecycle state मध्ये आहे. एखादी निवडा, ऐच्छिक remark जोडा, नंतर एकतर ती capitalize करा (ती \"Commissioned\" मध्ये जाते आणि तिचे depreciation schedule सुरू होते) किंवा दुरुस्तीसाठी ती Draft मध्ये परत पाठवा.",
        "Yahan har row ek asset hai jo \"Pending Commissioning\" lifecycle state mein hai. Ek select karein, ek optional remark add karein, phir ya to usse capitalize karein (ye \"Commissioned\" mein move ho jaata hai aur uska depreciation schedule shuru ho jaata hai) ya correction ke liye Draft mein wapas bhej dein.",
    ),
    "capitalization-queue.stepsHeading": (
        "Lifecycle flow",
        "लाइफसाइकल फ्लो",
        "लाइफसायकल फ्लो",
        "Lifecycle flow",
    ),
    "capitalization-queue.steps.0.label": ("Draft", "ड्राफ्ट", "ड्राफ्ट", "Draft"),
    "capitalization-queue.steps.0.caption": (
        "Asset created, not yet in service.",
        "Asset बनाया गया, अभी सेवा में नहीं है।",
        "Asset तयार केली, अजून सेवेत नाही.",
        "Asset create ho gaya hai, abhi service mein nahi hai.",
    ),
    "capitalization-queue.steps.1.label": (
        "Pending Commissioning",
        "पेंडिंग कमीशनिंग",
        "प्रलंबित कमिशनिंग",
        "Pending Commissioning",
    ),
    "capitalization-queue.steps.1.caption": (
        "Appears in this queue, awaiting Finance review.",
        "इस queue में दिखाई देता है, Finance review का इंतज़ार करते हुए।",
        "या queue मध्ये दिसते, Finance review ची वाट पाहत आहे.",
        "Is queue mein dikhta hai, Finance review ka wait karte hue.",
    ),
    "capitalization-queue.steps.2.label": ("Commissioned", "कमीशंड", "कमिशन्ड", "Commissioned"),
    "capitalization-queue.steps.2.caption": (
        "Capitalized — depreciation schedule begins.",
        "Capitalize हो गया — depreciation schedule शुरू होता है।",
        "Capitalize झाले — depreciation schedule सुरू होते.",
        "Capitalize ho gaya — depreciation schedule shuru hota hai.",
    ),
    "capitalization-queue.fieldRules.0.name": ("Cost", "लागत", "किंमत", "Cost"),
    "capitalization-queue.fieldRules.0.description": (
        "Acquisition cost carried onto the books; also drives the Total Asset Value KPI.",
        "Acquisition cost जो books में दर्ज की जाती है; यह Total Asset Value KPI को भी drive करती है।",
        "Acquisition cost जी books मध्ये नोंदवली जाते; ती Total Asset Value KPI देखील चालवते.",
        "Acquisition cost jo books mein carry hoti hai; ye Total Asset Value KPI ko bhi drive karti hai.",
    ),
    "capitalization-queue.fieldRules.1.name": ("Category", "श्रेणी", "श्रेणी", "Category"),
    "capitalization-queue.fieldRules.1.description": (
        "Asset class, used for depreciation method/rate lookup once commissioned.",
        "Asset class, जिसका उपयोग commission होने के बाद depreciation method/rate lookup के लिए किया जाता है।",
        "Asset class, जी commission झाल्यानंतर depreciation method/rate lookup साठी वापरली जाते.",
        "Asset class, jo commission hone ke baad depreciation method/rate lookup ke liye use hoti hai.",
    ),
    "capitalization-queue.fieldRules.2.name": ("Remarks", "टिप्पणियाँ", "शेरा", "Remarks"),
    "capitalization-queue.fieldRules.2.description": (
        "Optional justification stored against the transition; shown on the asset's history log.",
        "वैकल्पिक justification जो transition के विरुद्ध store होता है; यह asset के history log में दिखाया जाता है।",
        "ऐच्छिक justification जे transition विरुद्ध store होते; ते asset च्या history log मध्ये दाखवले जाते.",
        "Optional justification jo transition ke against store hota hai; asset ke history log mein dikhaya jaata hai.",
    ),
    "capitalization-queue.tip.title": (
        "Send Back is not a rejection log",
        "Send Back कोई rejection log नहीं है",
        "Send Back हा rejection log नाही",
        "Send Back koi rejection log nahi hai",
    ),
    "capitalization-queue.tip.body": (
        "\"Send Back to Draft\" reverts the asset straight to Draft state — it does not keep a separate rejection record. If you need the reason on file, put it in Remarks before sending back; it will not be asked for again.",
        "\"Send Back to Draft\" asset को सीधे Draft state में वापस ले जाता है — यह अलग से कोई rejection record नहीं रखता। यदि आपको कारण दर्ज करना है, तो वापस भेजने से पहले उसे Remarks में डालें; इसके बाद दोबारा नहीं पूछा जाएगा।",
        "\"Send Back to Draft\" asset ला थेट Draft state मध्ये परत नेते — ते वेगळे rejection record ठेवत नाही. जर तुम्हाला कारण नोंदवायचे असेल, तर परत पाठवण्यापूर्वी ते Remarks मध्ये टाका; त्यानंतर पुन्हा विचारले जाणार नाही.",
        "\"Send Back to Draft\" asset ko seedha Draft state mein wapas le jaata hai — ye alag se koi rejection record nahi rakhta. Agar aapko reason file mein rakhna hai, to wapas bhejne se pehle use Remarks mein daal dein; uske baad dobara nahi poocha jaayega.",
    ),
}


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_QUEUE.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_QUEUE)} capitalization-queue keys.")


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