"""One-off seed: registers translation_keys English source_text and hi/mr/hinglish
translation_values for the "contracts" (Vendor Contracts) PageInfoButton content.

Usage: docker compose exec api python seed_translations_pageinfo_contracts.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)
CONTRACTS = {
    "contracts.title": (
        "Vendor Contracts",
        "वेंडर कॉन्ट्रैक्ट्स",
        "व्हेंडर कॉन्ट्रॅक्ट्स",
        "Vendor Contracts",
    ),
    "contracts.subtitle": (
        "AMC, service, and MSA contracts with SLA tracking, invoicing, and correspondence logs.",
        "AMC, service, और MSA contracts, जिनमें SLA tracking, invoicing, और correspondence logs शामिल हैं।",
        "AMC, service, आणि MSA contracts, ज्यात SLA tracking, invoicing, आणि correspondence logs समाविष्ट आहेत.",
        "AMC, service, aur MSA contracts, jinme SLA tracking, invoicing, aur correspondence logs shaamil hain.",
    ),
    "contracts.body.0": (
        "Manage every vendor contract — AMC, service, and master agreements — from one screen.",
        "हर vendor contract — AMC, service, और master agreements — को एक ही स्क्रीन से मैनेज करें।",
        "प्रत्येक vendor contract — AMC, service, आणि master agreements — एकाच स्क्रीनवरून मॅनेज करा.",
        "Har vendor contract — AMC, service, aur master agreements — ko ek hi screen se manage karein.",
    ),
    "contracts.body.1": (
        "Track service-level agreements, invoices, and renewal dates, and log correspondence with each vendor.",
        "service-level agreements, invoices, और renewal dates को ट्रैक करें, और हर vendor के साथ हुए correspondence को लॉग करें।",
        "service-level agreements, invoices, आणि renewal dates ट्रॅक करा, आणि प्रत्येक vendor सोबतचा correspondence लॉग करा.",
        "Service-level agreements, invoices, aur renewal dates track karein, aur har vendor ke saath hue correspondence ko log karein.",
    ),
    "contracts.stepsHeading": (
        "Contract Lifecycle",
        "कॉन्ट्रैक्ट लाइफसाइकल",
        "कॉन्ट्रॅक्ट लाइफसायकल",
        "Contract Lifecycle",
    ),
    "contracts.steps.0.label": ("Draft", "ड्राफ्ट", "ड्राफ्ट", "Draft"),
    "contracts.steps.0.caption": (
        "Created and editable; not yet billable. Edit and Activate only appear here.",
        "बनाया गया और एडिटेबल; अभी बिल करने योग्य नहीं। Edit और Activate केवल यहीं दिखाई देते हैं।",
        "तयार केलेले आणि एडिटेबल; अजून बिल करण्यायोग्य नाही. Edit आणि Activate फक्त इथेच दिसतात.",
        "Create hua aur editable hai; abhi billable nahi hai. Edit aur Activate sirf yahan dikhte hain.",
    ),
    "contracts.steps.1.label": ("Active", "एक्टिव", "अ‍ॅक्टिव्ह", "Active"),
    "contracts.steps.1.caption": (
        "Activated for invoicing and SLA tracking; the Edit action disappears from the row.",
        "invoicing और SLA tracking के लिए एक्टिवेट किया गया; Edit action row से गायब हो जाता है।",
        "invoicing आणि SLA tracking साठी अ‍ॅक्टिव्हेट केलेले; Edit action row मधून नाहीसे होते.",
        "Invoicing aur SLA tracking ke liye activate ho jaata hai; Edit action row se gayab ho jaata hai.",
    ),
    "contracts.steps.2.label": ("Renewal / Expiring", "रिन्यूअल / एक्सपायरिंग", "रिन्यूअल / एक्सपायरिंग", "Renewal / Expiring"),
    "contracts.steps.2.caption": (
        "Flagged by the Expiring Within filter as the end date approaches.",
        "End date नज़दीक आने पर Expiring Within filter द्वारा फ़्लैग किया जाता है।",
        "End date जवळ येताना Expiring Within filter द्वारे फ्लॅग केले जाते.",
        "End date paas aane par Expiring Within filter isko flag kar deta hai.",
    ),
    "contracts.steps.3.label": ("Terminated", "टर्मिनेटेड", "टर्मिनेटेड", "Terminated"),
    "contracts.steps.3.caption": (
        "Closed manually with a reason; irreversible and blocks further invoicing.",
        "कारण के साथ मैन्युअली बंद किया जाता है; यह अपरिवर्तनीय है और आगे की invoicing को रोकता है।",
        "कारणासह मॅन्युअली बंद केले जाते; हे अपरिवर्तनीय आहे आणि पुढील invoicing थांबवते.",
        "Reason ke saath manually close kiya jaata hai; ye irreversible hai aur aage ki invoicing ko block kar deta hai.",
    ),
    "contracts.fieldRules.0.name": ("Contract Number", "कॉन्ट्रैक्ट नंबर", "कॉन्ट्रॅक्ट नंबर", "Contract Number"),
    "contracts.fieldRules.0.description": (
        "Uniquely identifies the contract; locked once the contract is created.",
        "कॉन्ट्रैक्ट को यूनीक रूप से पहचानता है; कॉन्ट्रैक्ट बनने के बाद यह लॉक हो जाता है।",
        "कॉन्ट्रॅक्टला युनिकली ओळखते; कॉन्ट्रॅक्ट तयार झाल्यानंतर हे लॉक होते.",
        "Contract ko uniquely identify karta hai; contract create hone ke baad ye lock ho jaata hai.",
    ),
    "contracts.fieldRules.1.name": ("Vendor", "वेंडर", "व्हेंडर", "Vendor"),
    "contracts.fieldRules.1.description": (
        "The vendor this contract is with; also locked after creation.",
        "वह vendor जिसके साथ यह कॉन्ट्रैक्ट है; यह भी creation के बाद लॉक हो जाता है।",
        "हा कॉन्ट्रॅक्ट ज्या vendor सोबत आहे तो; creation नंतर हेही लॉक होते.",
        "Wo vendor jiske saath ye contract hai; ye bhi creation ke baad lock ho jaata hai.",
    ),
    "contracts.fieldRules.2.name": ("Contract Type", "कॉन्ट्रैक्ट टाइप", "कॉन्ट्रॅक्ट टाइप", "Contract Type"),
    "contracts.fieldRules.2.description": (
        "AMC, Service, MSA, Procurement, Task Order, Lease, or Other — categorizes the contract.",
        "AMC, Service, MSA, Procurement, Task Order, Lease, या Other — कॉन्ट्रैक्ट को categorize करता है।",
        "AMC, Service, MSA, Procurement, Task Order, Lease, किंवा Other — कॉन्ट्रॅक्टचे categorize करते.",
        "AMC, Service, MSA, Procurement, Task Order, Lease, ya Other — contract ko categorize karta hai.",
    ),
    "contracts.fieldRules.3.name": ("Contract Value", "कॉन्ट्रैक्ट वैल्यू", "कॉन्ट्रॅक्ट व्हॅल्यू", "Contract Value"),
    "contracts.fieldRules.3.description": (
        "Must be greater than 0; Available shown on the detail page is Value minus Spent.",
        "0 से अधिक होना चाहिए; detail page पर दिखाई गई Available वैल्यू, Value में से Spent घटाकर निकाली जाती है।",
        "0 पेक्षा जास्त असणे आवश्यक आहे; detail page वर दाखवलेली Available व्हॅल्यू, Value मधून Spent वजा करून काढली जाते.",
        "0 se zyada hona chahiye; detail page par dikhayi gayi Available value, Value mein se Spent minus karke nikaali jaati hai.",
    ),
    "contracts.fieldRules.4.name": ("Start Date / End Date", "स्टार्ट डेट / एंड डेट", "स्टार्ट डेट / एंड डेट", "Start Date / End Date"),
    "contracts.fieldRules.4.description": (
        "Define the coverage window; End Date drives the Expiring Within filter.",
        "coverage window को परिभाषित करती हैं; End Date, Expiring Within filter को नियंत्रित करती है।",
        "coverage window परिभाषित करतात; End Date, Expiring Within filter नियंत्रित करते.",
        "Coverage window define karti hain; End Date hi Expiring Within filter ko drive karti hai.",
    ),
    "contracts.tip.title": (
        "Edit only works pre-activation",
        "Edit केवल activation से पहले काम करता है",
        "Edit फक्त activation आधीच काम करते",
        "Edit sirf activation se pehle kaam karta hai",
    ),
    "contracts.tip.body": (
        "The Edit action only appears on Draft-status rows — once you click Activate, the pencil icon disappears and contract value, dates, and SLA terms can no longer be changed from the list. Double-check those fields before activating; only Terminate remains available afterward.",
        "Edit action केवल Draft-status वाली rows पर दिखाई देता है — Activate क्लिक करते ही pencil icon गायब हो जाता है और contract value, dates, और SLA terms को list से बदलना संभव नहीं रहता। इसलिए activate करने से पहले उन fields को दोबारा जांच लें; उसके बाद केवल Terminate ही उपलब्ध रहता है।",
        "Edit action फक्त Draft-status असलेल्या rows वर दिसतो — Activate क्लिक केल्यावर pencil icon नाहीसा होतो आणि contract value, dates, आणि SLA terms list मधून बदलता येत नाहीत. त्यामुळे activate करण्यापूर्वी ती fields नीट तपासा; त्यानंतर फक्त Terminate उपलब्ध राहते.",
        "Edit action sirf Draft-status wali rows par dikhta hai — Activate click karte hi pencil icon gayab ho jaata hai aur contract value, dates, aur SLA terms ko list se badalna possible nahi rehta. Isliye activate karne se pehle un fields ko double-check kar lein; uske baad sirf Terminate hi available 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 CONTRACTS.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(CONTRACTS)} contracts keys.")


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