# edited by glg
import unittest

from pypos.modules.penjualan.models.pembayaran_model import PaymentResult
from pypos.modules.penjualan.models.transaksi_model import TransaksiModel


class TransaksiModelPaymentSyncTests(unittest.TestCase):
    def test_apply_single_payment_syncs_discount_components_into_master_transaksi(self):
        model = TransaksiModel(db_path=":memory:")
        payload = {
            "transaksi_nilai": 100000,
            "diskon_persen": 0,
            "diskon_nilai": 5000,
            "tambahan_nilai": 0,
            "diskon_log": "diskon_customer=5000;cashback=0;point=0",
        }
        hasil = PaymentResult(
            metode="tunai",
            jumlah_dibayar=90000,
            total_harus_dibayar=90000,
            kembalian=0,
            diskon_rp=10000,
            diskon_member_persen=10,
            diskon_tambahan_persen=10,
            diskon_tambahan_nilai=10000,
            total_dibayar=90000,
            kembali=0,
            jumlah_bayar=90000,
            settlement_id=1,
            bank_id=101,
            bank_nama="Tunai",
            no_kartu="4111111111113456",
            jenis_kartu="VISA",
            approval_code="APR-123",
        )

        updated, _ = model.apply_single_payment(payload, hasil)

        self.assertEqual(float(updated.get("transaksi_nilai") or 0), 90000.0)
        self.assertEqual(float(updated.get("diskon_persen") or 0), 10.0)
        self.assertEqual(float(updated.get("tambahan_nilai") or 0), 10000.0)
        self.assertEqual(float(updated.get("diskon_nilai") or 0), 15000.0)
        self.assertEqual(float(updated.get("transaksi_dibayar") or 0), 90000.0)
        self.assertEqual(float(updated.get("transaksi_dibayar_return") or 0), 0.0)
        self.assertEqual(str(updated.get("kartu_nomer") or ""), "3456")
        self.assertEqual(str(updated.get("bank_from") or ""), "VISA")
        self.assertEqual(str(updated.get("nomer_ep") or ""), "APR-123")


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