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

Usage: docker compose exec api python seed_translations_pageinfo_verification_plans.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)
VERIFICATION_PLANS = {
    "verification-plans.title": (
        "Physical Asset Checks",
        "फ़िज़िकल एसेट जाँच",
        "फिजिकल असेट तपासणी",
        "Physical Asset Checks",
    ),
    "verification-plans.subtitle": (
        "Plan, run and reconcile the periodic physical count of assets",
        "Assets की आवधिक भौतिक गणना की योजना बनाएं, चलाएं और मिलान करें",
        "Assets ची आवर्ती भौतिक मोजणी करा, ती राबवा आणि जुळवा",
        "Assets ki periodic physical count ko plan karein, run karein aur reconcile karein",
    ),
    "verification-plans.body.0": (
        "A physical check confirms the assets in your records actually exist where they should — the yearly count required by GFR 2017 Rule 190.",
        "एक भौतिक जाँच (physical check) यह पुष्टि करती है कि आपके records में मौजूद assets वास्तव में वहीं मौजूद हैं जहाँ उन्हें होना चाहिए — यह वार्षिक गणना GFR 2017 Rule 190 के तहत अनिवार्य है।",
        "एक भौतिक तपासणी (physical check) याची खात्री करते की तुमच्या records मधील assets खरोखर तिथेच अस्तित्वात आहेत जिथे त्या असायला हव्यात — ही वार्षिक गणना GFR 2017 Rule 190 अंतर्गत अनिवार्य आहे.",
        "Physical check confirm karta hai ki aapke records mein maujood assets waastav mein wahin exist karte hain jahan unhe hona chahiye — ye yearly count GFR 2017 Rule 190 ke tehet required hai.",
    ),
    "verification-plans.body.1": (
        "Create a check, mark it started, then compare records against what was physically found (scanned). Anything on record but not found is 'Missing'; anything found but not on record is 'Extra'.",
        "एक check बनाएं, उसे started के रूप में mark करें, फिर records की तुलना उससे करें जो physically पाया गया (scanned) है। जो record में है पर मिला नहीं वह 'Missing' है; जो मिला पर record में नहीं वह 'Extra' है।",
        "एक check तयार करा, तो started म्हणून mark करा, नंतर records ची तुलना physically सापडलेल्या (scanned) गोष्टींशी करा. जे record मध्ये आहे पण सापडले नाही ते 'Missing' आहे; जे सापडले पण record मध्ये नाही ते 'Extra' आहे.",
        "Ek check banayein, use started mark karein, phir records ko physically found (scanned) cheezon se compare karein. Jo record mein hai par mila nahi wo 'Missing' hai; jo mila par record mein nahi wo 'Extra' hai.",
    ),
    "verification-plans.stepsHeading": (
        "Lifecycle of a check",
        "जाँच का जीवनचक्र",
        "तपासणीचे जीवनचक्र",
        "Check ka lifecycle",
    ),
    "verification-plans.steps.0.label": ("Not started", "शुरू नहीं हुआ", "सुरू झाले नाही", "Not started"),
    "verification-plans.steps.0.caption": (
        "Plan created — name, method and scope set, nothing scanned yet.",
        "Plan बनाया गया — नाम, method और scope तय, अभी तक कुछ भी scan नहीं हुआ।",
        "Plan तयार केला — नाव, method आणि scope निश्चित, अजून काहीही scan झालेले नाही.",
        "Plan create ho chuka hai — naam, method aur scope set hai, abhi tak kuch scan nahi hua.",
    ),
    "verification-plans.steps.1.label": ("Checking in progress", "जाँच प्रगति पर है", "तपासणी प्रगतीपथावर आहे", "Checking in progress"),
    "verification-plans.steps.1.caption": (
        "Field teams scan/verify assets against the plan's scope.",
        "Field teams plan के scope के अनुसार assets को scan/verify करती हैं।",
        "Field teams plan च्या scope नुसार assets scan/verify करतात.",
        "Field teams plan ke scope ke against assets ko scan/verify karti hain.",
    ),
    "verification-plans.steps.2.label": ("Checked", "जाँच हो गई", "तपासणी झाली", "Checked"),
    "verification-plans.steps.2.caption": (
        "Records compared with what was found — Missing/Extra problems listed for review.",
        "Records की तुलना जो पाया गया उससे की गई — review के लिए Missing/Extra समस्याएँ सूचीबद्ध हैं।",
        "Records ची तुलना जे सापडले त्याच्याशी केली — review साठी Missing/Extra समस्या सूचीबद्ध आहेत.",
        "Records ko jo mila usse compare kiya gaya hai — review ke liye Missing/Extra problems list ho jaati hain.",
    ),
    "verification-plans.steps.3.label": ("Finished & signed off", "समाप्त और sign off", "पूर्ण आणि sign off", "Finished & signed off"),
    "verification-plans.steps.3.caption": (
        "All problems resolved or written off — plan locked, no further edits.",
        "सभी समस्याएँ resolve या write off कर दी गई हैं — plan lock हो गया है, आगे कोई edit नहीं।",
        "सर्व समस्या resolve किंवा write off केल्या आहेत — plan lock झाला आहे, पुढे कोणतेही edit नाही.",
        "Sab problems resolve ya write off ho chuki hain — plan lock ho gaya hai, aage koi edit nahi.",
    ),
    "verification-plans.fieldRules.0.name": ("Check Name", "Check का नाम", "Check चे नाव", "Check Name"),
    "verification-plans.fieldRules.0.description": (
        "Free-text label (e.g. 'FY2026-27 Annual Verification') — the only field required to create a plan.",
        "Free-text लेबल (जैसे 'FY2026-27 Annual Verification') — plan बनाने के लिए यही एकमात्र आवश्यक field है।",
        "Free-text लेबल (उदा. 'FY2026-27 Annual Verification') — plan तयार करण्यासाठी हेच एकमेव आवश्यक field आहे.",
        "Free-text label (jaise 'FY2026-27 Annual Verification') — plan banane ke liye yahi ek field required hai.",
    ),
    "verification-plans.fieldRules.1.name": ("Method", "Method", "Method", "Method"),
    "verification-plans.fieldRules.1.description": (
        "Census checks every asset; Sample checks a subset; Risk-based prioritises high-value/critical assets first.",
        "Census हर asset की जाँच करता है; Sample एक subset की जाँच करता है; Risk-based high-value/critical assets को पहले प्राथमिकता देता है।",
        "Census प्रत्येक asset ची तपासणी करते; Sample एका subset ची तपासणी करते; Risk-based high-value/critical assets ला प्रथम प्राधान्य देते.",
        "Census har asset ko check karta hai; Sample ek subset ko check karta hai; Risk-based high-value/critical assets ko pehle prioritise karta hai.",
    ),
    "verification-plans.fieldRules.2.name": ("Departments (scope)", "Departments (scope)", "Departments (scope)", "Departments (scope)"),
    "verification-plans.fieldRules.2.description": (
        "Optional org-unit filter — leave blank to cover the whole organisation.",
        "वैकल्पिक org-unit filter — पूरे organisation को cover करने के लिए इसे खाली छोड़ दें।",
        "पर्यायी org-unit filter — संपूर्ण organisation cover करण्यासाठी हे रिकामे सोडा.",
        "Optional org-unit filter hai — poore organisation ko cover karne ke liye ise blank chhod dein.",
    ),
    "verification-plans.fieldRules.3.name": ("Assigned To", "Assigned To", "Assigned To", "Assigned To"),
    "verification-plans.fieldRules.3.description": (
        "Optional owner responsible for running the field verification.",
        "field verification चलाने के लिए ज़िम्मेदार वैकल्पिक owner।",
        "field verification राबवण्यासाठी जबाबदार असलेला पर्यायी owner.",
        "Field verification run karne ke liye responsible optional owner.",
    ),
    "verification-plans.fieldRules.4.name": ("Planned Date", "Planned Date", "Planned Date", "Planned Date"),
    "verification-plans.fieldRules.4.description": (
        "Target date for the check; defaults to today.",
        "check के लिए target तारीख; डिफ़ॉल्ट रूप से आज की तारीख होती है।",
        "check साठी target तारीख; डीफॉल्टने आजची तारीख असते.",
        "Check ke liye target date; default aaj ki date hoti hai.",
    ),
    "verification-plans.tip.title": (
        "Deleting only works pre-start",
        "Delete केवल शुरू होने से पहले काम करता है",
        "Delete फक्त सुरू होण्यापूर्वीच काम करते",
        "Delete sirf start hone se pehle kaam karta hai",
    ),
    "verification-plans.tip.body": (
        "A plan can only be deleted while it's still 'Not started'. Once you click Start checking, use Compare/Finish to move it forward — the only way out of a stuck plan is resolving or writing off its discrepancies.",
        "एक plan तभी delete किया जा सकता है जब वह अभी भी 'Not started' स्थिति में हो। एक बार Start checking क्लिक करने के बाद, उसे आगे बढ़ाने के लिए Compare/Finish का उपयोग करें — अटके हुए plan से बाहर निकलने का एकमात्र तरीका उसकी discrepancies को resolve या write off करना है।",
        "एखादा plan फक्त तेव्हाच delete करता येतो जेव्हा तो अजूनही 'Not started' स्थितीत असतो. एकदा Start checking क्लिक केल्यावर, तो पुढे नेण्यासाठी Compare/Finish वापरा — अडकलेल्या plan मधून बाहेर पडण्याचा एकमेव मार्ग म्हणजे त्याच्या discrepancies resolve किंवा write off करणे.",
        "Plan tabhi delete ho sakta hai jab wo abhi bhi 'Not started' status mein ho. Ek baar Start checking click karne ke baad, use aage badhane ke liye Compare/Finish use karein — atke hue plan se bahar nikalne ka ek hi tarika hai uski discrepancies ko resolve ya write off karna.",
    ),
}


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 VERIFICATION_PLANS.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(VERIFICATION_PLANS)} verification-plans keys.")


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