import unittest

import pytest

from pypos.modules.sinkronisasi.services.transaction_export_value_utils import (
    TransactionExportValueUtils,
)

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


class TransactionExportValueUtilsTests(unittest.TestCase):
    def test_as_number_or_default_supports_int_float_and_fallback(self):
        self.assertEqual(TransactionExportValueUtils.as_number_or_default("10", 0), 10)
        self.assertEqual(TransactionExportValueUtils.as_number_or_default("10.5", 0), 10.5)
        self.assertEqual(TransactionExportValueUtils.as_number_or_default("  ", 7), 7)
        self.assertEqual(TransactionExportValueUtils.as_number_or_default("abc", 7), 7)

    def test_as_positive_int_guards_non_positive(self):
        self.assertEqual(TransactionExportValueUtils.as_positive_int("22"), 22)
        self.assertEqual(TransactionExportValueUtils.as_positive_int("-1", default=9), 0)
        self.assertEqual(TransactionExportValueUtils.as_positive_int(None, default=9), 9)

    def test_to_int_and_to_float_handles_locale_like_values(self):
        self.assertEqual(TransactionExportValueUtils.to_int("12,6", 0), 13)
        self.assertEqual(TransactionExportValueUtils.to_int("none", 5), 5)
        self.assertAlmostEqual(TransactionExportValueUtils.to_float("12,6", 0.0), 12.6, places=2)
        self.assertAlmostEqual(TransactionExportValueUtils.to_float(True, 0.0), 1.0, places=2)

    def test_parse_semicolon_log_ignores_invalid_segment(self):
        parsed = TransactionExportValueUtils.parse_semicolon_log("a=1; b=2 ; invalid ; c=")
        self.assertEqual(parsed.get("a"), "1")
        self.assertEqual(parsed.get("b"), "2")
        self.assertEqual(parsed.get("c"), "")
        self.assertNotIn("invalid", parsed)

    def test_parse_int_list_merge_and_count_unique(self):
        parsed = TransactionExportValueUtils.parse_int_list("1, 2;2;abc;3")
        self.assertEqual(parsed, [1, 2, 3])

        merged = TransactionExportValueUtils.merge_unique_int_list([1, "2"], [2, "3", 0])
        self.assertEqual(merged, [1, 2, 3])

        count = TransactionExportValueUtils.count_unique_settlement_transactions([1, 2], [2, 3])
        self.assertEqual(count, 3)

    def test_normalize_dtime_value_uses_fallback_when_blank(self):
        self.assertEqual(
            TransactionExportValueUtils.normalize_dtime_value("", "2026-01-01 10:00:00"),
            "2026-01-01 10:00:00",
        )
        self.assertEqual(
            TransactionExportValueUtils.normalize_dtime_value("2026-01-02 08:00:00", "fallback"),
            "2026-01-02 08:00:00",
        )


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