# edited by glg
from types import SimpleNamespace

from pypos.modules.penjualan.services.transaksi_payment_payload_service import (
    TransaksiPaymentPayloadService,
)


def _extract_diskon_customer(_diskon_log):
    return 5000


def _resolve_rekening(**_kwargs):
    return 110, "Non Tunai"


def test_apply_single_payment_masks_last4_and_preserves_brand_approval():
    svc = TransaksiPaymentPayloadService()
    payload = {
        "transaksi_nilai": 100000,
        "diskon_log": "diskon_customer=5000",
        "cabang_id": 1,
    }
    hasil = SimpleNamespace(
        metode="kredit",
        total_harus_dibayar=90000,
        diskon_tambahan_persen=10,
        diskon_tambahan_nilai=10000,
        settlement_id=1,
        bank_id=201,
        bank_nama="Kredit",
        jumlah_bayar=90000,
        kembalian=0,
        jenis_kartu="VISA",
        no_kartu="4111 1111 1111 1234",
        approval_code="APR-001",
    )

    updated, metode = svc.apply_single_payment(
        transaksi_data_dict=payload,
        hasil_pembayaran=hasil,
        extract_diskon_customer_callback=_extract_diskon_customer,
        resolve_bank_rekening_callback=_resolve_rekening,
    )

    assert metode == "kredit"
    assert updated["transaksi_nilai"] == 90000
    assert updated["diskon_nilai"] == 15000
    assert updated["kartu_nomer"] == "1234"
    assert updated["bank_from"] == "VISA"
    assert updated["nomer_ep"] == "APR-001"


def test_apply_multi_payment_uses_non_tunai_card_source_and_money_int():
    svc = TransaksiPaymentPayloadService()
    payload = {
        "transaksi_nilai": 150000,
        "diskon_log": "diskon_customer=5000",
        "cabang_id": 1,
    }
    pay_tunai = SimpleNamespace(
        metode="tunai",
        jumlah_dibayar=50000,
        kembali=0,
        settlement_id=1,
        bank_id=101,
        diskon_tambahan_persen=5,
        diskon_tambahan_nilai=5000,
        total_harus_dibayar=145000,
        approval_code="",
        jenis_kartu="",
        jenis_edc="",
        no_kartu="",
        kartu="",
    )
    pay_kredit = SimpleNamespace(
        metode="kredit",
        jumlah_dibayar=95000,
        kembali=0,
        settlement_id=1,
        bank_id=201,
        approval_code="APR-XYZ",
        jenis_kartu="MASTER",
        jenis_edc="EDC-A",
        no_kartu="5555444433332222",
        kartu="",
    )

    updated, metode, total_dibayar, total_kembalian = svc.apply_multi_payment(
        transaksi_data_dict=payload,
        payment_list=[pay_tunai, pay_kredit],
        extract_diskon_customer_callback=_extract_diskon_customer,
        resolve_bank_rekening_callback=_resolve_rekening,
    )

    assert metode == "tunai + kredit"
    assert total_dibayar == 145000
    assert total_kembalian == 0
    assert updated["pembayaran_non_tunai"] == 95000
    assert updated["pembayaran_tunai"] == 50000
    assert updated["kartu_nomer"] == "2222"
    assert updated["bank_from"] == "MASTER"
    assert updated["nomer_ep"] == "APR-XYZ"
