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

Usage: docker compose exec api python seed_translations_pageinfo_disposal_approvals.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)
DISPOSAL_APPROVALS = {
    "disposal-approvals.title": (
        "Asset Disposal Queue",
        "एसेट डिस्पोज़ल क्यू",
        "ॲसेट डिस्पोझल क्यू",
        "Asset Disposal Queue",
    ),
    "disposal-approvals.subtitle": (
        "Dual sign-off retirement: request, approve, dispose.",
        "Dual sign-off से रिटायरमेंट: request करें, approve करें, dispose करें।",
        "Dual sign-off द्वारे रिटायरमेंट: request करा, approve करा, dispose करा.",
        "Dual sign-off retirement: request karo, approve karo, dispose karo.",
    ),
    "disposal-approvals.body.0": (
        "Assets pending decommission approval, and disposal history.",
        "Decommission approval के लिए pending assets, और disposal history।",
        "Decommission approval साठी pending असलेल्या assets, आणि disposal history.",
        "Decommission approval ke liye pending assets, aur disposal history.",
    ),
    "disposal-approvals.body.1": (
        "Decommissioning an asset is a two-person process: one person requests it with a justification, and a different person from Finance approves it. The system blocks a requester from approving their own request.",
        "किसी asset को decommission करना एक two-person process है: एक व्यक्ति justification के साथ इसका request करता है, और Finance से कोई दूसरा व्यक्ति इसे approve करता है। System requester को अपने ही request को approve करने से रोकता है।",
        "एखादी asset decommission करणे ही two-person process आहे: एक व्यक्ती justification सह त्याची request करते, आणि Finance मधील दुसरी व्यक्ती ती approve करते. System requester ला स्वतःची request approve करण्यापासून रोखते.",
        "Kisi asset ko decommission karna ek two-person process hai: ek insaan justification ke saath request karta hai, aur Finance se doosra insaan use approve karta hai. System requester ko apni hi request approve karne se rokta hai.",
    ),
    "disposal-approvals.stepsHeading": (
        "How disposal works",
        "Disposal कैसे काम करता है",
        "Disposal कसे कार्य करते",
        "Disposal kaise kaam karta hai",
    ),
    "disposal-approvals.steps.0.label": ("Request", "Request", "Request", "Request"),
    "disposal-approvals.steps.0.caption": (
        "Asset Manager requests decommission with a justification.",
        "Asset Manager justification के साथ decommission का request करता है।",
        "Asset Manager justification सह decommission ची request करतो.",
        "Asset Manager justification ke saath decommission ka request karta hai.",
    ),
    "disposal-approvals.steps.1.label": ("Pending Approval", "Pending Approval", "Pending Approval", "Pending Approval"),
    "disposal-approvals.steps.1.caption": (
        "Request sits in the queue until Finance reviews it.",
        "Request तब तक queue में रहता है जब तक Finance इसे review नहीं करता।",
        "Finance पुनरावलोकन करेपर्यंत request queue मध्ये राहते.",
        "Request queue mein tab tak rehta hai jab tak Finance ise review nahi karta.",
    ),
    "disposal-approvals.steps.2.label": ("Approve", "Approve", "Approve", "Approve"),
    "disposal-approvals.steps.2.caption": (
        "Finance Controller approves; requester cannot self-approve.",
        "Finance Controller approve करता है; requester self-approve नहीं कर सकता।",
        "Finance Controller approve करतो; requester स्वतःची request approve करू शकत नाही.",
        "Finance Controller approve karta hai; requester khud apni request approve nahi kar sakta.",
    ),
    "disposal-approvals.steps.3.label": ("Disposed", "Disposed", "Disposed", "Disposed"),
    "disposal-approvals.steps.3.caption": (
        "Asset leaves the active register and appears in history.",
        "Asset active register से हट जाता है और history में दिखने लगता है।",
        "Asset active register मधून बाहेर पडते आणि history मध्ये दिसू लागते.",
        "Asset active register se nikal jaata hai aur history mein dikhne lagta hai.",
    ),
    "disposal-approvals.fieldRules.0.name": ("Asset", "Asset", "Asset", "Asset"),
    "disposal-approvals.fieldRules.0.description": (
        "Only assets currently In Operation are selectable for a disposal request.",
        "केवल वे assets जो अभी In Operation हैं, disposal request के लिए select किए जा सकते हैं।",
        "सध्या In Operation असलेल्याच assets disposal request साठी select करता येतात.",
        "Sirf wo assets jo abhi In Operation hain, disposal request ke liye select kiye ja sakte hain.",
    ),
    "disposal-approvals.fieldRules.1.name": ("Justification", "Justification", "Justification", "Justification"),
    "disposal-approvals.fieldRules.1.description": (
        "Free-text reason for decommissioning; optional but recorded on the request for audit.",
        "Decommission करने का free-text कारण; optional है लेकिन audit के लिए request पर record किया जाता है।",
        "Decommission करण्याचे free-text कारण; optional आहे पण audit साठी request वर record केले जाते.",
        "Decommission karne ka free-text reason; optional hai lekin audit ke liye request par record hota hai.",
    ),
    "disposal-approvals.fieldRules.2.name": ("Acquisition Cost", "Acquisition Cost", "Acquisition Cost", "Acquisition Cost"),
    "disposal-approvals.fieldRules.2.description": (
        "Shown on the pending queue so approvers can weigh the write-off value before approving.",
        "Pending queue पर दिखाया जाता है ताकि approvers approve करने से पहले write-off value को तौल सकें।",
        "Pending queue वर दाखवले जाते जेणेकरून approvers approve करण्यापूर्वी write-off value तपासू शकतील.",
        "Pending queue par dikhaya jaata hai taaki approvers approve karne se pehle write-off value ko weigh kar sakein.",
    ),
    "disposal-approvals.tip.title": (
        "Requester ≠ approver",
        "Requester ≠ approver",
        "Requester ≠ approver",
        "Requester ≠ approver",
    ),
    "disposal-approvals.tip.body": (
        "The backend rejects self-approval outright — if you submitted the request, log in as a Finance Controller (or have one review it) to approve it; retrying with the same account just fails silently against the Approve action.",
        "Backend self-approval को पूरी तरह reject करता है — अगर आपने request submit की है, तो उसे approve करने के लिए किसी Finance Controller के रूप में login करें (या किसी और से review करवाएं); उसी account से दोबारा try करना Approve action पर silently fail हो जाता है।",
        "Backend self-approval पूर्णपणे reject करते — जर तुम्ही request submit केली असेल, तर ती approve करण्यासाठी Finance Controller म्हणून login करा (किंवा दुसऱ्या कोणाकडून review करवा); त्याच account ने पुन्हा प्रयत्न केल्यास Approve action वर silently fail होते.",
        "Backend self-approval ko poori tarah reject karta hai — agar aapne request submit ki hai, to use approve karne ke liye Finance Controller banke login karo (ya kisi aur se review karwao); usi account se dobara try karne par Approve action par silently fail ho jaata 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 DISPOSAL_APPROVALS.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(DISPOSAL_APPROVALS)} disposal-approvals keys.")


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