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

Usage: docker compose exec api python seed_translations_pageinfo_create_scenario.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)
CREATE_SCENARIO = {
    "create-scenario.title": (
        "Create Investment Scenario",
        "निवेश परिदृश्य बनाएं",
        "गुंतवणूक परिदृश्य तयार करा",
        "Investment Scenario create karein",
    ),
    "create-scenario.subtitle": (
        "Repair-vs-replace NPV/TCO analysis",
        "रिपेयर-बनाम-रिप्लेस NPV/TCO विश्लेषण",
        "रिपेअर-विरुद्ध-रिप्लेस NPV/TCO विश्लेषण",
        "Repair-vs-replace NPV/TCO analysis",
    ),
    "create-scenario.body.0": (
        "Run repair-vs-replace NPV/TCO analysis for a set of assets over a chosen horizon.",
        "चयनित अवधि (horizon) में assets के एक सेट के लिए रिपेयर-बनाम-रिप्लेस NPV/TCO विश्लेषण चलाएं।",
        "निवडलेल्या कालावधीसाठी (horizon) assets च्या एका संचासाठी रिपेअर-विरुद्ध-रिप्लेस NPV/TCO विश्लेषण चालवा.",
        "Ek chosen horizon ke liye assets ke ek set ke liye repair-vs-replace NPV/TCO analysis run karein.",
    ),
    "create-scenario.body.1": (
        "The scenario runs immediately and its results table appears below the form — there is no queue or pending status to wait for.",
        "यह scenario तुरंत चलता है और इसकी results table फ़ॉर्म के नीचे दिखाई देती है — इंतज़ार करने के लिए कोई queue या pending status नहीं होता।",
        "हे scenario लगेच चालते आणि त्याचे results table फॉर्मच्या खाली दिसते — प्रतीक्षा करण्यासाठी कोणतीही queue किंवा pending status नसते.",
        "Scenario turant run hota hai aur uska results table form ke neeche dikhta hai — wait karne ke liye koi queue ya pending status nahi hota.",
    ),
    "create-scenario.stepsHeading": (
        "How a scenario run works",
        "Scenario run कैसे काम करता है",
        "Scenario run कसे कार्य करते",
        "Scenario run kaise kaam karta hai",
    ),
    "create-scenario.steps.0.label": (
        "Set Inputs",
        "इनपुट सेट करें",
        "इनपुट सेट करा",
        "Inputs set karein",
    ),
    "create-scenario.steps.0.caption": (
        "Name the scenario, list asset IDs, and set horizon/discount rate.",
        "scenario का नाम रखें, asset IDs की सूची दें, और horizon/discount rate सेट करें।",
        "scenario ला नाव द्या, asset IDs ची यादी द्या आणि horizon/discount rate सेट करा.",
        "Scenario ka naam rakhein, asset IDs list karein, aur horizon/discount rate set karein.",
    ),
    "create-scenario.steps.1.label": (
        "Run Analysis",
        "विश्लेषण चलाएं",
        "विश्लेषण चालवा",
        "Analysis run karein",
    ),
    "create-scenario.steps.1.caption": (
        "Backend computes NPV and TCO for each asset synchronously.",
        "Backend हर asset के लिए NPV और TCO की गणना synchronously करता है।",
        "Backend प्रत्येक asset साठी NPV आणि TCO ची गणना synchronously करते.",
        "Backend har asset ke liye NPV aur TCO ko synchronously calculate karta hai.",
    ),
    "create-scenario.steps.2.label": (
        "Review Results",
        "परिणामों की समीक्षा करें",
        "निकालांचे पुनरावलोकन करा",
        "Results review karein",
    ),
    "create-scenario.steps.2.caption": (
        "Table shows the recommended option and best NPV/TCO per asset.",
        "Table प्रत्येक asset के लिए recommended option और सर्वश्रेष्ठ NPV/TCO दिखाती है।",
        "Table प्रत्येक asset साठी recommended option आणि सर्वोत्तम NPV/TCO दाखवते.",
        "Table har asset ke liye recommended option aur best NPV/TCO dikhata hai.",
    ),
    "create-scenario.steps.3.label": (
        "Open Full Review",
        "पूर्ण समीक्षा खोलें",
        "संपूर्ण पुनरावलोकन उघडा",
        "Full Review open karein",
    ),
    "create-scenario.steps.3.caption": (
        "Drill into the full Scenario Review page for deeper detail.",
        "गहरी जानकारी के लिए पूर्ण Scenario Review पेज में जाएं।",
        "सखोल तपशीलासाठी संपूर्ण Scenario Review पेजमध्ये जा.",
        "Deeper detail ke liye full Scenario Review page mein drill karein.",
    ),
    "create-scenario.fieldRules.0.name": (
        "Scenario Name",
        "Scenario नाम",
        "Scenario नाव",
        "Scenario Name",
    ),
    "create-scenario.fieldRules.0.description": (
        "Identifies this run; shown in the results header and later in Scenario Review.",
        "यह इस run की पहचान करता है; results header में और बाद में Scenario Review में दिखाया जाता है।",
        "हे या run ची ओळख करते; results header मध्ये आणि नंतर Scenario Review मध्ये दाखवले जाते.",
        "Ye is run ko identify karta hai; results header mein aur baad mein Scenario Review mein dikhaya jaata hai.",
    ),
    "create-scenario.fieldRules.1.name": (
        "Asset IDs",
        "Asset IDs",
        "Asset IDs",
        "Asset IDs",
    ),
    "create-scenario.fieldRules.1.description": (
        "Comma-separated asset IDs to evaluate; blank entries are ignored but at least one is required.",
        "मूल्यांकन के लिए comma से अलग किए गए asset IDs; खाली entries को नज़रअंदाज़ किया जाता है लेकिन कम से कम एक आवश्यक है।",
        "मूल्यमापनासाठी comma ने विभागलेले asset IDs; रिकाम्या entries दुर्लक्षित केल्या जातात पण किमान एक आवश्यक आहे.",
        "Evaluate karne ke liye comma-separated asset IDs; blank entries ignore ho jaati hain lekin kam se kam ek zaroori hai.",
    ),
    "create-scenario.fieldRules.2.name": (
        "Horizon (years)",
        "Horizon (वर्ष)",
        "Horizon (वर्षे)",
        "Horizon (years)",
    ),
    "create-scenario.fieldRules.2.description": (
        "Evaluation window for the NPV/TCO comparison; must be between 1 and 50 (default 10).",
        "NPV/TCO तुलना के लिए मूल्यांकन विंडो; 1 से 50 के बीच होनी चाहिए (डिफ़ॉल्ट 10)।",
        "NPV/TCO तुलनेसाठी मूल्यमापन विंडो; 1 ते 50 च्या दरम्यान असणे आवश्यक आहे (डीफॉल्ट 10).",
        "NPV/TCO comparison ke liye evaluation window; 1 se 50 ke beech honi chahiye (default 10).",
    ),
    "create-scenario.fieldRules.3.name": (
        "Discount Rate",
        "Discount Rate",
        "Discount Rate",
        "Discount Rate",
    ),
    "create-scenario.fieldRules.3.description": (
        "Rate used to discount future cashflows; silently falls back to 0.10 if left blank or non-numeric.",
        "भविष्य के cashflows को discount करने के लिए उपयोग की जाने वाली दर; खाली छोड़ने या non-numeric होने पर यह चुपचाप 0.10 पर वापस चली जाती है।",
        "भविष्यातील cashflows discount करण्यासाठी वापरला जाणारा दर; रिकामे ठेवल्यास किंवा non-numeric असल्यास हे शांतपणे 0.10 वर परत जाते.",
        "Future cashflows ko discount karne ke liye use hone wali rate; blank chhodne ya non-numeric hone par ye silently 0.10 par fallback ho jaati hai.",
    ),
    "create-scenario.tip.title": (
        "Discount rate silently defaults",
        "Discount rate चुपचाप डिफ़ॉल्ट हो जाती है",
        "Discount rate शांतपणे डीफॉल्ट होते",
        "Discount rate silently default ho jaati hai",
    ),
    "create-scenario.tip.body": (
        "An invalid or empty Discount Rate does not block the run — it's silently replaced with 0.10 before the request is sent, so double-check the field if you need a different rate.",
        "एक अमान्य या खाली Discount Rate run को नहीं रोकता — request भेजे जाने से पहले इसे चुपचाप 0.10 से बदल दिया जाता है, इसलिए यदि आपको अलग rate चाहिए तो फ़ील्ड को दोबारा जांच लें।",
        "अवैध किंवा रिकामी Discount Rate run ला अडवत नाही — request पाठवण्यापूर्वी ती शांतपणे 0.10 ने बदलली जाते, त्यामुळे तुम्हाला वेगळी rate हवी असल्यास फील्ड पुन्हा तपासा.",
        "Invalid ya empty Discount Rate run ko block nahi karti — request send hone se pehle ise silently 0.10 se replace kar diya jaata hai, isliye agar aapko alag rate chahiye to field dobara 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 CREATE_SCENARIO.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(CREATE_SCENARIO)} create-scenario keys.")


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