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

Usage: docker compose exec api python seed_translations_pageinfo_cag_report_pack.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)
CAG_REPORT_PACK = {
    "cag-report-pack.title": (
        "CAG Report Pack",
        "CAG रिपोर्ट पैक",
        "CAG रिपोर्ट पॅक",
        "CAG Report Pack",
    ),
    "cag-report-pack.body.0": (
        "Statutory fixed-asset register in Form GFR-40 (GFR 2017) format, for audit under the C&AG (DPC) Act 1971.",
        "C&AG (DPC) अधिनियम 1971 के तहत ऑडिट के लिए, Form GFR-40 (GFR 2017) प्रारूप में सांविधिक fixed-asset रजिस्टर।",
        "C&AG (DPC) कायदा 1971 अंतर्गत ऑडिटसाठी, Form GFR-40 (GFR 2017) स्वरूपातील सांविधिक fixed-asset रजिस्टर.",
        "C&AG (DPC) Act 1971 ke under audit ke liye, Form GFR-40 (GFR 2017) format mein statutory fixed-asset register.",
    ),
    "cag-report-pack.body.1": (
        "Six statements: summary reconciliation, asset register, depreciation, disposals, custodians, documents. Delivered as XLSX/PDF.",
        "छह statements: summary reconciliation, asset register, depreciation, disposals, custodians, documents। XLSX/PDF के रूप में दिए जाते हैं।",
        "सहा statements: summary reconciliation, asset register, depreciation, disposals, custodians, documents. XLSX/PDF स्वरूपात दिले जातात.",
        "Six statements: summary reconciliation, asset register, depreciation, disposals, custodians, documents. XLSX/PDF ke roop mein milte hain.",
    ),
    "cag-report-pack.stepsHeading": (
        "How the pack is generated",
        "पैक कैसे जनरेट होता है",
        "पॅक कसे जनरेट होते",
        "Pack kaise generate hota hai",
    ),
    "cag-report-pack.steps.0.label": ("Select Period", "अवधि चुनें", "कालावधी निवडा", "Period select karein"),
    "cag-report-pack.steps.0.caption": (
        "Pick the calendar Year and fiscal Quarter to label the pack.",
        "पैक को लेबल करने के लिए calendar Year और fiscal Quarter चुनें।",
        "पॅकला लेबल करण्यासाठी calendar Year आणि fiscal Quarter निवडा.",
        "Pack ko label karne ke liye calendar Year aur fiscal Quarter select karein.",
    ),
    "cag-report-pack.steps.1.label": ("Generate", "जनरेट करें", "जनरेट करा", "Generate karein"),
    "cag-report-pack.steps.1.caption": (
        "Backend assembles all six statements and renders XLSX + PDF.",
        "Backend सभी छह statements को असेंबल करता है और XLSX + PDF तैयार करता है।",
        "Backend सर्व सहा statements एकत्र करते आणि XLSX + PDF तयार करते.",
        "Backend saare six statements ko assemble karta hai aur XLSX + PDF render karta hai.",
    ),
    "cag-report-pack.steps.2.label": ("Review Totals", "कुल राशियों की समीक्षा करें", "एकूण रकमेचे पुनरावलोकन करा", "Totals review karein"),
    "cag-report-pack.steps.2.caption": (
        "Check Gross/Net Block and asset count against the summary shown.",
        "दिखाए गए summary के आधार पर Gross/Net Block और asset count जाँचें।",
        "दाखवलेल्या summary नुसार Gross/Net Block आणि asset count तपासा.",
        "Dikhaye gaye summary ke against Gross/Net Block aur asset count check karein.",
    ),
    "cag-report-pack.steps.3.label": ("Download", "डाउनलोड करें", "डाउनलोड करा", "Download karein"),
    "cag-report-pack.steps.3.caption": (
        "Grab the PDF for audit submission or the XLSX for working papers.",
        "Audit submission के लिए PDF लें या working papers के लिए XLSX लें।",
        "Audit submission साठी PDF घ्या किंवा working papers साठी XLSX घ्या.",
        "Audit submission ke liye PDF le lo ya working papers ke liye XLSX le lo.",
    ),
    "cag-report-pack.fieldRules.0.name": ("Year", "वर्ष", "वर्ष", "Year"),
    "cag-report-pack.fieldRules.0.description": (
        "Calendar year combined with the quarter into the FY{year}-Q{quarter} period label sent to the backend.",
        "Calendar year को quarter के साथ मिलाकर FY{year}-Q{quarter} period label बनता है, जो backend को भेजा जाता है।",
        "Calendar year quarter सोबत एकत्र करून FY{year}-Q{quarter} period label तयार होते, जे backend ला पाठवले जाते.",
        "Calendar year ko quarter ke saath combine karke FY{year}-Q{quarter} period label banta hai, jo backend ko bheja jaata hai.",
    ),
    "cag-report-pack.fieldRules.1.name": ("Quarter", "तिमाही", "तिमाही", "Quarter"),
    "cag-report-pack.fieldRules.1.description": (
        "Fiscal quarter (Q1=Apr-Jun … Q4=Jan-Mar) — defaults to today's fiscal quarter, not the calendar quarter.",
        "Fiscal quarter (Q1=अप्रैल-जून … Q4=जनवरी-मार्च) — डिफ़ॉल्ट रूप से आज की fiscal quarter दिखाता है, calendar quarter नहीं।",
        "Fiscal quarter (Q1=एप्रिल-जून … Q4=जानेवारी-मार्च) — डिफॉल्टने आजची fiscal quarter दाखवते, calendar quarter नाही.",
        "Fiscal quarter (Q1=Apr-Jun … Q4=Jan-Mar) — default mein aaj ki fiscal quarter dikhata hai, calendar quarter nahi.",
    ),
    "cag-report-pack.fieldRules.2.name": ("Gross / Net Block", "Gross / Net Block", "Gross / Net Block", "Gross / Net Block"),
    "cag-report-pack.fieldRules.2.description": (
        "Class-wise reconciled totals from Statement I, shown once generation completes.",
        "Statement I से class-wise reconciled totals, जो generation पूरा होने पर दिखाई देते हैं।",
        "Statement I मधील class-wise reconciled totals, generation पूर्ण झाल्यावर दिसतात.",
        "Statement I se class-wise reconciled totals, generation complete hone par dikhte hain.",
    ),
    "cag-report-pack.fieldRules.3.name": ("Statements", "Statements", "Statements", "Statements"),
    "cag-report-pack.fieldRules.3.description": (
        "The six bundled sections (summary, asset register, depreciation, disposals, custodians, documents) — always generated together, never a subset.",
        "छह bundled sections (summary, asset register, depreciation, disposals, custodians, documents) — हमेशा एक साथ जनरेट होते हैं, कभी subset नहीं।",
        "सहा bundled sections (summary, asset register, depreciation, disposals, custodians, documents) — नेहमी एकत्र जनरेट होतात, कधीही subset नाही.",
        "Six bundled sections (summary, asset register, depreciation, disposals, custodians, documents) — hamesha saath mein generate hote hain, kabhi subset nahi.",
    ),
    "cag-report-pack.tip.title": (
        "Period label, not a data filter",
        "अवधि लेबल है, डेटा फ़िल्टर नहीं",
        "कालावधी लेबल आहे, डेटा फिल्टर नाही",
        "Period sirf label hai, data filter nahi",
    ),
    "cag-report-pack.tip.body": (
        "Year/Quarter only set the cover-page label and file path — the asset, depreciation and custodian figures always reflect the latest state in the database. Re-running for a past quarter reproduces today's totals under a different period heading, not historical figures for that quarter.",
        "Year/Quarter केवल cover-page लेबल और file path तय करते हैं — asset, depreciation और custodian के आँकड़े हमेशा database की latest स्थिति दर्शाते हैं। किसी पिछली quarter के लिए फिर से चलाने पर आज के totals ही एक अलग period heading के तहत मिलते हैं, उस quarter के historical आँकड़े नहीं।",
        "Year/Quarter फक्त cover-page लेबल आणि file path ठरवतात — asset, depreciation आणि custodian चे आकडे नेहमी database मधील latest स्थिती दर्शवतात. एखाद्या मागील quarter साठी पुन्हा चालवल्यास आजचे totals वेगळ्या period heading खाली मिळतात, त्या quarter चे historical आकडे नाहीत.",
        "Year/Quarter sirf cover-page label aur file path set karte hain — asset, depreciation aur custodian ke figures hamesha database ki latest state reflect karte hain. Kisi purani quarter ke liye dobara run karne par aaj ke totals hi ek alag period heading ke neeche milte hain, us quarter ke historical figures nahi.",
    ),
}


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 CAG_REPORT_PACK.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(CAG_REPORT_PACK)} cag-report-pack keys.")


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