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

Usage: docker compose exec api python seed_translations_pageinfo_breakdown_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)
BREAKDOWN_REGISTER = {
    "breakdown-register.title": (
        "Breakdown Register",
        "ब्रेकडाउन रजिस्टर",
        "ब्रेकडाउन रजिस्टर",
        "Breakdown Register",
    ),
    "breakdown-register.subtitle": (
        "Log and track unplanned asset failures",
        "अनियोजित asset विफलताओं को लॉग करें और ट्रैक करें",
        "अनियोजित asset बिघाडांची नोंद करा आणि ट्रॅक करा",
        "Unplanned asset failures ko log karein aur track karein",
    ),
    "breakdown-register.body.0": (
        "Record equipment and asset breakdowns as soon as they happen, then track each one through repair to resolution.",
        "उपकरण और asset breakdowns को होते ही रिकॉर्ड करें, फिर प्रत्येक को repair से resolution तक track करें।",
        "उपकरणे आणि asset breakdowns घडताच नोंदवा, नंतर प्रत्येक breakdown ला repair पासून resolution पर्यंत track करा.",
        "Equipment aur asset breakdowns ko hote hi record karein, phir har ek ko repair se resolution tak track karein.",
    ),
    "breakdown-register.body.1": (
        "Every breakdown is tied to a specific asset and severity so critical failures stand out and can be triaged first.",
        "हर breakdown एक विशिष्ट asset और severity से जुड़ा होता है ताकि critical failures अलग से दिखें और उन्हें पहले triage किया जा सके।",
        "प्रत्येक breakdown एका विशिष्ट asset आणि severity शी जोडलेला असतो जेणेकरून critical failures वेगळे दिसतील आणि त्यांना आधी triage करता येईल.",
        "Har breakdown ek specific asset aur severity se linked hota hai taaki critical failures alag se dikhein aur unhe pehle triage kiya ja sake.",
    ),
    "breakdown-register.stepsHeading": (
        "Breakdown lifecycle",
        "ब्रेकडाउन जीवनचक्र",
        "ब्रेकडाउन जीवनचक्र",
        "Breakdown ka lifecycle",
    ),
    "breakdown-register.steps.0.label": ("Open", "ओपन", "ओपन", "Open"),
    "breakdown-register.steps.0.caption": (
        "Reported with asset, severity and optional technician/description.",
        "asset, severity और वैकल्पिक technician/description के साथ रिपोर्ट किया जाता है।",
        "asset, severity आणि पर्यायी technician/description सह नोंदवले जाते.",
        "Asset, severity aur optional technician/description ke saath report kiya jaata hai.",
    ),
    "breakdown-register.steps.1.label": ("In Progress", "प्रगति में", "प्रगतीत", "In Progress"),
    "breakdown-register.steps.1.caption": (
        "Technician clicks Start Repair once work begins.",
        "काम शुरू होते ही technician Start Repair पर क्लिक करता है।",
        "काम सुरू होताच technician Start Repair वर क्लिक करतो.",
        "Kaam start hote hi technician Start Repair par click karta hai.",
    ),
    "breakdown-register.steps.2.label": ("Resolved", "समाधान हो गया", "निराकरण झाले", "Resolved"),
    "breakdown-register.steps.2.caption": (
        "Marked resolved when the fix is confirmed complete.",
        "जब fix के पूर्ण होने की पुष्टि हो जाती है तो इसे resolved मार्क किया जाता है।",
        "fix पूर्ण झाल्याची खात्री झाल्यावर ते resolved म्हणून मार्क केले जाते.",
        "Jab fix complete hone ki confirmation mil jaati hai to isse resolved mark kiya jaata hai.",
    ),
    "breakdown-register.fieldRules.0.name": ("Asset", "Asset", "Asset", "Asset"),
    "breakdown-register.fieldRules.0.description": (
        "The equipment that failed; searchable async select, must be chosen before the report can be submitted.",
        "वह equipment जो विफल हुआ; searchable async select है, report सबमिट करने से पहले इसे चुनना ज़रूरी है।",
        "जे equipment अयशस्वी झाले ते; searchable async select आहे, report submit करण्यापूर्वी ते निवडणे आवश्यक आहे.",
        "Wo equipment jo fail hua; searchable async select hai, report submit karne se pehle ise choose karna zaroori hai.",
    ),
    "breakdown-register.fieldRules.1.name": (
        "Failure Severity",
        "विफलता गंभीरता",
        "बिघाड तीव्रता",
        "Failure Severity",
    ),
    "breakdown-register.fieldRules.1.description": (
        "Critical / High / Medium / Low — defaults to High; drives the Critical Failures count on this page.",
        "Critical / High / Medium / Low — डिफ़ॉल्ट रूप से High होती है; यह इस पृष्ठ पर Critical Failures की गिनती तय करती है।",
        "Critical / High / Medium / Low — डिफॉल्टने High असते; ती या पानावरील Critical Failures ची संख्या ठरवते.",
        "Critical / High / Medium / Low — default High hoti hai; ye is page par Critical Failures count ko drive karti hai.",
    ),
    "breakdown-register.fieldRules.2.name": (
        "Assigned Technician",
        "नियुक्त technician",
        "नेमलेला technician",
        "Assigned Technician",
    ),
    "breakdown-register.fieldRules.2.description": (
        "Optional at reporting time; breakdown shows as Unassigned until someone is assigned.",
        "reporting के समय यह वैकल्पिक है; जब तक कोई नियुक्त नहीं होता, breakdown Unassigned दिखता है।",
        "reporting च्या वेळी हे पर्यायी आहे; कोणीतरी नेमेपर्यंत breakdown Unassigned दाखवला जातो.",
        "Reporting ke waqt ye optional hai; jab tak koi assign nahi hota, breakdown Unassigned dikhta hai.",
    ),
    "breakdown-register.fieldRules.3.name": ("Description", "विवरण", "वर्णन", "Description"),
    "breakdown-register.fieldRules.3.description": (
        'Free-text note on the failure symptoms, e.g. "Compressor failure detected".',
        'विफलता के लक्षणों पर free-text नोट, जैसे "Compressor failure detected"।',
        'बिघाडाच्या लक्षणांवर free-text नोंद, उदा. "Compressor failure detected".',
        'Failure symptoms par free-text note, jaise "Compressor failure detected".',
    ),
    "breakdown-register.fieldRules.4.name": ("Status", "स्थिति", "स्थिती", "Status"),
    "breakdown-register.fieldRules.4.description": (
        "Open → In Progress → Resolved; only Open breakdowns show the Start Repair action.",
        "Open → In Progress → Resolved; केवल Open breakdowns पर ही Start Repair action दिखता है।",
        "Open → In Progress → Resolved; फक्त Open breakdowns वरच Start Repair action दिसते.",
        "Open → In Progress → Resolved; sirf Open breakdowns par hi Start Repair action dikhta hai.",
    ),
    "breakdown-register.tip.title": (
        "Severity isn't just a label",
        "Severity सिर्फ एक लेबल नहीं है",
        "Severity ही फक्त एक लेबल नाही",
        "Severity sirf ek label nahi hai",
    ),
    "breakdown-register.tip.body": (
        "The Critical Failures stat only counts critical-severity breakdowns that aren't yet resolved — set severity accurately at report time, since it can't be bulk-edited later from this list.",
        "Critical Failures आँकड़ा केवल उन critical-severity breakdowns को गिनता है जो अभी resolved नहीं हुए हैं — severity को report के समय सही तरीके से सेट करें, क्योंकि इसे बाद में इस list से bulk-edit नहीं किया जा सकता।",
        "Critical Failures आकडेवारी फक्त त्या critical-severity breakdowns ची मोजणी करते जे अद्याप resolved झालेले नाहीत — severity report च्या वेळी अचूक सेट करा, कारण नंतर ती या यादीतून bulk-edit करता येत नाही.",
        "Critical Failures stat sirf un critical-severity breakdowns ko count karta hai jo abhi tak resolved nahi hue — severity ko report ke waqt accurately set karein, kyunki ise baad mein is list se bulk-edit nahi kiya ja sakta.",
    ),
}


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 BREAKDOWN_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(BREAKDOWN_REGISTER)} breakdown-register keys.")


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