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

Usage: docker compose exec api python seed_translations_pageinfo_planning_reports.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)
PLANNING_REPORTS = {
    "planning-reports.title": (
        "Planning Reports & History",
        "योजना रिपोर्ट और इतिहास",
        "योजना अहवाल आणि इतिहास",
        "Planning Reports & History",
    ),
    "planning-reports.subtitle": (
        "CapEx forecast scenarios and asset renewal candidates.",
        "CapEx पूर्वानुमान scenarios और asset renewal के उम्मीदवार।",
        "CapEx अंदाज scenarios आणि asset renewal साठी उमेदवार.",
        "CapEx forecast scenarios aur asset renewal ke candidates.",
    ),
    "planning-reports.body.0": (
        "This page has two independent views: saved CapEx forecast scenarios (10/20/30-year horizons) and a list of high-criticality assets recommended for renewal. Creating a scenario has no effect on the renewal list — they don't share data.",
        "इस पेज में दो स्वतंत्र views हैं: saved CapEx पूर्वानुमान scenarios (10/20/30-वर्ष के horizons) और renewal के लिए recommended high-criticality assets की एक सूची। कोई scenario बनाने का renewal list पर कोई असर नहीं पड़ता — ये डेटा शेयर नहीं करते।",
        "या पेजवर दोन स्वतंत्र views आहेत: saved CapEx अंदाज scenarios (10/20/30-वर्षांचे horizons) आणि renewal साठी recommended high-criticality assets ची यादी. एखादा scenario तयार केल्याने renewal list वर काहीही परिणाम होत नाही — ते डेटा शेअर करत नाहीत.",
        "Is page mein do independent views hain: saved CapEx forecast scenarios (10/20/30-year horizons) aur renewal ke liye recommended high-criticality assets ki ek list. Koi scenario banane ka renewal list par koi effect nahi padta — ye data share nahi karte.",
    ),
    "planning-reports.stepsHeading": (
        "How this page works",
        "यह पेज कैसे काम करता है",
        "हे पेज कसे कार्य करते",
        "Ye page kaise kaam karta hai",
    ),
    "planning-reports.steps.0.label": ("CapEx Scenarios", "CapEx Scenarios", "CapEx Scenarios", "CapEx Scenarios"),
    "planning-reports.steps.0.caption": (
        "Browse previously saved long-term forecast scenarios.",
        "पहले से saved long-term पूर्वानुमान scenarios को ब्राउज़ करें।",
        "आधी saved केलेले long-term अंदाज scenarios ब्राउझ करा.",
        "Pehle se saved long-term forecast scenarios ko browse karein.",
    ),
    "planning-reports.steps.1.label": ("New Scenario", "नया Scenario", "नवीन Scenario", "Naya Scenario"),
    "planning-reports.steps.1.caption": (
        "Name it and pick a 10/20/30-year horizon.",
        "इसे नाम दें और 10/20/30-वर्ष का horizon चुनें।",
        "याला नाव द्या आणि 10/20/30-वर्षांचा horizon निवडा.",
        "Isse naam dein aur 10/20/30-year ka horizon choose karein.",
    ),
    "planning-reports.steps.2.label": ("Status: Pending", "स्थिति: Pending", "स्थिती: Pending", "Status: Pending"),
    "planning-reports.steps.2.caption": (
        "Every scenario saves as Pending — nothing flips it to Complete or Error yet.",
        "हर scenario Pending के रूप में save होता है — अभी तक कुछ भी इसे Complete या Error में नहीं बदलता।",
        "प्रत्येक scenario Pending म्हणून save होतो — अजून काहीही याला Complete किंवा Error मध्ये बदलत नाही.",
        "Har scenario Pending ke roop mein save hota hai — abhi tak kuch bhi ise Complete ya Error mein nahi badalta.",
    ),
    "planning-reports.steps.3.label": (
        "Renewal Recommendations",
        "Renewal Recommendations",
        "Renewal Recommendations",
        "Renewal Recommendations",
    ),
    "planning-reports.steps.3.caption": (
        "Switch tabs for assets auto-flagged by criticality score, independent of scenarios.",
        "criticality score द्वारा auto-flag किए गए assets के लिए tab बदलें, जो scenarios से स्वतंत्र है।",
        "criticality score द्वारे auto-flag केलेल्या assets साठी tab बदला, जे scenarios पासून स्वतंत्र आहे.",
        "Criticality score se auto-flag hue assets ke liye tab switch karein, jo scenarios se independent hai.",
    ),
    "planning-reports.fieldRules.0.name": (
        "Scenario Name",
        "Scenario Name",
        "Scenario Name",
        "Scenario Name",
    ),
    "planning-reports.fieldRules.0.description": (
        "Must be non-empty — the only field the form blocks submission on.",
        "खाली नहीं होना चाहिए — यह इकलौता फ़ील्ड है जिस पर फ़ॉर्म submission को रोकता है।",
        "रिकामे नसावे — हे एकमेव फील्ड आहे ज्यावर फॉर्म submission अडवतो.",
        "Non-empty hona chahiye — ye ek hi field hai jispar form submission ko block karta hai.",
    ),
    "planning-reports.fieldRules.1.name": (
        "Forecast Horizon",
        "Forecast Horizon",
        "Forecast Horizon",
        "Forecast Horizon",
    ),
    "planning-reports.fieldRules.1.description": (
        "Restricted to 10, 20 or 30 years — both the dropdown and the backend reject any other value.",
        "10, 20 या 30 वर्षों तक सीमित — dropdown और backend दोनों किसी अन्य value को अस्वीकार करते हैं।",
        "10, 20 किंवा 30 वर्षांपुरते मर्यादित — dropdown आणि backend दोन्ही इतर कोणतीही value नाकारतात.",
        "10, 20 ya 30 years tak restricted hai — dropdown aur backend dono koi bhi other value reject kar dete hain.",
    ),
    "planning-reports.fieldRules.2.name": ("Status", "स्थिति", "स्थिती", "Status"),
    "planning-reports.fieldRules.2.description": (
        "Always shows Pending — no background job exists yet to mark scenarios Complete or Error.",
        "हमेशा Pending दिखाता है — scenarios को Complete या Error mark करने के लिए अभी तक कोई background job मौजूद नहीं है।",
        "नेहमी Pending दाखवते — scenarios ला Complete किंवा Error म्हणून mark करण्यासाठी अजून कोणताही background job अस्तित्वात नाही.",
        "Hamesha Pending dikhata hai — scenarios ko Complete ya Error mark karne ke liye abhi tak koi background job exist nahi karta.",
    ),
    "planning-reports.fieldRules.3.name": ("Criticality", "Criticality", "Criticality", "Criticality"),
    "planning-reports.fieldRules.3.description": (
        "Renewal Recommendations only lists assets scoring 4 or higher, sorted highest first.",
        "Renewal Recommendations में केवल 4 या उससे अधिक score वाले assets सूचीबद्ध होते हैं, जो सबसे ऊँचे score के क्रम में sort किए गए हैं।",
        "Renewal Recommendations मध्ये फक्त 4 किंवा त्याहून जास्त score असलेल्या assets ची यादी असते, जी सर्वाधिक score नुसार sort केलेली असते.",
        "Renewal Recommendations mein sirf 4 ya usse zyada score karne wale assets list hote hain, highest score ke order mein sorted.",
    ),
    "planning-reports.tip.title": (
        "Condition column is a known gap",
        "Condition column एक ज्ञात कमी है",
        "Condition column ही एक ज्ञात त्रुटी आहे",
        "Condition column ek known gap hai",
    ),
    "planning-reports.tip.body": (
        "The Renewal Recommendations table's Condition column always shows \"—\": the API returns an asset's lifecycle state (e.g. draft/in_operation), not a condition rating, so nothing populates it. Use the Criticality score to prioritize renewals instead.",
        "Renewal Recommendations table का Condition column हमेशा \"—\" दिखाता है: API किसी asset की lifecycle state (जैसे draft/in_operation) लौटाता है, न कि condition rating, इसलिए इसमें कुछ भी populate नहीं होता। इसके बजाय renewals को prioritize करने के लिए Criticality score का उपयोग करें।",
        "Renewal Recommendations table चा Condition column नेहमी \"—\" दाखवतो: API एखाद्या asset ची lifecycle state (उदा. draft/in_operation) परत करते, condition rating नाही, त्यामुळे त्यात काहीही populate होत नाही. त्याऐवजी renewals ला prioritize करण्यासाठी Criticality score वापरा.",
        "Renewal Recommendations table ka Condition column hamesha \"—\" dikhata hai: API kisi asset ki lifecycle state (jaise draft/in_operation) return karta hai, condition rating nahi, isliye usmein kuch bhi populate nahi hota. Iske bajaay renewals ko prioritize karne ke liye Criticality score use 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 PLANNING_REPORTS.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(PLANNING_REPORTS)} planning-reports keys.")


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