# edited by glg
from types import SimpleNamespace

from pypos.modules.penjualan.services.transaksi_barang_input_service import (
    TransaksiBarangInputService,
)


def test_find_barang_barcode_return_error_saat_tidak_ada_atau_harga_invalid():
    svc = TransaksiBarangInputService()
    model = SimpleNamespace(
        cari_barang_by_barcode=lambda _barcode: None,
        cari_barang_by_barcode_raw=lambda _barcode: {
            "nama": "Produk Tanpa Harga",
            "barcode": "8990000000000",
        },
    )
    barang, err = svc.find_barang(model=model, text="8990000000000", barcode_only=True)
    assert barang is None
    assert "web admin" in err.lower()
    assert "produk tanpa harga" in err.lower()


def test_find_barang_nama_return_error_saat_tidak_ada_atau_harga_invalid():
    svc = TransaksiBarangInputService()
    model = SimpleNamespace(
        cari_barang_by_nama=lambda _nama: None,
        cari_barang_by_nama_raw=lambda _nama: {
            "nama": "Produk Nama Tanpa Harga",
            "barcode": "10001",
        },
    )
    barang, err = svc.find_barang(model=model, text="Produk X", barcode_only=False)
    assert barang is None
    assert "web admin" in err.lower()
    assert "produk nama tanpa harga" in err.lower()


def test_find_barang_barcode_tidak_ditemukan_tetap_pesan_not_found():
    svc = TransaksiBarangInputService()
    model = SimpleNamespace(
        cari_barang_by_barcode=lambda _barcode: None,
        cari_barang_by_barcode_raw=lambda _barcode: None,
    )
    barang, err = svc.find_barang(model=model, text="8991111111111", barcode_only=True)
    assert barang is None
    assert "tidak ditemukan" in err.lower()


# edited by glg
def test_normalize_manual_qty_invalid_text_tidak_raise():
    svc = TransaksiBarangInputService()
    ok, qty = svc.normalize_manual_qty("abc")
    assert ok is False
    assert qty == 1


# edited by glg
def test_resolve_input_qty_popup_invalid_text_return_zero():
    svc = TransaksiBarangInputService()
    ok, qty = svc.resolve_input_qty(True, lambda: ("abc", True))
    assert ok is True
    assert qty == 0
