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

Usage: docker compose exec api python seed_translations_pageinfo_iso_55001_readiness.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)
ISO_55001_READINESS = {
    "iso-55001-readiness.title": (
        "ISO 55001 Readiness Checklist",
        "ISO 55001 तैयारी चेकलिस्ट",
        "ISO 55001 तयारी चेकलिस्ट",
        "ISO 55001 Readiness Checklist",
    ),
    "iso-55001-readiness.subtitle": (
        "Score your asset management practice against the ISO 55001 standard",
        "अपने asset management अभ्यास को ISO 55001 मानक के अनुसार स्कोर करें",
        "तुमच्या asset management सरावाला ISO 55001 मानकाविरुद्ध स्कोअर करा",
        "Apni asset management practice ko ISO 55001 standard ke against score karein",
    ),
    "iso-55001-readiness.body.0": (
        "Each row is a clause of the ISO 55001 asset management standard, grouped by category. Set a status per clause and attach evidence notes to build an auditable readiness record.",
        "प्रत्येक row ISO 55001 asset management मानक का एक clause है, जो category के अनुसार समूहीकृत है। एक auditable readiness record बनाने के लिए प्रत्येक clause के लिए status सेट करें और evidence notes संलग्न करें।",
        "प्रत्येक row हा ISO 55001 asset management मानकाचा एक clause आहे, जो category नुसार गटबद्ध केलेला आहे. एक auditable readiness record तयार करण्यासाठी प्रत्येक clause साठी status सेट करा आणि evidence notes जोडा.",
        "Har row ISO 55001 asset management standard ka ek clause hai, jo category ke hisaab se grouped hai. Ek auditable readiness record banane ke liye har clause ke liye status set karein aur evidence notes attach karein.",
    ),
    "iso-55001-readiness.body.1": (
        "The Readiness Score card recalculates automatically after every status change, and excludes Not Applicable items from the denominator so they don't drag the score down.",
        "Readiness Score card हर status change के बाद अपने आप recalculate होता है, और denominator से Not Applicable items को बाहर रखता है ताकि वे score को नीचे न खींचें।",
        "Readiness Score card प्रत्येक status change नंतर आपोआप recalculate होते, आणि denominator मधून Not Applicable items वगळते जेणेकरून ते score खाली ओढणार नाहीत.",
        "Readiness Score card har status change ke baad automatically recalculate hota hai, aur denominator se Not Applicable items ko exclude karta hai taaki wo score ko neeche na khinchein.",
    ),
    "iso-55001-readiness.stepsHeading": (
        "Status flow",
        "स्टेटस फ्लो",
        "स्टेटस फ्लो",
        "Status flow",
    ),
    "iso-55001-readiness.steps.0.label": ("Not Started", "शुरू नहीं हुआ", "सुरू न झालेले", "Not Started"),
    "iso-55001-readiness.steps.0.caption": (
        "Default state — no evidence gathered yet",
        "डिफ़ॉल्ट स्थिति — अभी तक कोई evidence एकत्र नहीं हुआ",
        "डीफॉल्ट स्थिती — अद्याप कोणताही evidence गोळा केलेला नाही",
        "Default state — abhi tak koi evidence gather nahi hua",
    ),
    "iso-55001-readiness.steps.1.label": ("In Progress", "प्रगति पर", "प्रगतीपथावर", "In Progress"),
    "iso-55001-readiness.steps.1.caption": (
        "Evidence being collected or partially in place",
        "Evidence एकत्र किया जा रहा है या आंशिक रूप से मौजूद है",
        "Evidence गोळा केले जात आहे किंवा अंशतः उपलब्ध आहे",
        "Evidence collect ho raha hai ya partially in place hai",
    ),
    "iso-55001-readiness.steps.2.label": ("Compliant", "अनुपालित", "अनुपालित", "Compliant"),
    "iso-55001-readiness.steps.2.caption": (
        "Requirement met and evidenced — counts toward the score",
        "Requirement पूरी हुई और evidence किया गया — यह score में गिना जाता है",
        "Requirement पूर्ण झाली आणि evidence केली गेली — हे score मध्ये मोजले जाते",
        "Requirement meet ho gayi aur evidence ho gaya — ye score mein count hota hai",
    ),
    "iso-55001-readiness.steps.3.label": ("Not Applicable", "लागू नहीं", "लागू नाही", "Not Applicable"),
    "iso-55001-readiness.steps.3.caption": (
        "Excluded from the score denominator entirely",
        "पूरी तरह से score denominator से बाहर रखा गया",
        "पूर्णपणे score denominator मधून वगळलेले",
        "Score denominator se poori tarah exclude kiya gaya",
    ),
    "iso-55001-readiness.fieldRules.0.name": ("Status", "स्थिति", "स्थिती", "Status"),
    "iso-55001-readiness.fieldRules.0.description": (
        "One of Not Started / In Progress / Compliant / Not Applicable; editable only with audit:write permission",
        "Not Started / In Progress / Compliant / Not Applicable में से एक; केवल audit:write permission के साथ संपादन योग्य",
        "Not Started / In Progress / Compliant / Not Applicable यापैकी एक; फक्त audit:write permission सह संपादनयोग्य",
        "Not Started / In Progress / Compliant / Not Applicable mein se ek; sirf audit:write permission ke saath editable",
    ),
    "iso-55001-readiness.fieldRules.1.name": ("Evidence Notes", "Evidence Notes", "Evidence Notes", "Evidence Notes"),
    "iso-55001-readiness.fieldRules.1.description": (
        "Free-text justification or reference for the current status; click the cell to edit inline",
        "वर्तमान status के लिए फ्री-टेक्स्ट औचित्य या संदर्भ; inline संपादन के लिए cell पर क्लिक करें",
        "सध्याच्या status साठी फ्री-टेक्स्ट औचित्य किंवा संदर्भ; inline संपादनासाठी cell वर क्लिक करा",
        "Current status ke liye free-text justification ya reference; inline edit karne ke liye cell par click karein",
    ),
    "iso-55001-readiness.fieldRules.2.name": ("Item Code", "आइटम कोड", "आयटम कोड", "Item Code"),
    "iso-55001-readiness.fieldRules.2.description": (
        "The ISO 55001 clause reference the row corresponds to",
        "वह ISO 55001 clause reference जिससे row मेल खाता है",
        "row ज्या ISO 55001 clause संदर्भाशी संबंधित आहे तो",
        "Wo ISO 55001 clause reference jiske row corresponds karta hai",
    ),
    "iso-55001-readiness.tip.title": (
        "Read-only unless you have audit:write",
        "audit:write न हो तो केवल पढ़ने योग्य",
        "audit:write नसल्यास फक्त वाचनीय",
        "audit:write nahi hai to read-only",
    ),
    "iso-55001-readiness.tip.body": (
        "Without audit:write permission the Status dropdown and evidence notes are view-only. If a clause genuinely doesn't apply to your organization, mark it Not Applicable rather than leaving it Not Started — only Not Applicable removes it from the score's denominator, so an unattended clause keeps counting against your readiness score forever.",
        "audit:write permission के बिना Status dropdown और evidence notes केवल देखने योग्य हैं। यदि कोई clause वास्तव में आपके organization पर लागू नहीं होता, तो उसे Not Started छोड़ने के बजाय Not Applicable के रूप में चिह्नित करें — केवल Not Applicable ही इसे score के denominator से हटाता है, इसलिए एक अनदेखा clause हमेशा के लिए आपके readiness score के विरुद्ध गिनता रहता है।",
        "audit:write permission शिवाय Status dropdown आणि evidence notes फक्त पाहण्यासाठी आहेत. जर एखादा clause खरोखर तुमच्या organization ला लागू होत नसेल, तर तो Not Started ठेवण्याऐवजी Not Applicable म्हणून चिन्हांकित करा — फक्त Not Applicable हाच तो score च्या denominator मधून वगळतो, त्यामुळे दुर्लक्षित clause कायमचा तुमच्या readiness score विरुद्ध मोजला जात राहतो.",
        "Audit:write permission ke bina Status dropdown aur evidence notes sirf view-only hain. Agar koi clause genuinely aapke organization par apply nahi hota, to use Not Started chhodne ke bajaye Not Applicable mark karein — sirf Not Applicable hi ise score ke denominator se remove karta hai, isliye ek unattended clause hamesha aapke readiness score ke against count hota rehta hai.",
    ),
}


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 ISO_55001_READINESS.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(ISO_55001_READINESS)} iso-55001-readiness keys.")


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