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

Usage: docker compose exec api python seed_translations_pageinfo_asset_revaluation.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)
ASSET_REVALUATION = {
    "asset-revaluation.title": (
        "Asset Revaluation",
        "एसेट रिवैल्यूएशन",
        "एसेट रिव्हॅल्युएशन",
        "Asset Revaluation",
    ),
    "asset-revaluation.subtitle": (
        "Adjust an asset's recognized carrying amount",
        "किसी एसेट की मान्यता प्राप्त कैरिंग अमाउंट को समायोजित करें",
        "एखाद्या एसेटच्या मान्यताप्राप्त कॅरिंग अमाउंटमध्ये समायोजन करा",
        "Kisi asset ke recognized carrying amount ko adjust karein",
    ),
    "asset-revaluation.body.0": (
        "Adjust the recognized balances of physical assets in compliance with IAS 16 guidelines.",
        "IAS 16 दिशा-निर्देशों के अनुपालन में भौतिक एसेट्स के मान्यता प्राप्त बैलेंस को समायोजित करें।",
        "IAS 16 मार्गदर्शक तत्त्वांचे पालन करत भौतिक एसेट्सच्या मान्यताप्राप्त बॅलन्समध्ये समायोजन करा.",
        "IAS 16 guidelines ke compliance mein physical assets ke recognized balances ko adjust karein.",
    ),
    "asset-revaluation.body.1": (
        "Pick the physical asset, propose a new value and method, and submit — the asset's carrying amount is updated directly on the asset record.",
        "भौतिक एसेट चुनें, नया मूल्य और तरीका प्रस्तावित करें, और सबमिट करें — एसेट का कैरिंग अमाउंट सीधे एसेट रिकॉर्ड पर अपडेट हो जाता है।",
        "भौतिक एसेट निवडा, नवीन व्हॅल्यू आणि पद्धत प्रस्तावित करा, आणि सबमिट करा — एसेटचा कॅरिंग अमाउंट थेट एसेट रेकॉर्डवर अपडेट होतो.",
        "Physical asset pick karein, naya value aur method propose karein, aur submit karein — asset ka carrying amount seedhe asset record par update ho jaata hai.",
    ),
    "asset-revaluation.stepsHeading": (
        "How it works",
        "यह कैसे काम करता है",
        "हे कसे कार्य करते",
        "Ye kaise kaam karta hai",
    ),
    "asset-revaluation.steps.0.label": (
        "Select Asset",
        "एसेट चुनें",
        "एसेट निवडा",
        "Asset Select karein",
    ),
    "asset-revaluation.steps.0.caption": (
        "Search and pick the asset; its current acquisition cost loads automatically.",
        "एसेट खोजें और चुनें; इसकी वर्तमान अधिग्रहण लागत अपने आप लोड हो जाती है।",
        "एसेट शोधा आणि निवडा; तिची सध्याची अधिग्रहण किंमत आपोआप लोड होते.",
        "Asset search karke pick karein; uski current acquisition cost automatically load ho jaati hai.",
    ),
    "asset-revaluation.steps.1.label": (
        "Enter Details",
        "विवरण दर्ज करें",
        "तपशील एंटर करा",
        "Details Enter karein",
    ),
    "asset-revaluation.steps.1.caption": (
        "Set the revaluation date, proposed value, method, and an optional reason.",
        "रिवैल्यूएशन की तारीख, प्रस्तावित मूल्य, तरीका, और वैकल्पिक कारण सेट करें।",
        "रिव्हॅल्युएशनची तारीख, प्रस्तावित व्हॅल्यू, पद्धत आणि पर्यायी कारण सेट करा.",
        "Revaluation date, proposed value, method, aur optional reason set karein.",
    ),
    "asset-revaluation.steps.2.label": (
        "Review Variance",
        "अंतर की समीक्षा करें",
        "फरकाचे पुनरावलोकन करा",
        "Variance Review karein",
    ),
    "asset-revaluation.steps.2.caption": (
        "Check the computed gain/loss before submitting.",
        "सबमिट करने से पहले परिकलित गेन/लॉस की जाँच करें।",
        "सबमिट करण्यापूर्वी गणना केलेला गेन/लॉस तपासा.",
        "Submit karne se pehle computed gain/loss check karein.",
    ),
    "asset-revaluation.steps.3.label": (
        "Submit",
        "सबमिट करें",
        "सबमिट करा",
        "Submit karein",
    ),
    "asset-revaluation.steps.3.caption": (
        "Posts the new carrying amount to the asset record.",
        "नए कैरिंग अमाउंट को एसेट रिकॉर्ड पर पोस्ट करता है।",
        "नवीन कॅरिंग अमाउंट एसेट रेकॉर्डवर पोस्ट करते.",
        "Naya carrying amount asset record par post karta hai.",
    ),
    "asset-revaluation.fieldRules.0.name": (
        "Asset",
        "एसेट",
        "एसेट",
        "Asset",
    ),
    "asset-revaluation.fieldRules.0.description": (
        "The physical asset being revalued; searchable by reference or name.",
        "जिस भौतिक एसेट का पुनर्मूल्यांकन किया जा रहा है; रेफरेंस या नाम से खोजा जा सकता है।",
        "ज्या भौतिक एसेटचे पुनर्मूल्यांकन केले जात आहे; रेफरन्स किंवा नावाने शोधता येते.",
        "Wo physical asset jiska revaluation ho raha hai; reference ya name se search kar sakte hain.",
    ),
    "asset-revaluation.fieldRules.1.name": (
        "Revaluation Date",
        "रिवैल्यूएशन तारीख",
        "रिव्हॅल्युएशन तारीख",
        "Revaluation Date",
    ),
    "asset-revaluation.fieldRules.1.description": (
        "Effective date of the adjustment; defaults to today.",
        "समायोजन की प्रभावी तारीख; डिफ़ॉल्ट रूप से आज की तारीख होती है।",
        "समायोजनाची प्रभावी तारीख; डीफॉल्टने आजची तारीख असते.",
        "Adjustment ki effective date; default aaj ki date hoti hai.",
    ),
    "asset-revaluation.fieldRules.2.name": (
        "Proposed Adjusted Value",
        "प्रस्तावित समायोजित मूल्य",
        "प्रस्तावित समायोजित व्हॅल्यू",
        "Proposed Adjusted Value",
    ),
    "asset-revaluation.fieldRules.2.description": (
        "New carrying amount; must be a positive number.",
        "नया कैरिंग अमाउंट; एक धनात्मक संख्या होनी चाहिए।",
        "नवीन कॅरिंग अमाउंट; ती धन संख्या असणे आवश्यक आहे.",
        "Naya carrying amount; ye ek positive number hona chahiye.",
    ),
    "asset-revaluation.fieldRules.3.name": (
        "Revaluation Method",
        "रिवैल्यूएशन तरीका",
        "रिव्हॅल्युएशन पद्धत",
        "Revaluation Method",
    ),
    "asset-revaluation.fieldRules.3.description": (
        "Market Value, Replacement Cost, or Indexation — determines the basis of the adjustment.",
        "मार्केट वैल्यू, रिप्लेसमेंट कॉस्ट, या इंडेक्सेशन — यह समायोजन का आधार तय करता है।",
        "मार्केट व्हॅल्यू, रिप्लेसमेंट कॉस्ट, किंवा इंडेक्सेशन — हे समायोजनाचा आधार ठरवते.",
        "Market Value, Replacement Cost, ya Indexation — ye adjustment ka basis decide karta hai.",
    ),
    "asset-revaluation.fieldRules.4.name": (
        "Reason / Notes",
        "कारण / नोट्स",
        "कारण / नोट्स",
        "Reason / Notes",
    ),
    "asset-revaluation.fieldRules.4.description": (
        "Optional free-text rationale for the adjustment.",
        "समायोजन के लिए वैकल्पिक फ्री-टेक्स्ट कारण।",
        "समायोजनासाठी पर्यायी फ्री-टेक्स्ट कारण.",
        "Adjustment ke liye optional free-text reason.",
    ),
    "asset-revaluation.tip.title": (
        "What \"Current Acquisition Cost\" means",
        "\"वर्तमान अधिग्रहण लागत\" का क्या अर्थ है",
        "\"सध्याची अधिग्रहण किंमत\" म्हणजे काय",
        "\"Current Acquisition Cost\" ka matlab kya hai",
    ),
    "asset-revaluation.tip.body": (
        "The value shown next to the asset is its original acquisition cost, not a depreciated net book value — assets have no separate NBV field. The Value Difference below compares your proposed value directly against that acquisition cost, so it won't match a depreciation-adjusted expectation.",
        "एसेट के बगल में दिखाया गया मूल्य इसकी मूल अधिग्रहण लागत है, न कि कोई डेप्रिसिएटेड नेट बुक वैल्यू — एसेट्स में अलग से कोई NBV फ़ील्ड नहीं होती। नीचे दिया गया वैल्यू डिफरेंस आपके प्रस्तावित मूल्य की तुलना सीधे उस अधिग्रहण लागत से करता है, इसलिए यह डेप्रिसिएशन-समायोजित अपेक्षा से मेल नहीं खाएगा।",
        "एसेटच्या बाजूला दाखवलेली व्हॅल्यू ही तिची मूळ अधिग्रहण किंमत आहे, घसारायुक्त नेट बुक व्हॅल्यू नाही — एसेट्समध्ये स्वतंत्र NBV फील्ड नसते. खाली दिलेला व्हॅल्यू डिफरन्स तुमच्या प्रस्तावित व्हॅल्यूची थेट तुलना त्या अधिग्रहण किमतीशी करतो, त्यामुळे तो घसारा-समायोजित अपेक्षेशी जुळणार नाही.",
        "Asset ke saamne dikhayi gayi value uski original acquisition cost hai, koi depreciated net book value nahi — assets mein separate NBV field hoti hi nahi. Neeche diya gaya Value Difference aapke proposed value ko seedhe us acquisition cost se compare karta hai, isliye ye depreciation-adjusted expectation se match nahi karega.",
    ),
}


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 ASSET_REVALUATION.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(ASSET_REVALUATION)} asset-revaluation keys.")


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