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

Usage: docker compose exec api python seed_translations_pageinfo_rental_income_report.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)
RENTAL_INCOME_REPORT = {
    "rental-income-report.title": (
        "Rental Income Report",
        "रेंटल इनकम रिपोर्ट",
        "रेंटल इन्कम रिपोर्ट",
        "Rental Income Report",
    ),
    "rental-income-report.subtitle": (
        "Rent due and received, by fiscal year",
        "Fiscal year के अनुसार Rent की due और received राशि।",
        "Fiscal year नुसार Rent ची due आणि received रक्कम.",
        "Fiscal year ke hisab se rent ki due aur received amount.",
    ),
    "rental-income-report.body.0": (
        "Every rental income entry within a fiscal year — asset, renter, period, due/received/status.",
        "Fiscal year के भीतर हर rental income entry — asset, renter, period, due/received/status.",
        "Fiscal year मधील प्रत्येक rental income entry — asset, renter, period, due/received/status.",
        "Fiscal year ke andar har rental income entry — asset, renter, period, due/received/status.",
    ),
    "rental-income-report.body.1": (
        "Generate a period's entries below before it will show here — the batch is manually triggered, same as Depreciation.",
        "यहाँ दिखने से पहले नीचे किसी period की entries generate करें — यह batch, Depreciation की तरह, manually trigger होता है।",
        "इथे दिसण्यापूर्वी खाली एखाद्या period च्या entries generate करा — हा batch, Depreciation प्रमाणे, manually trigger होतो.",
        "Yahan dikhne se pehle neeche kisi period ki entries generate karein — ye batch, Depreciation jaisa, manually trigger hota hai.",
    ),
    "rental-income-report.stepsHeading": (
        "How an entry moves",
        "एक entry कैसे आगे बढ़ती है",
        "एक entry कशी पुढे सरकते",
        "Ek entry kaise aage badhti hai",
    ),
    "rental-income-report.steps.0.label": ("Generate", "Generate", "Generate", "Generate"),
    "rental-income-report.steps.0.caption": (
        "Run the batch for a month to create or refresh entries.",
        "Entries create या refresh करने के लिए किसी महीने का batch run करें।",
        "Entries create किंवा refresh करण्यासाठी एखाद्या महिन्याचा batch run करा.",
        "Kisi mahine ka batch run karke entries create ya refresh karein.",
    ),
    "rental-income-report.steps.1.label": ("Due", "Due", "Due", "Due"),
    "rental-income-report.steps.1.caption": (
        "Entry created; no payment received yet.",
        "Entry create हो गई; अभी तक कोई payment received नहीं हुई।",
        "Entry create झाली; अजून कोणतेही payment received झालेले नाही.",
        "Entry create ho gayi; abhi tak koi payment received nahi hui.",
    ),
    "rental-income-report.steps.2.label": ("Partially Paid", "Partially Paid", "Partially Paid", "Partially Paid"),
    "rental-income-report.steps.2.caption": (
        "Some payment recorded, less than the full amount due.",
        "कुछ payment record हुई, पूरी due राशि से कम।",
        "काही payment record झाले, पूर्ण due रकमेपेक्षा कमी.",
        "Kuch payment record hui hai, jo poori due amount se kam hai.",
    ),
    "rental-income-report.steps.3.label": ("Paid", "Paid", "Paid", "Paid"),
    "rental-income-report.steps.3.caption": (
        "Received meets due — posts a Cash/Rental Income journal entry.",
        "Received राशि due के बराबर हो जाती है — एक Cash/Rental Income journal entry post होती है।",
        "Received रक्कम due इतकी होते — एक Cash/Rental Income journal entry post होते.",
        "Received amount due ke barabar ho jaati hai — ek Cash/Rental Income journal entry post hoti hai.",
    ),
    "rental-income-report.fieldRules.0.name": ("Fiscal Year", "फिस्कल ईयर", "फिस्कल इयर", "Fiscal Year"),
    "rental-income-report.fieldRules.0.description": (
        "Apr–Mar year filter for the table; entries are matched by their YYYY-MM period.",
        "टेबल के लिए Apr–Mar year filter; entries उनके YYYY-MM period से match की जाती हैं।",
        "टेबलसाठी Apr–Mar year filter; entries त्यांच्या YYYY-MM period नुसार match केल्या जातात.",
        "Table ke liye Apr–Mar year filter hai; entries unke YYYY-MM period se match hoti hain.",
    ),
    "rental-income-report.fieldRules.1.name": ("Year / Month", "वर्ष / महीना", "वर्ष / महिना", "Year / Month"),
    "rental-income-report.fieldRules.1.description": (
        "Calendar month the batch generates entries for; this panel only shows with the finance:run permission.",
        "वह calendar महीना जिसके लिए batch entries generate करता है; यह panel केवल finance:run permission होने पर दिखता है।",
        "तो calendar महिना ज्यासाठी batch entries generate करतो; हा panel फक्त finance:run permission असल्यासच दिसतो.",
        "Wo calendar month jiske liye batch entries generate karta hai; ye panel sirf finance:run permission hone par dikhta hai.",
    ),
    "rental-income-report.fieldRules.2.name": ("Amount Due", "देय राशि", "देय रक्कम", "Amount Due"),
    "rental-income-report.fieldRules.2.description": (
        "Computed from the rental agreement's rate and billing cycle (monthly/quarterly/one-time) — not editable here.",
        "Rental agreement की rate और billing cycle (monthly/quarterly/one-time) से compute की जाती है — यहाँ edit नहीं की जा सकती।",
        "Rental agreement च्या rate आणि billing cycle (monthly/quarterly/one-time) वरून compute केली जाते — इथे edit करता येत नाही.",
        "Rental agreement ki rate aur billing cycle (monthly/quarterly/one-time) se compute hoti hai — yahan edit nahi ki ja sakti.",
    ),
    "rental-income-report.fieldRules.3.name": ("Status", "स्थिति", "स्थिती", "Status"),
    "rental-income-report.fieldRules.3.description": (
        "due, partially_paid or paid — changes only when a payment is recorded against the entry, never from this page.",
        "due, partially_paid या paid — यह तभी बदलती है जब entry के विरुद्ध कोई payment record होती है, इस page से कभी नहीं।",
        "due, partially_paid किंवा paid — ही फक्त तेव्हाच बदलते जेव्हा entry विरुद्ध payment record होते, या page वरून कधीच नाही.",
        "due, partially_paid ya paid — ye tabhi badalti hai jab entry ke against koi payment record hoti hai, is page se kabhi nahi.",
    ),
    "rental-income-report.tip.title": (
        "\"Overdue\" doesn't set itself",
        "\"Overdue\" खुद-ब-खुद सेट नहीं होता",
        "\"Overdue\" आपोआप सेट होत नाही",
        "\"Overdue\" khud se set nahi hota",
    ),
    "rental-income-report.tip.body": (
        "The overdue badge style exists, but nothing in the batch or payment logic ever assigns it — an entry just stays \"due\" indefinitely past its period until a payment is recorded against it.",
        "Overdue badge style मौजूद है, लेकिन batch या payment logic में कहीं भी इसे assign नहीं किया जाता — कोई entry अपने period के बाद भी तब तक \"due\" ही बनी रहती है जब तक उसके विरुद्ध कोई payment record न हो जाए।",
        "Overdue badge style अस्तित्वात आहे, पण batch किंवा payment logic मध्ये कुठेही ते assign केले जात नाही — एखादी entry तिच्या period नंतरही तोपर्यंत \"due\" च राहते जोपर्यंत तिच्याविरुद्ध payment record होत नाही.",
        "Overdue badge style exist karta hai, lekin batch ya payment logic mein kahin bhi ise assign nahi kiya jaata — koi entry apne period ke baad bhi tab tak \"due\" hi bani rehti hai jab tak uske against koi payment record nahi ho jaati.",
    ),
}


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 RENTAL_INCOME_REPORT.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(RENTAL_INCOME_REPORT)} rental-income-report keys.")


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