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

Usage: docker compose exec api python seed_translations_pageinfo_expiry_renewal.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)
EXPIRY_RENEWAL = {
    "expiry-renewal.title": (
        "Document Expiry & Retention",
        "दस्तावेज़ एक्सपायरी एवं रिटेंशन",
        "दस्तऐवज एक्सपायरी व रिटेन्शन",
        "Document Expiry & Retention",
    ),
    "expiry-renewal.subtitle": (
        "How expiry alerts and retention actioning work",
        "एक्सपायरी अलर्ट और रिटेंशन कार्रवाई कैसे काम करती है",
        "एक्सपायरी अलर्ट आणि रिटेन्शन कारवाई कशी कार्य करते",
        "Expiry alerts aur retention actioning kaise kaam karte hain",
    ),
    "expiry-renewal.body.0": (
        "The Expiry Alerts tab lists alerts already raised by the background expiry checker for documents nearing their expiry date (warranties, licences, certificates). The Retention Due tab — visible only to Document Admins — lists documents that have passed their mandated retention period and are awaiting archival or destruction.",
        "एक्सपायरी अलर्ट्स टैब में उन दस्तावेज़ों के लिए बैकग्राउंड एक्सपायरी चेकर द्वारा पहले से उठाए गए अलर्ट सूचीबद्ध होते हैं जिनकी एक्सपायरी तिथि नज़दीक है (वारंटी, लाइसेंस, प्रमाणपत्र)। रिटेंशन ड्यू टैब — जो केवल डॉक्यूमेंट एडमिन को दिखाई देता है — उन दस्तावेज़ों को सूचीबद्ध करता है जिनकी निर्धारित रिटेंशन अवधि बीत चुकी है और जो आर्काइवल या डिस्ट्रक्शन की प्रतीक्षा में हैं।",
        "एक्सपायरी अलर्ट्स टॅबमध्ये अशा दस्तऐवजांसाठी बॅकग्राउंड एक्सपायरी चेकरने आधीच उठवलेले अलर्ट सूचीबद्ध असतात ज्यांची एक्सपायरी तारीख जवळ आली आहे (वॉरंटी, लायसन्स, प्रमाणपत्रे). रिटेन्शन ड्यू टॅब — जो फक्त डॉक्युमेंट अ‍ॅडमिनना दिसतो — अशा दस्तऐवजांची यादी करतो ज्यांचा निर्धारित रिटेन्शन कालावधी संपला आहे आणि जे आर्काइव्हल किंवा डिस्ट्रक्शनच्या प्रतीक्षेत आहेत.",
        "Expiry Alerts tab mein un documents ke liye background expiry checker dwara pehle se raise kiye gaye alerts list hote hain jinki expiry date nazdeek hai (warranties, licences, certificates). Retention Due tab — jo sirf Document Admins ko dikhta hai — un documents ko list karta hai jinki mandated retention period nikal chuki hai aur jo archival ya destruction ka wait kar rahe hain.",
    ),
    "expiry-renewal.stepsHeading": (
        "How a document reaches this page",
        "एक दस्तावेज़ इस पेज तक कैसे पहुँचता है",
        "एखादा दस्तऐवज या पेजपर्यंत कसा पोहोचतो",
        "Ek document is page tak kaise pahunchta hai",
    ),
    "expiry-renewal.steps.0.label": ("Expiry Checker", "एक्सपायरी चेकर", "एक्सपायरी चेकर", "Expiry Checker"),
    "expiry-renewal.steps.0.caption": (
        "Scheduled job scans expiry dates",
        "शेड्यूल्ड जॉब एक्सपायरी तिथियों को स्कैन करता है",
        "शेड्यूल्ड जॉब एक्सपायरी तारखा स्कॅन करतो",
        "Scheduled job expiry dates ko scan karta hai",
    ),
    "expiry-renewal.steps.1.label": ("Alert Raised", "अलर्ट जारी", "अलर्ट जारी", "Alert Raised"),
    "expiry-renewal.steps.1.caption": (
        "Within its alert threshold",
        "अपने अलर्ट थ्रेशोल्ड के भीतर",
        "त्याच्या अलर्ट थ्रेशोल्डमध्ये",
        "Apne alert threshold ke andar",
    ),
    "expiry-renewal.steps.2.label": ("Renew", "नवीनीकरण", "नूतनीकरण", "Renew"),
    "expiry-renewal.steps.2.caption": (
        "Upload the replacement document",
        "प्रतिस्थापन दस्तावेज़ अपलोड करें",
        "बदली दस्तऐवज अपलोड करा",
        "Replacement document upload karein",
    ),
    "expiry-renewal.steps.3.label": ("Retention Due", "रिटेंशन ड्यू", "रिटेन्शन ड्यू", "Retention Due"),
    "expiry-renewal.steps.3.caption": (
        "Past retention window",
        "रिटेंशन विंडो बीत चुकी",
        "रिटेन्शन विंडो संपलेली",
        "Retention window past ho chuki",
    ),
    "expiry-renewal.steps.4.label": (
        "Mark Actioned",
        "एक्शन्ड के रूप में चिह्नित करें",
        "अ‍ॅक्शन्ड म्हणून चिन्हांकित करा",
        "Mark Actioned",
    ),
    "expiry-renewal.steps.4.caption": (
        "Admin confirms archive/destroy",
        "एडमिन आर्काइव/डिस्ट्रॉय की पुष्टि करता है",
        "अ‍ॅडमिन आर्काइव्ह/डिस्ट्रॉयची पुष्टी करतो",
        "Admin archive/destroy confirm karta hai",
    ),
    "expiry-renewal.fieldRules.0.name": ("Expiry Date", "एक्सपायरी तिथि", "एक्सपायरी तारीख", "Expiry Date"),
    "expiry-renewal.fieldRules.0.description": (
        "The date the document itself expires — not the asset's warranty date.",
        "वह तिथि जब दस्तावेज़ स्वयं समाप्त होता है — एसेट की वारंटी तिथि नहीं।",
        "ती तारीख जेव्हा दस्तऐवज स्वतः एक्सपायर होतो — एसेटच्या वॉरंटी तारखेशी संबंधित नाही.",
        "Wo date jab document khud expire hota hai — asset ki warranty date nahi.",
    ),
    "expiry-renewal.fieldRules.1.name": ("Alert Threshold", "अलर्ट थ्रेशोल्ड", "अलर्ट थ्रेशोल्ड", "Alert Threshold"),
    "expiry-renewal.fieldRules.1.description": (
        "How many days before expiry the checker raised this alert.",
        "चेकर ने एक्सपायरी से कितने दिन पहले यह अलर्ट जारी किया।",
        "चेकरने एक्सपायरीच्या किती दिवस आधी हा अलर्ट जारी केला.",
        "Checker ne expiry se kitne din pehle ye alert raise kiya.",
    ),
    "expiry-renewal.fieldRules.2.name": ("Retention Expiry", "रिटेंशन एक्सपायरी", "रिटेन्शन एक्सपायरी", "Retention Expiry"),
    "expiry-renewal.fieldRules.2.description": (
        "Date the document's mandated retention period lapses, based on Retention Years.",
        "वह तिथि जब दस्तावेज़ की निर्धारित रिटेंशन अवधि, रिटेंशन ईयर्स के आधार पर समाप्त होती है।",
        "ती तारीख जेव्हा दस्तऐवजाचा निर्धारित रिटेन्शन कालावधी, रिटेन्शन इयर्सच्या आधारे संपतो.",
        "Wo date jab document ki mandated retention period, Retention Years ke basis par khatam hoti hai.",
    ),
    "expiry-renewal.fieldRules.3.name": ("Mark Actioned", "मार्क एक्शन्ड", "मार्क अ‍ॅक्शन्ड", "Mark Actioned"),
    "expiry-renewal.fieldRules.3.description": (
        "Confirms the document was archived or destroyed per policy, then removes it from this list.",
        "पुष्टि करता है कि दस्तावेज़ को नीति के अनुसार आर्काइव या डिस्ट्रॉय किया गया, फिर इसे इस सूची से हटा देता है।",
        "दस्तऐवज धोरणानुसार आर्काइव्ह किंवा डिस्ट्रॉय करण्यात आला याची पुष्टी करतो, नंतर तो या यादीतून काढून टाकतो.",
        "Confirm karta hai ki document policy ke hisaab se archive ya destroy kiya gaya, phir use is list se remove kar deta hai.",
    ),
    "expiry-renewal.tip.title": (
        "Capped at 50 alerts",
        "50 अलर्ट तक सीमित",
        "50 अलर्टपर्यंत मर्यादित",
        "50 alerts tak capped",
    ),
    "expiry-renewal.tip.body": (
        "Expiry Alerts always loads only the first 50 rows (no pagination on this tab). If more than 50 are outstanding, the tab badge and list undercount — resolve or renew the oldest ones first to bring the rest into view.",
        "एक्सपायरी अलर्ट्स हमेशा केवल पहली 50 पंक्तियाँ लोड करता है (इस टैब पर कोई पेजिनेशन नहीं है)। यदि 50 से अधिक लंबित हैं, तो टैब बैज और सूची कम गिनती दिखाते हैं — शेष को देखने के लिए पहले सबसे पुराने वाले हल करें या नवीनीकृत करें।",
        "एक्सपायरी अलर्ट्स नेहमी फक्त पहिल्या 50 पंक्ती लोड करते (या टॅबवर पेजिनेशन नाही). जर 50 पेक्षा जास्त प्रलंबित असतील, तर टॅब बॅज आणि यादी कमी मोजते — उर्वरित पाहण्यासाठी आधी सर्वात जुने सोडवा किंवा नूतनीकरण करा.",
        "Expiry Alerts hamesha sirf pehli 50 rows load karta hai (is tab par koi pagination nahi hai). Agar 50 se zyada pending hain, to tab badge aur list undercount karte hain — baaki dikhane ke liye pehle sabse purane wale resolve ya renew 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 EXPIRY_RENEWAL.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(EXPIRY_RENEWAL)} expiry-renewal keys.")


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