# edited by glg
from pypos.modules.penjualan.services.settlement_history_reprint_service import SettlementHistoryReprintService
from pypos.modules.penjualan.services.settlement_view_data_service import SettlementViewDataService


class _ModelStub:
    def __init__(self, with_detail=True):
        self.with_detail = bool(with_detail)
        self.total_calls = []
        self.detail_calls = []

    def hitung_total_per_metode_by_ids(self, transaksi_ids):
        self.total_calls.append(list(transaksi_ids or []))
        return {"Tunai": 10000.0, "Non Tunai": 5000.0}

    def get_transaksi_by_ids(self, transaksi_ids):
        self.detail_calls.append(list(transaksi_ids or []))
        if not self.with_detail:
            return []
        return [
            {
                "id": 11,
                "nomer": "INV-11",
                "dtime": "2026-03-12 10:10:10",
                "oleh_nama": "kasir glg",
                "transaksi_nilai": 15000.0,
                "metode": "Tunai",
            }
        ]


class _PrintControllerStub:
    def __init__(self, print_ok=True):
        self.print_ok = bool(print_ok)
        self.calls = []

    def print_settlement(self, **kwargs):
        self.calls.append(dict(kwargs))
        return self.print_ok


def test_settlement_history_reprint_service_success():
    model = _ModelStub(with_detail=True)
    printer = _PrintControllerStub(print_ok=True)
    svc = SettlementHistoryReprintService(
        settlement_model=model,
        print_controller=printer,
        view_data_service=SettlementViewDataService(),
    )
    history_data = {
        "tanggal": "2026-03-12",
        "admin": "admglg",
        "kasir": "kasir glg",
        "total_disetor": 90000,
        "data_transaksi_id": "[11,12]",
    }

    result = svc.execute(history_data)

    assert result["ok"] is True
    assert len(printer.calls) == 1
    payload = printer.calls[0]
    assert payload["kasir_nama"] == "kasir glg"
    assert payload["admin_nama"] == "admglg"
    assert payload["total_disetor"] == 90000.0
    assert payload["shift"] == "-"
    assert str(payload["counter"]).startswith("ST-RP-20260312-")


def test_settlement_history_reprint_service_fail_when_data_id_missing():
    model = _ModelStub(with_detail=True)
    printer = _PrintControllerStub(print_ok=True)
    svc = SettlementHistoryReprintService(
        settlement_model=model,
        print_controller=printer,
        view_data_service=SettlementViewDataService(),
    )
    history_data = {
        "tanggal": "2026-03-12",
        "admin": "admglg",
        "kasir": "kasir glg",
        "total_disetor": 90000,
        "data_transaksi_id": "",
    }

    result = svc.execute(history_data)

    assert result["ok"] is False
    assert "tidak tersedia" in str(result["message"]).lower()
    assert not printer.calls
