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

Usage: docker compose exec api python seed_translations_pageinfo_asset_inspection_register.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)
ASSET_INSPECTION_REGISTER = {
    "asset-inspection-register.title": (
        "Asset Inspection Register",
        "एसेट निरीक्षण रजिस्टर",
        "एसेट निरीक्षण रजिस्टर",
        "Asset Inspection Register",
    ),
    "asset-inspection-register.subtitle": (
        "Schedule, track, and record the outcome of asset inspections",
        "Asset निरीक्षणों को शेड्यूल करें, ट्रैक करें, और उनका परिणाम दर्ज करें",
        "Asset निरीक्षणांचे वेळापत्रक तयार करा, ट्रॅक करा आणि त्यांचा निकाल नोंदवा",
        "Asset inspections ko schedule karein, track karein, aur unka result record karein",
    ),
    "asset-inspection-register.body.0": (
        "The log of all asset inspections performed, scheduled, and pending.",
        "किए गए, शेड्यूल किए गए, और लंबित सभी asset निरीक्षणों का लॉग।",
        "केलेल्या, शेड्यूल केलेल्या, आणि प्रलंबित सर्व asset निरीक्षणांचा लॉग.",
        "Perform ho chuke, scheduled, aur pending sabhi asset inspections ka log.",
    ),
    "asset-inspection-register.body.1": (
        "Schedule an inspection against an asset, optionally assign a technician, then record a Pass or Fail once it's carried out.",
        "किसी asset के लिए निरीक्षण शेड्यूल करें, वैकल्पिक रूप से एक technician असाइन करें, फिर इसे पूरा होने पर Pass या Fail दर्ज करें।",
        "एखाद्या asset साठी निरीक्षण शेड्यूल करा, ऐच्छिकरित्या एक technician नियुक्त करा, नंतर ते पूर्ण झाल्यावर Pass किंवा Fail नोंदवा.",
        "Kisi asset ke against inspection schedule karein, optionally ek technician assign karein, phir usse complete hone par Pass ya Fail record karein.",
    ),
    "asset-inspection-register.stepsHeading": (
        "Inspection lifecycle",
        "निरीक्षण जीवनचक्र",
        "निरीक्षण जीवनचक्र",
        "Inspection lifecycle",
    ),
    "asset-inspection-register.steps.0.label": (
        "Scheduled", "शेड्यूल किया गया", "शेड्यूल केले", "Scheduled",
    ),
    "asset-inspection-register.steps.0.caption": (
        "Asset, date, and technician set via Schedule New Inspection.",
        "Schedule New Inspection के माध्यम से asset, तारीख, और technician सेट किए जाते हैं।",
        "Schedule New Inspection द्वारे asset, तारीख, आणि technician सेट केले जातात.",
        "Schedule New Inspection ke through asset, date, aur technician set kiye jaate hain.",
    ),
    "asset-inspection-register.steps.1.label": (
        "Performed", "किया गया", "पार पडले", "Performed",
    ),
    "asset-inspection-register.steps.1.caption": (
        "Technician carries out the on-site inspection.",
        "Technician on-site निरीक्षण करता है।",
        "Technician on-site निरीक्षण करतो.",
        "Technician on-site inspection carry out karta hai.",
    ),
    "asset-inspection-register.steps.2.label": (
        "Result Recorded", "परिणाम दर्ज किया गया", "निकाल नोंदवला", "Result Recorded",
    ),
    "asset-inspection-register.steps.2.caption": (
        "Marked Passed or Failed from this register.",
        "इस रजिस्टर से Passed या Failed के रूप में चिह्नित किया जाता है।",
        "या रजिस्टरमधून Passed किंवा Failed म्हणून चिन्हांकित केले जाते.",
        "Is register se Passed ya Failed mark kiya jaata hai.",
    ),
    "asset-inspection-register.fieldRules.0.name": (
        "Asset", "Asset", "Asset", "Asset",
    ),
    "asset-inspection-register.fieldRules.0.description": (
        "Asset being inspected; searched by ref/name, required to schedule.",
        "जिस asset का निरीक्षण किया जा रहा है; ref/name से खोजा जाता है, शेड्यूल करने के लिए आवश्यक।",
        "ज्या asset चे निरीक्षण केले जात आहे; ref/name द्वारे शोधले जाते, शेड्यूल करण्यासाठी आवश्यक.",
        "Jis asset ka inspection ho raha hai; ref/name se search hota hai, schedule karne ke liye required hai.",
    ),
    "asset-inspection-register.fieldRules.1.name": (
        "Inspection Date", "निरीक्षण तिथि", "निरीक्षण तारीख", "Inspection Date",
    ),
    "asset-inspection-register.fieldRules.1.description": (
        "Date the inspection is due or occurred; defaults to today.",
        "वह तारीख जब निरीक्षण देय है या हुआ था; डिफ़ॉल्ट रूप से आज की तारीख।",
        "निरीक्षण देय असण्याची किंवा झाल्याची तारीख; डिफॉल्टने आजची तारीख.",
        "Wo date jab inspection due hai ya hua tha; default se aaj ki date hoti hai.",
    ),
    "asset-inspection-register.fieldRules.2.name": (
        "Assigned Technician", "नियुक्त Technician", "नियुक्त Technician", "Assigned Technician",
    ),
    "asset-inspection-register.fieldRules.2.description": (
        "Optional; who will perform the inspection.",
        "वैकल्पिक; कौन निरीक्षण करेगा।",
        "ऐच्छिक; कोण निरीक्षण करेल.",
        "Optional hai; kaun inspection perform karega.",
    ),
    "asset-inspection-register.fieldRules.3.name": (
        "Status", "स्थिति", "स्थिती", "Status",
    ),
    "asset-inspection-register.fieldRules.3.description": (
        "System-set: starts Scheduled, becomes Passed or Failed once recorded.",
        "सिस्टम द्वारा सेट: शुरुआत Scheduled से होती है, दर्ज होने पर Passed या Failed बन जाता है।",
        "सिस्टमद्वारे सेट: सुरुवात Scheduled ने होते, नोंदवल्यानंतर Passed किंवा Failed होते.",
        "System-set hota hai: shuruaat Scheduled se hoti hai, record hone par Passed ya Failed ban jaata hai.",
    ),
    "asset-inspection-register.tip.title": (
        "Pass/Fail is one-way from this list",
        "इस लिस्ट से Pass/Fail वन-वे है",
        "या लिस्टमधून Pass/Fail वन-वे आहे",
        "Is list se Pass/Fail one-way hai",
    ),
    "asset-inspection-register.tip.body": (
        "The Pass/Fail buttons only appear while an inspection is Scheduled. Once you record an outcome here, it can't be reopened or changed from this register — double-check before clicking.",
        "Pass/Fail बटन तभी दिखते हैं जब कोई निरीक्षण Scheduled स्थिति में हो। एक बार यहाँ परिणाम दर्ज करने के बाद, इसे इस रजिस्टर से दोबारा नहीं खोला या बदला जा सकता — क्लिक करने से पहले अच्छी तरह जांच लें।",
        "Pass/Fail बटणे फक्त तेव्हाच दिसतात जेव्हा एखादे निरीक्षण Scheduled स्थितीत असते. एकदा येथे निकाल नोंदवल्यानंतर, तो या रजिस्टरमधून पुन्हा उघडता किंवा बदलता येत नाही — क्लिक करण्यापूर्वी नीट तपासा.",
        "Pass/Fail buttons tabhi dikhte hain jab koi inspection Scheduled status mein ho. Ek baar yahan outcome record karne ke baad, ise is register se dobara reopen ya change nahi kiya ja sakta — click karne se pehle achhi tarah check kar lein.",
    ),
}


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 ASSET_INSPECTION_REGISTER.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(ASSET_INSPECTION_REGISTER)} asset-inspection-register keys.")


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