# edited by glg
from types import SimpleNamespace

import pytest

from pypos.modules.penjualan.controllers.transaksi_penjualan_controller import (
    TransaksiPenjualanController,
)
from pypos.modules.penjualan.errors import TransaksiSaveError

pytestmark = [pytest.mark.unit, pytest.mark.critical_flow]


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


def test_persist_transaksi_show_error_kode_saat_transaksi_save_error():
    ctrl = _new_controller_stub()
    shown_errors = []
    ctrl.show_error = lambda title, message, view=None: shown_errors.append((title, message, view))
    ctrl.transaksi_save_service = SimpleNamespace(
        save_with_audit=lambda **_kwargs: (_ for _ in ()).throw(
            TransaksiSaveError("TRX_SAVE_DB_ERROR", "Gagal menyimpan transaksi ke database.")
        )
    )

    ok = ctrl._persist_transaksi_with_payment(
        transaksi_data=[],
        detail_data=[],
        transaksi_data_dict={},
        metode_text="TUNAI",
        audit_message="unit_test",
    )

    assert ok is False
    assert shown_errors
    assert "Kode: TRX_SAVE_DB_ERROR" in str(shown_errors[0][1] or "")


def test_persist_transaksi_show_error_kode_saat_data_error_controller():
    ctrl = _new_controller_stub()
    shown_errors = []
    ctrl.show_error = lambda title, message, view=None: shown_errors.append((title, message, view))
    ctrl.transaksi_save_service = SimpleNamespace(
        save_with_audit=lambda **_kwargs: (_ for _ in ()).throw(ValueError("payload_invalid"))
    )

    ok = ctrl._persist_transaksi_with_payment(
        transaksi_data=[],
        detail_data=[],
        transaksi_data_dict={},
        metode_text="TUNAI",
        audit_message="unit_test",
    )

    assert ok is False
    assert shown_errors
    assert "Kode: TRX_SAVE_CONTROLLER_DATA_ERROR" in str(shown_errors[0][1] or "")
