# edited by glg
import unittest

from pypos.modules.dashboard.controllers.dashboard_controller import DashboardController


class _DummyView:
    pass


class _DummyAppController:
    pass


class DashboardSettlementDeliveryModeTests(unittest.TestCase):
    def _build_controller(self):
        return DashboardController(_DummyView(), _DummyAppController())

    def test_request_export_after_settlement_direct_only_runs_export_trigger_for_non_settlement(self):
        ctrl = self._build_controller()
        settlement_result = {"counter": "ST-20260311-001"}
        direct_calls = []
        schedule_calls = []
        run_calls = []

        ctrl._trigger_settlement_direct_async = lambda payload=None: direct_calls.append(payload) or True
        ctrl._schedule_export_recheck = lambda delay_ms=0: schedule_calls.append(int(delay_ms))
        ctrl._run_pending_export_if_ready = lambda: run_calls.append(True)
        ctrl.config_service.get_settlement_delivery_mode = lambda: "direct_only"
        ctrl.config_service.is_settlement_direct_only_mode = lambda: True
        ctrl.config_service.is_export_on_settlement_enabled = lambda: True

        result = ctrl.request_export_after_settlement(settlement_result)

        self.assertTrue(result)
        self.assertEqual(len(direct_calls), 1)
        self.assertEqual(direct_calls[0], settlement_result)
        self.assertEqual(run_calls, [True])
        self.assertEqual(schedule_calls, [10])
        self.assertTrue(bool(ctrl._pending_export_after_settlement))

    def test_request_export_after_settlement_dual_mode_queue_export(self):
        ctrl = self._build_controller()
        settlement_result = {"counter": "ST-20260311-002"}
        direct_calls = []
        schedule_calls = []
        run_calls = []

        ctrl._trigger_settlement_direct_async = lambda payload=None: direct_calls.append(payload) or True
        ctrl._schedule_export_recheck = lambda delay_ms=0: schedule_calls.append(int(delay_ms))
        ctrl._run_pending_export_if_ready = lambda: run_calls.append(True)
        ctrl.config_service.get_settlement_delivery_mode = lambda: "dual"
        ctrl.config_service.is_settlement_direct_only_mode = lambda: False
        ctrl.config_service.is_export_on_settlement_enabled = lambda: True

        result = ctrl.request_export_after_settlement(settlement_result)

        self.assertTrue(result)
        self.assertEqual(len(direct_calls), 1)
        self.assertEqual(direct_calls[0], settlement_result)
        self.assertEqual(run_calls, [True])
        self.assertEqual(schedule_calls, [10])
        self.assertTrue(bool(ctrl._pending_export_after_settlement))

    def test_request_export_after_settlement_dual_mode_export_disabled(self):
        ctrl = self._build_controller()
        settlement_result = {"counter": "ST-20260311-003"}
        direct_calls = []
        schedule_calls = []
        run_calls = []

        ctrl._trigger_settlement_direct_async = lambda payload=None: direct_calls.append(payload) or True
        ctrl._schedule_export_recheck = lambda delay_ms=0: schedule_calls.append(int(delay_ms))
        ctrl._run_pending_export_if_ready = lambda: run_calls.append(True)
        ctrl.config_service.get_settlement_delivery_mode = lambda: "dual"
        ctrl.config_service.is_settlement_direct_only_mode = lambda: False
        ctrl.config_service.is_export_on_settlement_enabled = lambda: False

        result = ctrl.request_export_after_settlement(settlement_result)

        self.assertFalse(result)
        self.assertEqual(len(direct_calls), 1)
        self.assertEqual(direct_calls[0], settlement_result)
        self.assertEqual(run_calls, [])
        self.assertEqual(schedule_calls, [])
        self.assertFalse(bool(ctrl._pending_export_after_settlement))

    def test_request_export_after_settlement_export_only_skips_direct_and_queue_export(self):
        ctrl = self._build_controller()
        settlement_result = {"counter": "ST-20260311-004"}
        direct_calls = []
        schedule_calls = []
        run_calls = []

        ctrl._trigger_settlement_direct_async = lambda payload=None: direct_calls.append(payload) or True
        ctrl._schedule_export_recheck = lambda delay_ms=0: schedule_calls.append(int(delay_ms))
        ctrl._run_pending_export_if_ready = lambda: run_calls.append(True)
        ctrl.config_service.get_settlement_delivery_mode = lambda: "export_only"
        ctrl.config_service.is_settlement_direct_only_mode = lambda: False
        ctrl.config_service.is_export_on_settlement_enabled = lambda: True

        result = ctrl.request_export_after_settlement(settlement_result)

        self.assertTrue(result)
        self.assertEqual(direct_calls, [])
        self.assertEqual(run_calls, [True])
        self.assertEqual(schedule_calls, [10])
        self.assertTrue(bool(ctrl._pending_export_after_settlement))
