from types import SimpleNamespace

import pytest

from pypos.modules.dashboard.controllers.dashboard_controller import DashboardController
from pypos.modules.sinkronisasi.services.event_ingestion_backpressure_service import (
    EventIngestionBackpressureService,
)

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


def _new_dashboard_ctrl_stub():
    ctrl = DashboardController.__new__(DashboardController)
    ctrl.log_info = lambda *_args, **_kwargs: None
    ctrl.log_warning = lambda *_args, **_kwargs: None
    ctrl._event_outbox_service = None
    ctrl._event_backpressure_service = EventIngestionBackpressureService(
        {
            "pending_warn": 20,
            "pending_critical": 1000,
            "default_batch": 250,
        }
    )
    return ctrl


def test_backpressure_delay_naik_saat_pending_tinggi():
    ctrl = _new_dashboard_ctrl_stub()
    ctrl._is_event_backpressure_enabled = lambda: True
    ctrl._get_event_outbox_service = lambda: SimpleNamespace(
        get_queue_metrics=lambda: {"pending": 120, "inflight": 0, "sent": 0}
    )

    resolved = ctrl._resolve_export_delay_with_backpressure(500)
    assert int(resolved) >= 1200


def test_backpressure_delay_tetap_saat_nonaktif():
    ctrl = _new_dashboard_ctrl_stub()
    ctrl._is_event_backpressure_enabled = lambda: False
    ctrl._get_event_outbox_service = lambda: None

    resolved = ctrl._resolve_export_delay_with_backpressure(700)
    assert int(resolved) == 700


def test_backpressure_delay_naik_saat_error_rate_tinggi():
    ctrl = _new_dashboard_ctrl_stub()
    ctrl._is_event_backpressure_enabled = lambda: True
    ctrl._get_event_outbox_service = lambda: SimpleNamespace(
        get_queue_metrics=lambda: {"pending": 0, "inflight": 0, "sent": 0}
    )
    ctrl._export_runtime_metrics = SimpleNamespace(
        snapshot=lambda: {"error_rate_pct": 9.5, "p95_latency_ms": 250.0}
    )

    resolved = ctrl._resolve_export_delay_with_backpressure(500)
    assert int(resolved) >= 2500
