import unittest

import pytest

from pypos.modules.sinkronisasi.services.transaction_export_settlement_payment_utils import (
    TransactionExportSettlementPaymentUtils,
)

# edited by glg
pytestmark = [pytest.mark.unit]


def _to_int(value, default=0):
    try:
        return int(round(float(value)))
    except Exception:
        return int(default or 0)


class TransactionExportSettlementPaymentUtilsTests(unittest.TestCase):
    def test_normalize_tunai_non_tunai(self):
        tunai, non_tunai = TransactionExportSettlementPaymentUtils.normalize_tunai_non_tunai(
            netto_tagihan=80000,
            total_bayar_raw=100000,
            non_tunai_raw=30000,
        )
        self.assertEqual(tunai + non_tunai, 80000)
        self.assertGreaterEqual(tunai, 0)
        self.assertGreaterEqual(non_tunai, 0)

        tunai0, non_tunai0 = TransactionExportSettlementPaymentUtils.normalize_tunai_non_tunai(
            netto_tagihan=0,
            total_bayar_raw=0,
            non_tunai_raw=0,
        )
        self.assertEqual((tunai0, non_tunai0), (0, 0))

    def test_ensure_entry_and_allocate_return(self):
        grouped = {}
        entry = TransactionExportSettlementPaymentUtils.ensure_entry(grouped, "108", "cash", "")
        self.assertEqual(entry["metode_pembayaran"], "cash")
        self.assertIn("108", grouped)

        TransactionExportSettlementPaymentUtils.allocate_return_value(
            grouped,
            account_id="108",
            nominal=12000,
            metode="cash",
            bank_name="",
            to_int_fn=_to_int,
        )
        self.assertEqual(grouped["108"]["return_nilai"], 12000)

    def test_apply_legacy_aliases_and_resolve_return_nominal(self):
        payload = {
            "nilai_diterima": 35000,
            "nilai_settlement": 40000,
            "diskon_produk": 5000,
            "diskon_tambahan_nilai": 2000,
        }
        out = TransactionExportSettlementPaymentUtils.apply_payment_legacy_aliases(
            payload,
            to_int_fn=_to_int,
        )
        self.assertEqual(out["harga"], 40000)
        self.assertEqual(out["tagihan"], 40000)
        self.assertEqual(out["add_disc"], 2000)
        self.assertEqual(out["selisih_plus"], 5000)

        nominal = TransactionExportSettlementPaymentUtils.resolve_return_nominal(
            {"refund_amount": None, "total_return": "9000"},
            _to_int,
        )
        self.assertEqual(nominal, 9000)


if __name__ == "__main__":
    unittest.main()
