# edited by glg
from types import SimpleNamespace

from pypos.modules.penjualan.controllers.transaksi_penjualan_controller import (
    TransaksiPenjualanController,
)
from pypos.modules.penjualan.services.high_qty_authorization_service import (
    HighQtyAuthorizationService,
)


def _new_controller_stub():
    ctrl = TransaksiPenjualanController.__new__(TransaksiPenjualanController)
    ctrl.log_warning = lambda *_args, **_kwargs: None
    ctrl.log_error = lambda *_args, **_kwargs: None
    return ctrl


def test_resolve_harga_jual_fallback_ke_harga_normal():
    ctrl = _new_controller_stub()
    payload = {"harga": None, "harga_normal": "1950", "harga_jual": 0}
    assert ctrl._resolve_harga_jual(payload) == 1950.0
    assert ctrl._is_valid_harga_jual(payload) is True


def test_apply_barang_by_id_menolak_item_tanpa_harga_aktif():
    ctrl = _new_controller_stub()
    ctrl.find_barang_row_by_id = lambda _id: (None, 0)
    ctrl.transaksi_barang_input_service = SimpleNamespace(
        compute_total_qty=lambda tambahan, lama: tambahan + lama,
        is_over_max_qty=lambda _qty, max_qty=99: False,
    )
    ctrl.model = SimpleNamespace(
        cari_barang_by_id=lambda _id, _qty: {
            "id": _id,
            "nama": "Produk Tanpa Harga",
            "barcode": "8990000000000",
            "jumlah": _qty,
            "harga": None,
            "harga_normal": None,
            "diskon_persen": 0,
            "satuan": "PCS",
        }
    )
    ctrl.data_barang_cache = {}

    warning_calls = []
    view_calls = []
    ctrl.view = SimpleNamespace(
        show_warning=lambda title, message: warning_calls.append((title, message)),
        tambah_barang_ke_tabel=lambda _barang: view_calls.append("add_row"),
        update_info_diskon=lambda _barang: view_calls.append("diskon"),
        update_ringkasan=lambda: view_calls.append("ringkasan"),
        table_barang=SimpleNamespace(rowCount=lambda: 0),
    )
    ctrl._register_row_index = lambda *_args, **_kwargs: view_calls.append("register")
    ctrl._verifikasi_admin_qty_besar = lambda: True

    assert ctrl._apply_barang_by_id("123", 1) is False
    assert warning_calls, "Warning harga invalid harus ditampilkan ke kasir."
    assert view_calls == [], "UI cart tidak boleh diupdate saat harga tidak valid."
    assert ctrl.data_barang_cache == {}, "Cache tidak boleh diisi jika item ditolak."


def test_qty_besar_verifikasi_admin_hanya_sekali_per_produk():
    ctrl = _new_controller_stub()
    ctrl.qty_verify_threshold = 99
    ctrl.transaksi_barang_input_service = SimpleNamespace(
        is_over_max_qty=lambda qty, max_qty=99: int(qty or 0) > int(max_qty or 99)
    )
    ctrl.high_qty_authorization_service = HighQtyAuthorizationService(max_qty=99)

    verify_calls = []
    ctrl._verifikasi_admin_qty_besar = lambda *args, **kwargs: verify_calls.append("ok") or True

    assert ctrl._ensure_admin_qty_besar_authorized("1001", 120) is True
    assert ctrl._ensure_admin_qty_besar_authorized("1001", 200) is True
    assert len(verify_calls) == 1

    assert ctrl._ensure_admin_qty_besar_authorized("1002", 150) is True
    assert len(verify_calls) == 2


def test_build_info_transaksi_stub_tanpa_init_tetap_bisa_hitung():
    ctrl = _new_controller_stub()

    class _Item:
        def __init__(self, text):
            self._text = text

        def text(self):
            return self._text

    class _Table:
        def rowCount(self):
            return 1

        def item(self, row, col):
            mapping = {4: "2", 3: "5.000", 6: "0"}
            value = mapping.get(col)
            return _Item(value) if value is not None else None

    ctrl.view = SimpleNamespace(table_barang=_Table())
    info = ctrl._build_info_transaksi_from_table()

    assert info.jenis_item == 1
    assert info.total_qty == 2
    assert info.total_belanja == 10000.0
