import unittest

import pytest

from pypos.modules.penjualan.services.transaksi_payment_info_service import (
    TransaksiPaymentInfoService,
)

# edited by glg
pytestmark = [pytest.mark.unit]


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

    def text(self):
        return self._text


class _FakeTable:
    def __init__(self, rows):
        self._rows = rows or []

    def rowCount(self):
        return len(self._rows)

    def item(self, row, col):
        mapping = self._rows[row]
        return _FakeItem(mapping.get(col)) if col in mapping else None


def _parse_qty(text):
    return int(str(text or "0").strip())


def _parse_rupiah(text):
    raw = str(text or "0").replace(".", "").replace(",", ".").strip()
    return float(raw or 0.0)


class TransaksiPaymentInfoServiceTests(unittest.TestCase):
    def test_build_from_rows_hitung_total_qty_dan_total_belanja(self):
        svc = TransaksiPaymentInfoService()
        info = svc.build_from_rows(
            rows=[
                {"qty_text": "2", "subtotal_text": "10.000", "harga_text": "5000"},
                {"qty_text": "3", "subtotal_text": "0", "harga_text": "2.000"},
            ],
            parse_qty_callback=_parse_qty,
            parse_rupiah_callback=_parse_rupiah,
        )
        self.assertEqual(info.jenis_item, 2)
        self.assertEqual(info.total_qty, 5)
        self.assertEqual(info.total_belanja, 16000.0)

    def test_build_from_table_aman_untuk_sel_kosong(self):
        svc = TransaksiPaymentInfoService()
        table = _FakeTable(
            rows=[
                {4: "1", 3: "7.500"},
                {4: "2", 6: "0", 3: "2.500"},
            ]
        )
        info = svc.build_from_table(
            table_widget=table,
            parse_qty_callback=_parse_qty,
            parse_rupiah_callback=_parse_rupiah,
        )
        self.assertEqual(info.jenis_item, 2)
        self.assertEqual(info.total_qty, 3)
        self.assertEqual(info.total_belanja, 12500.0)


if __name__ == "__main__":
    unittest.main()
