import pytest

from pypos.modules.sinkronisasi.services.event_ingestion_backpressure_service import (
    EventIngestionBackpressureService,
)

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


def test_backpressure_mode_normal_default():
    service = EventIngestionBackpressureService()
    result = service.evaluate(
        {
            "pending": 10,
            "inflight": 0,
            "error_rate_pct": 0.1,
            "avg_latency_ms": 120.0,
        }
    )
    assert result["mode"] == "normal"
    assert result["ingest_enabled"] is True
    assert result["recommended_batch_size"] >= 10
    assert result["recommended_poll_delay_ms"] >= 100


def test_backpressure_mode_normal_inflight():
    service = EventIngestionBackpressureService({"default_batch": 250})
    result = service.evaluate(
        {
            "pending": 10,
            "inflight": 5,
            "error_rate_pct": 0.1,
            "avg_latency_ms": 100.0,
        }
    )
    assert result["mode"] == "normal_inflight"
    assert result["ingest_enabled"] is True
    assert result["recommended_batch_size"] == 180
    assert result["recommended_poll_delay_ms"] == 350


def test_backpressure_mode_throttle():
    service = EventIngestionBackpressureService({"pending_warn": 100})
    result = service.evaluate(
        {
            "pending": 100,
            "inflight": 0,
            "error_rate_pct": 0.5,
            "avg_latency_ms": 100.0,
        }
    )
    assert result["mode"] == "throttle"
    assert result["ingest_enabled"] is True
    assert result["reason"] == "warn_threshold_reached"
    assert result["recommended_batch_size"] == 100
    assert result["recommended_poll_delay_ms"] == 1200


def test_backpressure_mode_critical():
    service = EventIngestionBackpressureService({"error_critical_pct": 5.0})
    result = service.evaluate(
        {
            "pending": 50,
            "inflight": 0,
            "error_rate_pct": 5.0,
            "avg_latency_ms": 100.0,
        }
    )
    assert result["mode"] == "critical"
    assert result["ingest_enabled"] is False
    assert result["reason"] == "critical_threshold_reached"
    assert result["recommended_batch_size"] == 10
    assert result["recommended_poll_delay_ms"] == 2500


def test_backpressure_min_batch_bisa_dituning_untuk_node_lemah():
    service = EventIngestionBackpressureService(
        {
            "default_batch": 40,
            "min_batch": 5,
            "error_critical_pct": 5.0,
        }
    )
    healthy = service.evaluate(
        {
            "pending": 0,
            "inflight": 0,
            "error_rate_pct": 0.0,
            "avg_latency_ms": 50.0,
        }
    )
    critical = service.evaluate(
        {
            "pending": 0,
            "inflight": 0,
            "error_rate_pct": 6.0,
            "avg_latency_ms": 50.0,
        }
    )
    assert healthy["recommended_batch_size"] == 40
    assert critical["recommended_batch_size"] == 5
