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

Usage: docker compose exec api python seed_translations_pageinfo_asset_audit_findings.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)
ASSET_AUDIT_FINDINGS = {
    "asset-audit-findings.title": (
        "Audit Findings",
        "ऑडिट निष्कर्ष",
        "ऑडिट निष्कर्ष",
        "Audit Findings",
    ),
    "asset-audit-findings.subtitle": (
        "Track observations raised during audits and verification cycles to closure",
        "ऑडिट और सत्यापन चक्रों के दौरान उठाए गए अवलोकनों को समापन तक ट्रैक करें",
        "ऑडिट आणि पडताळणी चक्रांदरम्यान नोंदवलेल्या निरीक्षणांचा समारोपापर्यंत मागोवा घ्या",
        "Audits aur verification cycles ke dauran raise hue observations ko closure tak track karein",
    ),
    "asset-audit-findings.body.0": (
        "Findings come from two places: logged manually here, or raised automatically when a Physical Verification cycle detects a displaced or missing asset. Each finding carries a severity and a status you drive to closure.",
        "निष्कर्ष दो जगहों से आते हैं: यहाँ मैन्युअल रूप से दर्ज किए गए, या जब कोई Physical Verification चक्र किसी विस्थापित या गुम asset का पता लगाता है तो स्वचालित रूप से उठाए गए। हर निष्कर्ष के साथ एक severity और एक status होता है जिसे आपको समापन तक ले जाना होता है।",
        "निष्कर्ष दोन ठिकाणांहून येतात: येथे स्वहस्ते नोंदवलेले, किंवा जेव्हा एखादे Physical Verification चक्र विस्थापित किंवा गहाळ asset शोधते तेव्हा आपोआप नोंदवलेले. प्रत्येक निष्कर्षासोबत एक severity आणि एक status असतो जो तुम्हाला समारोपापर्यंत न्यावा लागतो.",
        "Findings do jagah se aate hain: yahan manually log kiye gaye, ya jab koi Physical Verification cycle kisi displaced ya missing asset ko detect karta hai to automatically raise hue. Har finding ke saath ek severity aur ek status hota hai jise aap closure tak drive karte hain.",
    ),
    "asset-audit-findings.body.1": (
        "The KPI cards and Age column highlight findings that are stale — open longer than 30 (amber) or 60 (red) days — so a growing backlog is visible at a glance.",
        "KPI cards और Age column उन निष्कर्षों को उजागर करते हैं जो पुराने पड़ चुके हैं — 30 दिनों (amber) या 60 दिनों (red) से अधिक समय से open — ताकि बढ़ता हुआ backlog एक नज़र में दिखाई दे।",
        "KPI cards आणि Age column अशा निष्कर्षांना ठळक करतात जे शिळे झाले आहेत — 30 दिवसांपेक्षा (amber) किंवा 60 दिवसांपेक्षा (red) जास्त काळ open — जेणेकरून वाढता backlog एका दृष्टिक्षेपात दिसेल.",
        "KPI cards aur Age column un findings ko highlight karte hain jo stale ho chuki hain — 30 din (amber) ya 60 din (red) se zyada time se open — taaki badhta hua backlog ek nazar mein dikh jaaye.",
    ),
    "asset-audit-findings.stepsHeading": (
        "Finding lifecycle",
        "निष्कर्ष जीवनचक्र",
        "निष्कर्ष जीवनचक्र",
        "Finding lifecycle",
    ),
    "asset-audit-findings.steps.0.label": ("Open", "ओपन", "ओपन", "Open"),
    "asset-audit-findings.steps.0.caption": (
        "Logged manually or raised by a verification cycle",
        "मैन्युअल रूप से दर्ज किया गया या किसी verification चक्र द्वारा उठाया गया",
        "स्वहस्ते नोंदवले किंवा एखाद्या verification चक्राद्वारे नोंदवले",
        "Manually log kiya gaya ya kisi verification cycle dwara raise kiya gaya",
    ),
    "asset-audit-findings.steps.1.label": ("In Progress", "प्रगति में", "प्रगतीपथावर", "In Progress"),
    "asset-audit-findings.steps.1.caption": (
        "Corrective action assigned and underway",
        "सुधारात्मक कार्रवाई सौंपी गई है और चल रही है",
        "सुधारात्मक कारवाई नेमून दिली आहे आणि सुरू आहे",
        "Corrective action assign ho chuki hai aur underway hai",
    ),
    "asset-audit-findings.steps.2.label": ("Resolved", "हल हो गया", "निराकरण झाले", "Resolved"),
    "asset-audit-findings.steps.2.caption": (
        "Corrective action completed",
        "सुधारात्मक कार्रवाई पूरी हो गई",
        "सुधारात्मक कारवाई पूर्ण झाली",
        "Corrective action complete ho chuki hai",
    ),
    "asset-audit-findings.steps.3.label": ("Closed", "बंद", "बंद", "Closed"),
    "asset-audit-findings.steps.3.caption": (
        "Verified and archived — no longer counted as backlog",
        "सत्यापित और archived — अब इसे backlog में नहीं गिना जाता",
        "पडताळणी करून archived — आता backlog मध्ये गणले जात नाही",
        "Verify karke archive ho chuka hai — ab isse backlog mein nahi gina jaata",
    ),
    "asset-audit-findings.fieldRules.0.name": ("Category", "श्रेणी", "श्रेणी", "Category"),
    "asset-audit-findings.fieldRules.0.description": (
        "Free-text grouping, e.g. Physical Discrepancy — must not be blank to save",
        "Free-text समूहन, जैसे Physical Discrepancy — save करने के लिए इसे खाली नहीं छोड़ा जा सकता",
        "Free-text गटवारी, उदा. Physical Discrepancy — save करण्यासाठी हे रिकामे राहू शकत नाही",
        "Free-text grouping hoti hai, jaise Physical Discrepancy — save karne ke liye ye blank nahi ho sakta",
    ),
    "asset-audit-findings.fieldRules.1.name": ("Observation", "अवलोकन", "निरीक्षण", "Observation"),
    "asset-audit-findings.fieldRules.1.description": (
        "What was actually seen — must not be blank to save",
        "वास्तव में क्या देखा गया — save करने के लिए इसे खाली नहीं छोड़ा जा सकता",
        "प्रत्यक्षात काय दिसले — save करण्यासाठी हे रिकामे राहू शकत नाही",
        "Actually kya dekha gaya wo — save karne ke liye ye blank nahi ho sakta",
    ),
    "asset-audit-findings.fieldRules.2.name": ("Severity", "गंभीरता", "गंभीरता", "Severity"),
    "asset-audit-findings.fieldRules.2.description": (
        "Critical/High/Medium/Low — drives the color badge and the Critical+High KPI; defaults to Medium",
        "Critical/High/Medium/Low — यह color badge और Critical+High KPI को तय करता है; डिफ़ॉल्ट रूप से Medium होता है",
        "Critical/High/Medium/Low — हे color badge आणि Critical+High KPI ठरवते; डीफॉल्टने Medium असते",
        "Critical/High/Medium/Low hota hai — ye color badge aur Critical+High KPI ko drive karta hai; default Medium hota hai",
    ),
    "asset-audit-findings.fieldRules.3.name": ("Status", "स्थिति", "स्थिती", "Status"),
    "asset-audit-findings.fieldRules.3.description": (
        "Changed inline from the table dropdown — only visible with audit:write permission",
        "इसे table के dropdown से inline बदला जाता है — यह केवल audit:write permission होने पर ही दिखता है",
        "हे table च्या dropdown मधून inline बदलले जाते — हे फक्त audit:write permission असल्यासच दिसते",
        "Table ke dropdown se inline change hota hai — sirf audit:write permission ke saath hi dikhta hai",
    ),
    "asset-audit-findings.fieldRules.4.name": ("Asset ID", "Asset ID", "Asset ID", "Asset ID"),
    "asset-audit-findings.fieldRules.4.description": (
        "Optional — links the finding to a specific asset record",
        "वैकल्पिक — यह finding को किसी विशिष्ट asset record से जोड़ता है",
        "पर्यायी — हे finding ला एखाद्या विशिष्ट asset record शी जोडते",
        "Optional hai — finding ko kisi specific asset record se link karta hai",
    ),
    "asset-audit-findings.tip.title": (
        "Age coloring ignores resolved/closed",
        "Age रंग-निर्धारण resolved/closed को नज़रअंदाज़ करता है",
        "Age रंगसंगती resolved/closed ला दुर्लक्षित करते",
        "Age coloring resolved/closed ko ignore karta hai",
    ),
    "asset-audit-findings.tip.body": (
        "The Age column only turns amber/red for Open and In Progress findings — a Resolved finding sitting at 90 days old stays neutral gray, since it's history, not backlog risk. If a finding looks stuck, check its status before assuming it's overdue.",
        "Age column केवल Open और In Progress निष्कर्षों के लिए amber/red होता है — 90 दिन पुराना कोई Resolved finding neutral gray ही रहता है, क्योंकि वह history है, backlog risk नहीं। यदि कोई finding अटका हुआ लगे, तो उसे overdue मान लेने से पहले उसकी status ज़रूर जाँच लें।",
        "Age column फक्त Open आणि In Progress निष्कर्षांसाठी amber/red होते — 90 दिवस जुना एखादा Resolved finding neutral gray च राहतो, कारण ते history आहे, backlog risk नाही. एखादे finding अडकल्यासारखे वाटल्यास, ते overdue समजण्यापूर्वी त्याची status नक्की तपासा.",
        "Age column sirf Open aur In Progress findings ke liye amber/red hota hai — 90 din purana koi Resolved finding neutral gray hi rehta hai, kyunki wo history hai, backlog risk nahi. Agar koi finding stuck lage, to usse overdue maanne se pehle uski status zaroor check kar lein.",
    ),
}


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 ASSET_AUDIT_FINDINGS.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(ASSET_AUDIT_FINDINGS)} asset-audit-findings keys.")


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