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

Usage: docker compose exec api python seed_translations_pageinfo_report_builder.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)
REPORT_BUILDER = {
    "report-builder.title": (
        "Report Builder",
        "रिपोर्ट बिल्डर",
        "रिपोर्ट बिल्डर",
        "Report Builder",
    ),
    "report-builder.subtitle": (
        "Build an ad-hoc report from any data source — pick fields, filter, optionally summarize, then preview or export",
        "किसी भी data source से ad-hoc रिपोर्ट बनाएं — fields चुनें, filter करें, वैकल्पिक रूप से summarize करें, फिर preview या export करें।",
        "कोणत्याही data source मधून ad-hoc रिपोर्ट तयार करा — fields निवडा, filter करा, ऐच्छिकपणे summarize करा, नंतर preview किंवा export करा.",
        "Kisi bhi data source se ad-hoc report banayein — fields choose karein, filter karein, optionally summarize karein, phir preview ya export karein.",
    ),
    "report-builder.body.0": (
        "Pick a data source, choose which columns to show (or group by columns and add aggregates for a summary report), add filters to narrow the rows, then Run Preview.",
        "एक data source चुनें, तय करें कि कौन-से columns दिखाने हैं (या summary रिपोर्ट के लिए columns के अनुसार group करें और aggregates जोड़ें), rows को सीमित करने के लिए filters जोड़ें, फिर Run Preview करें।",
        "एक data source निवडा, कोणते columns दाखवायचे ते ठरवा (किंवा summary रिपोर्टसाठी columns नुसार group करा आणि aggregates जोडा), rows मर्यादित करण्यासाठी filters जोडा, नंतर Run Preview करा.",
        "Ek data source choose karein, decide karein ki kaunse columns dikhane hain (ya summary report ke liye columns ke hisaab se group karke aggregates add karein), rows ko narrow karne ke liye filters add karein, phir Run Preview karein.",
    ),
    "report-builder.body.1": (
        "Save a definition to reuse it later, or export the result to CSV/XLSX. Saved reports are per-user — only you can see and load them.",
        "बाद में दोबारा उपयोग के लिए definition सेव करें, या result को CSV/XLSX में export करें। Saved reports per-user होते हैं — केवल आप ही इन्हें देख और लोड कर सकते हैं।",
        "नंतर पुन्हा वापरण्यासाठी definition सेव्ह करा, किंवा result CSV/XLSX मध्ये export करा. Saved reports per-user असतात — फक्त तुम्हीच त्या पाहू आणि लोड करू शकता.",
        "Baad mein reuse karne ke liye definition save karein, ya result ko CSV/XLSX mein export karein. Saved reports per-user hote hain — sirf aap hi inhe dekh aur load kar sakte hain.",
    ),
    "report-builder.stepsHeading": (
        "Building a report",
        "रिपोर्ट बनाना",
        "रिपोर्ट तयार करणे",
        "Report banana",
    ),
    "report-builder.steps.0.label": ("Data Source", "डेटा सोर्स", "डेटा सोर्स", "Data Source"),
    "report-builder.steps.0.caption": (
        "Pick the table to report on",
        "रिपोर्ट के लिए table चुनें",
        "रिपोर्टसाठी table निवडा",
        "Report ke liye table choose karein",
    ),
    "report-builder.steps.1.label": ("Columns / Group", "कॉलम / ग्रुप", "कॉलम / ग्रुप", "Columns / Group"),
    "report-builder.steps.1.caption": (
        "Choose fields, or group + aggregate to summarize",
        "Fields चुनें, या summarize करने के लिए group + aggregate करें",
        "Fields निवडा, किंवा summarize करण्यासाठी group + aggregate करा",
        "Fields choose karein, ya summarize karne ke liye group + aggregate karein",
    ),
    "report-builder.steps.2.label": ("Filters", "फ़िल्टर", "फिल्टर", "Filters"),
    "report-builder.steps.2.caption": (
        "Narrow the rows (optional)",
        "Rows को सीमित करें (वैकल्पिक)",
        "Rows मर्यादित करा (ऐच्छिक)",
        "Rows ko narrow karein (optional)",
    ),
    "report-builder.steps.3.label": ("Run Preview", "रन प्रीव्यू", "रन प्रीव्ह्यू", "Run Preview"),
    "report-builder.steps.3.caption": (
        "See the results below",
        "नीचे परिणाम देखें",
        "खाली परिणाम पहा",
        "Neeche results dekhein",
    ),
    "report-builder.steps.4.label": ("Export / Save", "एक्सपोर्ट / सेव", "एक्सपोर्ट / सेव्ह", "Export / Save"),
    "report-builder.steps.4.caption": (
        "Download CSV/XLSX or save for reuse",
        "CSV/XLSX डाउनलोड करें या दोबारा उपयोग के लिए सेव करें",
        "CSV/XLSX डाउनलोड करा किंवा पुन्हा वापरण्यासाठी सेव्ह करा",
        "CSV/XLSX download karein ya reuse ke liye save karein",
    ),
    "report-builder.fieldRules.0.name": ("Data Source", "डेटा सोर्स", "डेटा सोर्स", "Data Source"),
    "report-builder.fieldRules.0.description": (
        "Table to report on; switching it resets columns, filters, grouping and sort.",
        "जिस table पर रिपोर्ट बनानी है; इसे बदलने पर columns, filters, grouping और sort रीसेट हो जाते हैं।",
        "ज्या table वर रिपोर्ट तयार करायची आहे; ते बदलल्यास columns, filters, grouping आणि sort रीसेट होतात.",
        "Wo table jis par report banani hai; ise switch karne par columns, filters, grouping aur sort reset ho jaate hain.",
    ),
    "report-builder.fieldRules.1.name": ("Columns", "कॉलम", "कॉलम", "Columns"),
    "report-builder.fieldRules.1.description": (
        "At least one column is required to run — unless Group By is set, which ignores this list.",
        "Run करने के लिए कम से कम एक column आवश्यक है — जब तक कि Group By सेट न हो, जो इस list को नज़रअंदाज़ कर देता है।",
        "Run करण्यासाठी किमान एक column आवश्यक आहे — जोपर्यंत Group By सेट केलेले नाही, जे या list कडे दुर्लक्ष करते.",
        "Run karne ke liye kam se kam ek column required hai — jab tak Group By set na ho, jo is list ko ignore kar deta hai.",
    ),
    "report-builder.fieldRules.2.name": ("Group By", "ग्रुप बाय", "ग्रुप बाय", "Group By"),
    "report-builder.fieldRules.2.description": (
        "Optional — turns the report into a summary; requires at least one aggregate (Count/Sum/Avg/Min/Max) to run.",
        "वैकल्पिक — रिपोर्ट को summary में बदल देता है; run करने के लिए कम से कम एक aggregate (Count/Sum/Avg/Min/Max) ज़रूरी है।",
        "ऐच्छिक — रिपोर्टला summary मध्ये बदलते; run करण्यासाठी किमान एक aggregate (Count/Sum/Avg/Min/Max) आवश्यक आहे.",
        "Optional — report ko summary mein badal deta hai; run karne ke liye kam se kam ek aggregate (Count/Sum/Avg/Min/Max) zaroori hai.",
    ),
    "report-builder.fieldRules.3.name": ("Row Limit", "रो लिमिट", "रो लिमिट", "Row Limit"),
    "report-builder.fieldRules.3.description": (
        "Capped at the schema's max limit; defaults to 100 rows.",
        "Schema की max limit तक सीमित; डिफ़ॉल्ट रूप से 100 rows।",
        "Schema च्या max limit पर्यंत मर्यादित; डिफॉल्टने 100 rows.",
        "Schema ki max limit tak capped hai; default 100 rows hota hai.",
    ),
    "report-builder.tip.title": (
        "Data source changes wipe your work",
        "Data source बदलने से आपका काम मिट जाता है",
        "Data source बदलल्याने तुमचे काम मिटते",
        "Data source badalne se aapka kaam wipe ho jaata hai",
    ),
    "report-builder.tip.body": (
        "Switching Data Source clears columns, filters, grouping and sort — pick the table first, then build the rest. Comparing two tables? Save each as its own report instead of switching back and forth.",
        "Data Source बदलने पर columns, filters, grouping और sort साफ़ हो जाते हैं — पहले table चुनें, फिर बाकी सब बनाएं। दो tables की तुलना करनी है? बार-बार switch करने के बजाय हर एक को अलग रिपोर्ट के रूप में सेव करें।",
        "Data Source बदलल्यास columns, filters, grouping आणि sort साफ होतात — आधी table निवडा, मग बाकीचे तयार करा. दोन tables ची तुलना करायची आहे? पुन्हा पुन्हा switch करण्याऐवजी प्रत्येकाला वेगळ्या रिपोर्ट म्हणून सेव्ह करा.",
        "Data Source switch karne par columns, filters, grouping aur sort clear ho jaate hain — pehle table choose karein, phir baaki sab banayein. Do tables compare karne hain? Baar-baar switch karne ke bajaye har ek ko alag report ke roop mein save 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 REPORT_BUILDER.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(REPORT_BUILDER)} report-builder keys.")


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