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

Usage: docker compose exec api python seed_translations_pageinfo_pm_schedule.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 = {
    "pm-schedule.title": (
        "Preventive Maintenance Schedule",
        "निवारक रखरखाव अनुसूची",
        "प्रतिबंधात्मक देखभाल वेळापत्रक",
        "Preventive Maintenance Schedule",
    ),
    "pm-schedule.subtitle": (
        "Plan and track routine upkeep tasks per asset",
        "प्रत्येक asset के लिए नियमित रखरखाव कार्यों की योजना बनाएं और ट्रैक करें",
        "प्रत्येक asset साठी नियमित देखभाल कामांचे नियोजन करा आणि ट्रॅक करा",
        "Har asset ke liye routine upkeep tasks plan aur track karein",
    ),
    "pm-schedule.body.0": (
        "Each row is a single scheduled maintenance occurrence for one asset — not a recurring rule. Creating a schedule reserves a due date; nothing repeats on its own.",
        "हर row एक asset के लिए एक ही scheduled maintenance occurrence है — कोई recurring rule नहीं। Schedule बनाने से एक due date रिज़र्व होती है; अपने-आप कुछ भी दोहराया नहीं जाता।",
        "प्रत्येक row ही एका asset साठी एकच scheduled maintenance occurrence आहे — recurring rule नाही. Schedule तयार केल्याने एक due date राखीव होते; आपोआप काहीही पुनरावृत्ती होत नाही.",
        "Har row ek asset ke liye ek single scheduled maintenance occurrence hai — koi recurring rule nahi. Schedule create karne se ek due date reserve hoti hai; kuch bhi apne aap repeat nahi hota.",
    ),
    "pm-schedule.body.1": (
        "Click Execute once the work is physically done to close it out. Overdue is calculated live from the scheduled date — it isn't a status you set yourself.",
        "काम शारीरिक रूप से पूरा होने पर उसे बंद करने के लिए Execute पर क्लिक करें। Overdue scheduled date से live calculate होता है — यह कोई ऐसा status नहीं है जिसे आप खुद सेट करते हैं।",
        "काम प्रत्यक्षात पूर्ण झाल्यावर ते बंद करण्यासाठी Execute वर क्लिक करा. Overdue हे scheduled date पासून live calculate होते — हा तुम्ही स्वतः सेट करत असलेला status नाही.",
        "Kaam physically complete hone par use close karne ke liye Execute par click karein. Overdue scheduled date se live calculate hota hai — ye koi status nahi hai jo aap khud set karte hain.",
    ),
    "pm-schedule.stepsHeading": (
        "Schedule lifecycle",
        "Schedule का जीवनचक्र",
        "Schedule चे जीवनचक्र",
        "Schedule ka lifecycle",
    ),
    "pm-schedule.steps.0.label": ("Create Schedule", "Schedule बनाएं", "Schedule तयार करा", "Schedule Create karein"),
    "pm-schedule.steps.0.caption": (
        "Pick asset, activity type, frequency and due date.",
        "Asset, activity type, frequency और due date चुनें।",
        "Asset, activity type, frequency आणि due date निवडा.",
        "Asset, activity type, frequency aur due date pick karein.",
    ),
    "pm-schedule.steps.1.label": ("Scheduled", "Scheduled", "Scheduled", "Scheduled"),
    "pm-schedule.steps.1.caption": (
        "Open and counted in the stats until executed.",
        "Execute होने तक Open रहता है और stats में गिना जाता है।",
        "Execute होईपर्यंत Open राहते आणि stats मध्ये मोजले जाते.",
        "Execute hone tak Open rehta hai aur stats mein count hota hai.",
    ),
    "pm-schedule.steps.2.label": ("Overdue", "Overdue", "Overdue", "Overdue"),
    "pm-schedule.steps.2.caption": (
        "Auto-flagged once the due date passes, unexecuted.",
        "Due date निकल जाने और execute न होने पर यह अपने-आप flag हो जाता है।",
        "Due date उलटून गेल्यावर आणि execute न झाल्यास हे आपोआप flag होते.",
        "Due date nikalne aur execute na hone par ye apne aap flag ho jaata hai.",
    ),
    "pm-schedule.steps.3.label": ("Completed", "Completed", "Completed", "Completed"),
    "pm-schedule.steps.3.caption": (
        "Set by Execute; the record is then locked in.",
        "Execute द्वारा सेट होता है; उसके बाद record लॉक हो जाता है।",
        "Execute द्वारे सेट होते; त्यानंतर record लॉक होते.",
        "Execute se set hota hai; uske baad record lock ho jaata hai.",
    ),
    "pm-schedule.fieldRules.0.name": ("Asset", "एसेट", "एसेट", "Asset"),
    "pm-schedule.fieldRules.0.description": (
        "Which asset this schedule applies to; picked via search, fixed after creation.",
        "यह schedule किस asset पर लागू होता है; search के ज़रिए चुना जाता है, creation के बाद fixed हो जाता है।",
        "हे schedule कोणत्या asset ला लागू होते; search द्वारे निवडले जाते, creation नंतर fixed होते.",
        "Ye schedule kis asset par apply hota hai; search ke zariye pick kiya jaata hai, creation ke baad fixed ho jaata hai.",
    ),
    "pm-schedule.fieldRules.1.name": (
        "Maintenance Activity Type",
        "रखरखाव गतिविधि प्रकार",
        "देखभाल क्रियाकलाप प्रकार",
        "Maintenance Activity Type",
    ),
    "pm-schedule.fieldRules.1.description": (
        "Free-text description of the work to be performed.",
        "किए जाने वाले काम का free-text विवरण।",
        "करावयाच्या कामाचे free-text वर्णन.",
        "Perform kiye jaane wale kaam ka free-text description.",
    ),
    "pm-schedule.fieldRules.2.name": ("Frequency", "आवृत्ति", "वारंवारता", "Frequency"),
    "pm-schedule.fieldRules.2.description": (
        "Recurrence label only (Bi-Weekly…Yearly) — informational, not automated.",
        "केवल एक recurrence label है (Bi-Weekly…Yearly) — यह सिर्फ़ जानकारी के लिए है, automated नहीं है।",
        "फक्त एक recurrence label आहे (Bi-Weekly…Yearly) — फक्त माहितीसाठी आहे, automated नाही.",
        "Sirf ek recurrence label hai (Bi-Weekly…Yearly) — ye sirf informational hai, automated nahi hai.",
    ),
    "pm-schedule.fieldRules.3.name": ("Scheduled Date", "नियत तिथि", "नियोजित तारीख", "Scheduled Date"),
    "pm-schedule.fieldRules.3.description": (
        "Due date for this occurrence; defaults to today, editable to any date.",
        "इस occurrence के लिए due date; डिफ़ॉल्ट रूप से आज की तारीख, किसी भी तारीख में बदली जा सकती है।",
        "या occurrence साठी due date; डीफॉल्टनुसार आजची तारीख, कोणत्याही तारखेत बदलता येते.",
        "Is occurrence ke liye due date; default aaj ki date hoti hai, kisi bhi date mein edit ki jaa sakti hai.",
    ),
    "pm-schedule.fieldRules.4.name": ("Status", "स्थिति", "स्थिती", "Status"),
    "pm-schedule.fieldRules.4.description": (
        "Scheduled / Overdue / Completed — Overdue is computed live, never stored.",
        "Scheduled / Overdue / Completed — Overdue हमेशा live compute होता है, कभी store नहीं होता।",
        "Scheduled / Overdue / Completed — Overdue नेहमी live compute होते, कधीही store होत नाही.",
        "Scheduled / Overdue / Completed — Overdue hamesha live compute hota hai, kabhi store nahi hota.",
    ),
    "pm-schedule.tip.title": (
        "Frequency doesn't auto-repeat",
        "Frequency अपने-आप repeat नहीं होती",
        "Frequency आपोआप repeat होत नाही",
        "Frequency apne aap auto-repeat nahi hoti",
    ),
    "pm-schedule.tip.body": (
        "Executing a schedule closes it out for good — it does not create the next occurrence. For a recurring task (e.g. Quarterly), create a new PM Schedule yourself for the next due date once this one is done.",
        "किसी schedule को Execute करने से वह हमेशा के लिए बंद हो जाता है — इससे अगला occurrence नहीं बनता। किसी recurring task (जैसे Quarterly) के लिए, यह पूरा होने के बाद अगली due date के लिए खुद एक नया PM Schedule बनाएं।",
        "एखादे schedule Execute केल्याने ते कायमचे बंद होते — यामुळे पुढील occurrence तयार होत नाही. एखाद्या recurring task साठी (उदा. Quarterly), हे पूर्ण झाल्यावर पुढील due date साठी स्वतः एक नवीन PM Schedule तयार करा.",
        "Schedule ko Execute karne se wo hamesha ke liye close ho jaata hai — isse next occurrence create nahi hota. Kisi recurring task (jaise Quarterly) ke liye, ye complete hone ke baad next due date ke liye khud ek naya PM Schedule create 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 PM_SCHEDULE.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)} pm-schedule keys.")


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