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

Usage: docker compose exec api python seed_translations_pageinfo_breakdown_detail.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_DETAIL = {
    "breakdown-detail.title": (
        "Breakdown Details",
        "ब्रेकडाउन विवरण",
        "ब्रेकडाउन तपशील",
        "Breakdown Details",
    ),
    "breakdown-detail.subtitle": (
        "Full record of a single reported breakdown",
        "एक रिपोर्ट किए गए ब्रेकडाउन का पूरा रिकॉर्ड",
        "एका नोंदवलेल्या ब्रेकडाउनची संपूर्ण नोंद",
        "Ek reported breakdown ka pura record",
    ),
    "breakdown-detail.body.0": (
        "Read-only detail view for one breakdown raised against an asset — who reported it, its severity, the assigned technician, and when it was resolved.",
        "किसी asset के विरुद्ध दर्ज किए गए एक ब्रेकडाउन का read-only विवरण दृश्य — इसे किसने रिपोर्ट किया, इसकी severity, नियुक्त technician, और यह कब resolve हुआ।",
        "एखाद्या asset विरुद्ध नोंदवलेल्या एका ब्रेकडाउनचे read-only तपशील दृश्य — तो कोणी रिपोर्ट केला, त्याची severity, नेमलेला technician आणि तो केव्हा resolve झाला.",
        "Kisi asset ke against raise hue ek breakdown ka read-only detail view — kisne report kiya, iski severity, assigned technician, aur ye kab resolve hua.",
    ),
    "breakdown-detail.body.1": (
        "This page has no edit controls. Status changes happen from the Breakdown Register list, not here.",
        "इस पृष्ठ पर कोई edit control नहीं है। Status में बदलाव यहाँ से नहीं, Breakdown Register लिस्ट से होते हैं।",
        "या पानावर कोणतेही edit control नाहीत. Status मधील बदल येथून नाही, तर Breakdown Register यादीतून होतात.",
        "Is page par koi edit control nahi hai. Status changes yahan se nahi, Breakdown Register list se hote hain.",
    ),
    "breakdown-detail.stepsHeading": (
        "Breakdown lifecycle",
        "ब्रेकडाउन जीवनचक्र",
        "ब्रेकडाउन जीवनचक्र",
        "Breakdown ka lifecycle",
    ),
    "breakdown-detail.steps.0.label": ("Open", "ओपन", "ओपन", "Open"),
    "breakdown-detail.steps.0.caption": (
        "Reported against an asset; awaiting a technician to start work.",
        "किसी asset के विरुद्ध रिपोर्ट किया गया; किसी technician द्वारा काम शुरू करने की प्रतीक्षा है।",
        "एखाद्या asset विरुद्ध नोंदवले गेले; technician ने काम सुरू करण्याची प्रतीक्षा आहे.",
        "Kisi asset ke against report hua; kisi technician ke kaam start karne ka wait hai.",
    ),
    "breakdown-detail.steps.1.label": ("In Progress", "प्रगति में", "प्रगतीत", "In Progress"),
    "breakdown-detail.steps.1.caption": (
        "Technician started repair via Breakdown Register.",
        "Technician ने Breakdown Register के माध्यम से repair शुरू कर दी है।",
        "Technician ने Breakdown Register द्वारे repair सुरू केली आहे.",
        "Technician ne Breakdown Register ke through repair start kar di hai.",
    ),
    "breakdown-detail.steps.2.label": ("Resolved", "समाधान हो गया", "निराकरण झाले", "Resolved"),
    "breakdown-detail.steps.2.caption": (
        "Repair marked complete; Resolved At timestamp is set.",
        "Repair को complete मार्क किया गया; Resolved At timestamp सेट हो जाता है।",
        "Repair complete म्हणून मार्क केली जाते; Resolved At timestamp सेट होतो.",
        "Repair complete mark ho jaati hai; Resolved At timestamp set ho jaata hai.",
    ),
    "breakdown-detail.fieldRules.0.name": ("Status", "स्थिति", "स्थिती", "Status"),
    "breakdown-detail.fieldRules.0.description": (
        "Open (rose) / In Progress (blue) / Resolved (emerald) — color-coded chip, changed only from Breakdown Register.",
        "Open (rose) / In Progress (blue) / Resolved (emerald) — color-coded chip, जिसे केवल Breakdown Register से बदला जाता है।",
        "Open (rose) / In Progress (blue) / Resolved (emerald) — color-coded chip, जो फक्त Breakdown Register मधून बदलली जाते.",
        "Open (rose) / In Progress (blue) / Resolved (emerald) — color-coded chip, jo sirf Breakdown Register se change hoti hai.",
    ),
    "breakdown-detail.fieldRules.1.name": ("Severity", "गंभीरता", "तीव्रता", "Severity"),
    "breakdown-detail.fieldRules.1.description": (
        "Critical, high, medium or low, set when the breakdown was first logged.",
        "Critical, high, medium या low, जो breakdown पहली बार log होने पर सेट होती है।",
        "Critical, high, medium किंवा low, जी breakdown प्रथम log झाल्यावर सेट होते.",
        "Critical, high, medium ya low, jo breakdown pehli baar log hone par set hoti hai.",
    ),
    "breakdown-detail.fieldRules.2.name": ("Technician", "तकनीशियन", "तंत्रज्ञ", "Technician"),
    "breakdown-detail.fieldRules.2.description": (
        "Technician assigned to the repair; shows — if not yet assigned.",
        "Repair के लिए नियुक्त technician; यदि अभी तक नियुक्त नहीं हुआ है तो — दिखाता है।",
        "Repair साठी नेमलेला technician; अद्याप नेमला नसल्यास — दाखवते.",
        "Repair ke liye assigned technician; agar abhi tak assign nahi hua to — dikhata hai.",
    ),
    "breakdown-detail.fieldRules.3.name": ("Resolved At", "समाधान समय", "निराकरण वेळ", "Resolved At"),
    "breakdown-detail.fieldRules.3.description": (
        "Timestamp set automatically when the breakdown is marked resolved; blank until then.",
        "Breakdown को resolved मार्क करने पर timestamp अपने आप सेट हो जाता है; तब तक यह खाली रहता है।",
        "Breakdown resolved म्हणून मार्क केल्यावर timestamp आपोआप सेट होतो; तोपर्यंत ते रिकामे राहते.",
        "Breakdown resolved mark hone par timestamp automatically set ho jaata hai; tab tak ye blank rehta hai.",
    ),
    "breakdown-detail.tip.title": (
        "No actions on this page",
        "इस पृष्ठ पर कोई कार्रवाई नहीं",
        "या पानावर कोणतीही कृती नाही",
        "Is page par koi action nahi",
    ),
    "breakdown-detail.tip.body": (
        "Start Repair and Resolve buttons live on the Breakdown Register list, not on this detail page — come back here only to review, then use the register to advance the status.",
        "Start Repair और Resolve बटन Breakdown Register लिस्ट पर होते हैं, इस detail पृष्ठ पर नहीं — यहाँ केवल review के लिए आएं, फिर status आगे बढ़ाने के लिए register का उपयोग करें।",
        "Start Repair आणि Resolve बटणे Breakdown Register यादीवर असतात, या detail पानावर नाहीत — येथे फक्त review साठी या, नंतर status पुढे नेण्यासाठी register वापरा.",
        "Start Repair aur Resolve buttons Breakdown Register list par hote hain, is detail page par nahi — yahan sirf review karne aayein, phir status aage badhaane ke liye register use karein.",
    ),
}


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_DETAIL.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_DETAIL)} breakdown-detail keys.")


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