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

Usage: docker compose exec api python seed_translations_pageinfo_finance_dashboard.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)
FINANCE_DASHBOARD = {
    "finance-dashboard.title": (
        "Finance",
        "वित्त",
        "वित्त",
        "Finance",
    ),
    "finance-dashboard.subtitle": (
        "Depreciation, budgets, and investment planning in one place",
        "Depreciation, बजट और निवेश योजना एक ही जगह पर",
        "Depreciation, बजेट आणि गुंतवणूक नियोजन एकाच ठिकाणी",
        "Depreciation, budgets, aur investment planning ek hi jagah par.",
    ),
    "finance-dashboard.body.0": (
        "Depreciation, journals, budgets, and investment planning.",
        "Depreciation, journals, बजट और निवेश योजना।",
        "Depreciation, journals, बजेट आणि गुंतवणूक नियोजन.",
        "Depreciation, journals, budgets, aur investment planning.",
    ),
    "finance-dashboard.body.1": (
        "Per-asset financial actions live on each asset's Financials tab.",
        "Per-asset वित्तीय कार्रवाइयाँ प्रत्येक asset के Financials टैब पर उपलब्ध हैं।",
        "Per-asset आर्थिक कृती प्रत्येक asset च्या Financials टॅबवर उपलब्ध आहेत.",
        "Per-asset financial actions har asset ke Financials tab par hote hain.",
    ),
    "finance-dashboard.stepsHeading": (
        "Monthly financial close, at a glance",
        "मासिक वित्तीय क्लोज़, एक नज़र में",
        "मासिक आर्थिक क्लोज, एका दृष्टीक्षेपात",
        "Monthly financial close, ek nazar mein",
    ),
    "finance-dashboard.steps.0.label": (
        "Depreciation Run",
        "Depreciation रन",
        "Depreciation रन",
        "Depreciation Run",
    ),
    "finance-dashboard.steps.0.caption": (
        "Run or reverse the monthly depreciation batch across books.",
        "सभी books में मासिक depreciation batch को run या reverse करें।",
        "सर्व books मध्ये मासिक depreciation batch run किंवा reverse करा.",
        "Sabhi books mein monthly depreciation batch ko run ya reverse karein.",
    ),
    "finance-dashboard.steps.1.label": (
        "Reconciliation",
        "रिकंसिलिएशन",
        "रिकंसिलिएशन",
        "Reconciliation",
    ),
    "finance-dashboard.steps.1.caption": (
        "Compare net book value across the three books for the period.",
        "उस अवधि के लिए तीनों books में net book value की तुलना करें।",
        "त्या कालावधीसाठी तिन्ही books मधील net book value ची तुलना करा.",
        "Us period ke liye teeno books mein net book value compare karein.",
    ),
    "finance-dashboard.steps.2.label": (
        "NBV / PPE Movement",
        "NBV / PPE मूवमेंट",
        "NBV / PPE मूव्हमेंट",
        "NBV / PPE Movement",
    ),
    "finance-dashboard.steps.2.caption": (
        "Review opening and closing net book value by asset class.",
        "asset class के अनुसार opening और closing net book value की समीक्षा करें।",
        "asset class नुसार opening आणि closing net book value चे पुनरावलोकन करा.",
        "Asset class ke hisaab se opening aur closing net book value review karein.",
    ),
    "finance-dashboard.steps.3.label": (
        "Journal Export",
        "जर्नल एक्सपोर्ट",
        "जर्नल एक्सपोर्ट",
        "Journal Export",
    ),
    "finance-dashboard.steps.3.caption": (
        "Export the period's journal entries for posting.",
        "पोस्टिंग के लिए अवधि की journal entries एक्सपोर्ट करें।",
        "पोस्टिंगसाठी कालावधीच्या journal entries एक्सपोर्ट करा.",
        "Posting ke liye period ki journal entries export karein.",
    ),
    "finance-dashboard.tip.title": (
        "Per-asset actions live elsewhere",
        "Per-asset कार्रवाइयाँ कहीं और उपलब्ध हैं",
        "Per-asset कृती इतरत्र उपलब्ध आहेत",
        "Per-asset actions kahin aur hote hain",
    ),
    "finance-dashboard.tip.body": (
        "Capitalisation, ITC, impairment, revaluation, and prior-period adjustments aren't on this dashboard — they're on each asset's Details → Financials tab. This hub only links to period- and batch-level finance tools.",
        "Capitalisation, ITC, impairment, revaluation, और prior-period adjustments इस dashboard पर नहीं हैं — ये प्रत्येक asset के Details → Financials टैब पर हैं। यह hub केवल period- और batch-level के वित्तीय tools से लिंक करता है।",
        "Capitalisation, ITC, impairment, revaluation, आणि prior-period adjustments या dashboard वर नाहीत — ते प्रत्येक asset च्या Details → Financials टॅबवर आहेत. हे hub फक्त period- आणि batch-level च्या आर्थिक tools शी लिंक करते.",
        "Capitalisation, ITC, impairment, revaluation, aur prior-period adjustments is dashboard par nahi hain — ye har asset ke Details → Financials tab par hote hain. Ye hub sirf period- aur batch-level ke finance tools se link karta 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 FINANCE_DASHBOARD.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(FINANCE_DASHBOARD)} finance-dashboard keys.")


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