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

Usage: docker compose exec api python seed_translations_pageinfo_pm_schedule_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)
PM_SCHEDULE_DETAIL = {
    "pm-schedule-detail.title": (
        "PM Schedule Details",
        "PM शेड्यूल विवरण",
        "PM शेड्यूल तपशील",
        "PM Schedule Details",
    ),
    "pm-schedule-detail.subtitle": (
        "Read-only record of one preventive maintenance schedule entry",
        "एक PM शेड्यूल एंट्री का read-only रिकॉर्ड",
        "एका PM शेड्यूल एंट्रीचा read-only रेकॉर्ड",
        "Ek PM schedule entry ka read-only record",
    ),
    "pm-schedule-detail.body.0": (
        "Shows the full detail of a single PM schedule: which asset it covers, what type of maintenance is due, how often it recurs, and when it was scheduled or completed.",
        "एक PM शेड्यूल का पूरा विवरण दिखाता है: यह किस asset को कवर करता है, किस प्रकार का maintenance ड्यू है, यह कितनी बार recur होता है, और इसे कब schedule या complete किया गया था।",
        "एका PM शेड्यूलचा संपूर्ण तपशील दाखवते: ते कोणत्या asset ला कव्हर करते, कोणत्या प्रकारचे maintenance ड्यू आहे, ते किती वेळा recur होते, आणि ते केव्हा schedule किंवा complete केले गेले.",
        "Ek single PM schedule ka pura detail dikhata hai: wo kis asset ko cover karta hai, kis type ka maintenance due hai, ye kitni baar recur hota hai, aur ise kab schedule ya complete kiya gaya tha.",
    ),
    "pm-schedule-detail.body.1": (
        "This page is read-only. Marking a schedule complete or editing its scheduled date is done from the PM Schedule list, not here.",
        "यह पेज read-only है। किसी schedule को complete मार्क करना या उसकी scheduled date edit करना PM Schedule list से किया जाता है, यहाँ से नहीं।",
        "हे पेज read-only आहे. एखादे schedule complete म्हणून मार्क करणे किंवा त्याची scheduled date edit करणे PM Schedule लिस्टमधून केले जाते, इथून नाही.",
        "Ye page read-only hai. Kisi schedule ko complete mark karna ya uski scheduled date edit karna PM Schedule list se hota hai, yahan se nahi.",
    ),
    "pm-schedule-detail.stepsHeading": (
        "Status lifecycle",
        "Status लाइफ़साइकिल",
        "Status लाइफसायकल",
        "Status lifecycle",
    ),
    "pm-schedule-detail.steps.0.label": ("Scheduled", "निर्धारित", "नियोजित", "Scheduled"),
    "pm-schedule-detail.steps.0.caption": (
        "Default state once a PM schedule is created",
        "PM शेड्यूल बनते ही डिफ़ॉल्ट स्थिति",
        "PM शेड्यूल तयार होताच डिफॉल्ट स्थिती",
        "PM schedule create hote hi default state",
    ),
    "pm-schedule-detail.steps.1.label": ("Overdue", "अतिदेय", "मुदतबाह्य", "Overdue"),
    "pm-schedule-detail.steps.1.caption": (
        "Auto-set by the server when today passes the scheduled date, uncompleted",
        "जब आज की तारीख scheduled date के बाद निकल जाती है और काम अधूरा रहता है, तो server द्वारा auto-set किया जाता है",
        "जेव्हा आजची तारीख scheduled date च्या पुढे जाते आणि काम अपूर्ण राहते, तेव्हा server द्वारे auto-set केले जाते",
        "Jab aaj ki date scheduled date ke aage nikal jaati hai aur kaam incomplete rehta hai, tab server dwara auto-set hota hai",
    ),
    "pm-schedule-detail.steps.2.label": ("Completed", "पूर्ण", "पूर्ण", "Completed"),
    "pm-schedule-detail.steps.2.caption": (
        "Set when the maintenance is marked done; locks in the completed timestamp",
        "जब maintenance को done मार्क किया जाता है तब सेट होता है; completed timestamp लॉक हो जाता है",
        "जेव्हा maintenance done म्हणून मार्क केले जाते तेव्हा सेट होते; completed timestamp लॉक होतो",
        "Jab maintenance ko done mark kiya jaata hai tab set hota hai; completed timestamp lock ho jaata hai",
    ),
    "pm-schedule-detail.fieldRules.0.name": ("Status", "स्थिति", "स्थिती", "Status"),
    "pm-schedule-detail.fieldRules.0.description": (
        "Scheduled, Overdue, or Completed — Overdue is computed from the scheduled date, not manually set",
        "निर्धारित, अतिदेय, या पूर्ण — Overdue scheduled date से गणना (compute) की जाती है, इसे मैन्युअली सेट नहीं किया जाता",
        "नियोजित, मुदतबाह्य, किंवा पूर्ण — Overdue scheduled date वरून compute केले जाते, ते मॅन्युअली सेट केले जात नाही",
        "Scheduled, Overdue, ya Completed — Overdue scheduled date se compute hota hai, manually set nahi kiya jaata",
    ),
    "pm-schedule-detail.fieldRules.1.name": ("Maintenance Type", "Maintenance प्रकार", "Maintenance प्रकार", "Maintenance Type"),
    "pm-schedule-detail.fieldRules.1.description": (
        "The category of work this PM covers (e.g. calibration, inspection, servicing)",
        "इस PM में शामिल काम की category (जैसे calibration, inspection, servicing)",
        "या PM मध्ये समाविष्ट कामाची category (उदा. calibration, inspection, servicing)",
        "Is PM mein cover hone wale kaam ki category (jaise calibration, inspection, servicing)",
    ),
    "pm-schedule-detail.fieldRules.2.name": ("Frequency", "आवृत्ति", "वारंवारता", "Frequency"),
    "pm-schedule-detail.fieldRules.2.description": (
        "How often this maintenance recurs (e.g. monthly, quarterly, annual)",
        "यह maintenance कितनी बार recur होता है (जैसे monthly, quarterly, annual)",
        "हे maintenance किती वेळा recur होते (उदा. monthly, quarterly, annual)",
        "Ye maintenance kitni baar recur hota hai (jaise monthly, quarterly, annual)",
    ),
    "pm-schedule-detail.fieldRules.3.name": ("Scheduled Date", "निर्धारित तिथि", "नियोजित तारीख", "Scheduled Date"),
    "pm-schedule-detail.fieldRules.3.description": (
        "The due date this cycle's maintenance is planned for; drives the Overdue calculation",
        "इस cycle के maintenance की due date; यही Overdue की गणना तय करती है",
        "या cycle च्या maintenance ची due date; हीच Overdue च्या गणनेला चालना देते",
        "Is cycle ke maintenance ki due date; yahi Overdue ki calculation ko drive karti hai",
    ),
    "pm-schedule-detail.fieldRules.4.name": ("Completed At", "पूर्णता समय", "पूर्णता वेळ", "Completed At"),
    "pm-schedule-detail.fieldRules.4.description": (
        "Timestamp the work was actually finished; blank (—) until marked complete",
        "काम वास्तव में कब पूरा हुआ इसका timestamp; complete मार्क होने तक खाली (—) रहता है",
        "काम प्रत्यक्षात कधी पूर्ण झाले याचा timestamp; complete मार्क होईपर्यंत रिकामे (—) राहते",
        "Kaam actually kab finish hua uska timestamp; complete mark hone tak blank (—) rehta hai",
    ),
    "pm-schedule-detail.tip.title": (
        "Overdue is computed, not editable",
        "Overdue गणना की जाती है, editable नहीं है",
        "Overdue गणना केली जाते, editable नाही",
        "Overdue compute hota hai, editable nahi hai",
    ),
    "pm-schedule-detail.tip.body": (
        "You can't manually flip a schedule to Overdue or back — it's derived server-side from the scheduled date each time the list loads. If a completed job still shows Overdue, check that it was actually marked complete rather than just noted elsewhere.",
        "आप किसी schedule को मैन्युअली Overdue पर या वापस फ़्लिप नहीं कर सकते — जब भी list लोड होती है, यह scheduled date से server-side पर derive होता है। अगर कोई completed job अभी भी Overdue दिखा रहा है, तो जांचें कि उसे वास्तव में complete मार्क किया गया था, न कि केवल कहीं और नोट किया गया।",
        "तुम्ही एखादे schedule मॅन्युअली Overdue वर किंवा परत फ्लिप करू शकत नाही — जेव्हा जेव्हा list लोड होते तेव्हा हे scheduled date वरून server-side वर derive होते. जर एखादी completed job अजूनही Overdue दाखवत असेल, तर तपासा की ती खरोखर complete मार्क केली गेली होती, फक्त कुठेतरी नोंदवली गेली नव्हती.",
        "Aap kisi schedule ko manually Overdue par ya wapas flip nahi kar sakte — jab bhi list load hoti hai, ye scheduled date se server-side par derive hota hai. Agar koi completed job abhi bhi Overdue dikha raha hai, to check karein ki use actually complete mark kiya gaya tha, na ki sirf kahin aur note kiya gaya.",
    ),
}


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 PM_SCHEDULE_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(PM_SCHEDULE_DETAIL)} pm-schedule-detail keys.")


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