"""One-off seed: registers translation_keys + hi/mr/hinglish translation_values for the "tickets" page's PageInfoButton content.

Usage: docker compose exec api python seed_translations_pageinfo_tickets.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)
TICKETS = {
    "tickets.title": (
        "Support Tickets",
        "सपोर्ट टिकट",
        "सपोर्ट तिकीट",
        "Support Tickets",
    ),
    "tickets.subtitle": (
        "How this register works and what each field controls",
        "यह रजिस्टर कैसे काम करता है और हर फ़ील्ड क्या नियंत्रित करती है",
        "हे रजिस्टर कसे कार्य करते आणि प्रत्येक फील्ड काय नियंत्रित करते",
        "Ye register kaise kaam karta hai aur har field kya control karti hai",
    ),
    "tickets.body.0": (
        "A ticket tracks one support request, incident, or change from open to close. Managers see every tenant ticket by default; the My/All toggle switches to just their own.",
        "एक टिकट किसी एक सपोर्ट अनुरोध, घटना (incident), या बदलाव (change) को ओपन से क्लोज़ तक ट्रैक करता है। मैनेजर डिफ़ॉल्ट रूप से टेनेंट के सभी टिकट देखते हैं; My/All टॉगल से केवल अपने टिकट देखे जा सकते हैं।",
        "एक तिकीट एका सपोर्ट विनंती, घटना (incident), किंवा बदल (change) ला ओपन पासून क्लोज होईपर्यंत ट्रॅक करते. व्यवस्थापक डीफॉल्टनुसार टेनंटची सर्व तिकिटे पाहतात; My/All टॉगलने फक्त स्वतःची तिकिटे दिसतात.",
        "Ek ticket kisi ek support request, incident, ya change ko open se close tak track karta hai. Managers by default tenant ke saare tickets dekhte hain; My/All toggle se sirf apne tickets dikhte hain.",
    ),
    "tickets.stepsHeading": (
        "How a ticket moves",
        "टिकट कैसे आगे बढ़ता है",
        "तिकीट कसे पुढे सरकते",
        "Ticket kaise aage badhta hai",
    ),
    "tickets.steps.0.label": ("Open", "ओपन", "ओपन", "Open"),
    "tickets.steps.0.caption": (
        "Just raised",
        "अभी दर्ज किया गया",
        "नुकतेच नोंदवले",
        "Abhi raise kiya gaya",
    ),
    "tickets.steps.1.label": ("In Progress", "प्रगति में", "प्रगतीपथावर", "In Progress"),
    "tickets.steps.1.caption": (
        "Being worked",
        "इस पर काम चल रहा है",
        "यावर काम सुरू आहे",
        "Isper kaam ho raha hai",
    ),
    "tickets.steps.2.label": ("On Hold", "होल्ड पर", "होल्डवर", "On Hold"),
    "tickets.steps.2.caption": (
        "Waiting on input",
        "इनपुट का इंतज़ार",
        "इनपुटची प्रतीक्षा",
        "Input ka wait ho raha hai",
    ),
    "tickets.steps.3.label": ("Resolved", "हल हो गया", "निराकरण झाले", "Resolved"),
    "tickets.steps.3.caption": (
        "Fix applied",
        "समाधान लागू किया गया",
        "उपाय लागू केला",
        "Fix apply kar diya gaya",
    ),
    "tickets.steps.4.label": ("Closed", "बंद", "बंद", "Closed"),
    "tickets.steps.4.caption": (
        "Confirmed done",
        "पूर्ण होने की पुष्टि हुई",
        "पूर्ण झाल्याची पुष्टी झाली",
        "Confirm ho gaya ki done hai",
    ),
    "tickets.fieldRules.0.name": ("Type", "प्रकार", "प्रकार", "Type"),
    "tickets.fieldRules.0.description": (
        "Request, Problem, Incident, Change, or Other — sets the intake category.",
        "Request, Problem, Incident, Change, या Other — इनटेक कैटेगरी तय करता है।",
        "Request, Problem, Incident, Change, किंवा Other — इनटेक कॅटेगरी निश्चित करते.",
        "Request, Problem, Incident, Change, ya Other — intake category set karta hai.",
    ),
    "tickets.fieldRules.1.name": ("Priority", "प्राथमिकता", "प्राधान्य", "Priority"),
    "tickets.fieldRules.1.description": (
        "Critical/High/Medium/Low — drives SLA expectations, not shown as a hard deadline here.",
        "Critical/High/Medium/Low — SLA अपेक्षाओं को तय करता है, यहाँ इसे सख़्त डेडलाइन के रूप में नहीं दिखाया गया है।",
        "Critical/High/Medium/Low — SLA अपेक्षा ठरवते, इथे याला कठोर डेडलाइन म्हणून दाखवलेले नाही.",
        "Critical/High/Medium/Low — SLA expectations decide karta hai, yahan ise hard deadline ki tarah nahi dikhaya gaya.",
    ),
    "tickets.fieldRules.2.name": ("Status", "स्थिति", "स्थिती", "Status"),
    "tickets.fieldRules.2.description": (
        "Only Assigned or a manager can move a ticket forward once it's Open.",
        "एक बार टिकट Open हो जाने पर, केवल Assigned व्यक्ति या मैनेजर ही उसे आगे बढ़ा सकते हैं।",
        "एकदा तिकीट Open झाले की, फक्त Assigned व्यक्ती किंवा व्यवस्थापकच ते पुढे नेऊ शकतात.",
        "Ek baar ticket Open ho jaye, uske baad sirf Assigned person ya manager hi usse aage badha sakte hain.",
    ),
    "tickets.fieldRules.3.name": ("Assigned", "असाइन किया गया", "असाइन केलेले", "Assigned"),
    "tickets.fieldRules.3.description": (
        "Unassigned tickets are visible to every manager until someone takes it.",
        "जब तक कोई इसे नहीं लेता, तब तक असाइन न किए गए टिकट हर मैनेजर को दिखते हैं।",
        "जोपर्यंत कोणी ते घेत नाही, तोपर्यंत असाइन न केलेली तिकिटे प्रत्येक व्यवस्थापकाला दिसतात.",
        "Jab tak koi ise le nahi leta, tab tak unassigned tickets har manager ko dikhte hain.",
    ),
    "tickets.tip.title": (
        "My Tickets vs All Tickets",
        "My Tickets बनाम All Tickets",
        "My Tickets विरुद्ध All Tickets",
        "My Tickets vs All Tickets",
    ),
    "tickets.tip.body": (
        "Managers default to All Tickets (every ticket in the tenant). Switch to My Tickets to see only ones raised by or assigned to you.",
        "मैनेजर डिफ़ॉल्ट रूप से All Tickets (टेनेंट के सभी टिकट) देखते हैं। केवल अपने द्वारा दर्ज या अपने को असाइन किए गए टिकट देखने के लिए My Tickets पर स्विच करें।",
        "व्यवस्थापक डीफॉल्टनुसार All Tickets (टेनंटची सर्व तिकिटे) पाहतात. फक्त तुम्ही नोंदवलेली किंवा तुम्हाला असाइन केलेली तिकिटे पाहण्यासाठी My Tickets वर स्विच करा.",
        "Managers by default All Tickets dekhte hain (tenant ke saare tickets). Sirf apne raise kiye hue ya apne ko assign kiye gaye tickets dekhne ke liye My Tickets par switch 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 TICKETS.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(TICKETS)} tickets keys.")


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