# edited by glg
from pypos.modules.penjualan.services.pembayaran_calculation_service import (
    PembayaranCalculationService,
)


def test_calculate_include_mode_ppn_informative_only():
    svc = PembayaranCalculationService()
    out = svc.calculate(
        total_awal=100000,
        diskon_persen=0,
        ppn_persen=11,
        voucher_amount=0,
        ppn_mode="include",
    )
    assert out["ppn_mode"] == "include"
    assert out["total_sebelum_voucher"] == 100000.0
    assert out["total_harus_dibayar"] == 100000.0
    assert out["ppn_nilai"] > 0.0


def test_calculate_exclude_mode_adds_ppn_to_total():
    svc = PembayaranCalculationService()
    out = svc.calculate(
        total_awal=100000,
        diskon_persen=0,
        ppn_persen=11,
        voucher_amount=0,
        ppn_mode="exclude",
    )
    assert out["ppn_mode"] == "exclude"
    assert out["ppn_nilai"] == 11000.0
    assert out["total_sebelum_voucher"] == 111000.0
    assert out["total_harus_dibayar"] == 111000.0


def test_calculate_voucher_capped_to_total():
    svc = PembayaranCalculationService()
    out = svc.calculate(
        total_awal=50000,
        diskon_persen=10,
        ppn_persen=11,
        voucher_amount=999999,
        ppn_mode="include",
    )
    assert out["voucher_terpakai"] == out["total_sebelum_voucher"]
    assert out["total_harus_dibayar"] == 0.0


def test_calculate_invalid_ppn_mode_falls_back_include():
    svc = PembayaranCalculationService()
    out = svc.calculate(
        total_awal=100000,
        diskon_persen=0,
        ppn_persen=11,
        voucher_amount=0,
        ppn_mode="abc",
    )
    assert out["ppn_mode"] == "include"
    assert out["total_harus_dibayar"] == 100000.0


def test_calculate_supports_nominal_discount_mode():
    svc = PembayaranCalculationService()
    out = svc.calculate(
        total_awal=100000,
        diskon_persen=5,
        ppn_persen=11,
        diskon_nilai=15000,
        prefer_diskon_nilai=True,
        voucher_amount=0,
        ppn_mode="include",
    )
    assert out["diskon_nilai"] == 15000.0
    assert out["diskon_persen_efektif"] == 15.0
    assert out["total_harus_dibayar"] == 85000.0


def test_calculate_nominal_mode_zero_does_not_fallback_to_percent():
    # edited by glg
    svc = PembayaranCalculationService()
    out = svc.calculate(
        total_awal=100000,
        diskon_persen=10,
        ppn_persen=11,
        diskon_nilai=0,
        prefer_diskon_nilai=True,
        voucher_amount=0,
        ppn_mode="include",
    )
    assert out["diskon_nilai"] == 0.0
    assert out["diskon_persen_efektif"] == 0.0
    assert out["total_harus_dibayar"] == 100000.0
