import time
from unittest.mock import patch

import pytest

from pypos.modules.sinkronisasi.services.sync_api_service import SyncApiService
from pypos.modules.sinkronisasi.services.transaction_export_service import TransactionExportService

# edited by glg
pytestmark = [pytest.mark.perf_smoke, pytest.mark.non_functional]


class _SyncModelStub:
    def __init__(self, table_count=120):
        self._tables = [f"table_{idx}" for idx in range(1, table_count + 1)]

    def get_last_sync_info(self):
        return {
            table: {"last_update": "2026-01-01 00:00:00", "last_id": idx}
            for idx, table in enumerate(self._tables, start=1)
        }

    @staticmethod
    def _resolve_cabang_id(_machine_id, cabang_id):
        return cabang_id


def test_sync_prepare_payload_load_perf_smoke():
    model = _SyncModelStub(table_count=140)
    service = SyncApiService(http_client=object())
    tables = list(model.get_last_sync_info().keys())

    started_at = time.perf_counter()
    iterations = 250
    expected_pair_fields = len(tables) * 2
    for _ in range(iterations):
        payload, cabang_id = service._prepare_payload(
            model=model,
            machine_id="MACHINE-PERF",
            cabang_id=11,
            tables=tables,
        )
        assert cabang_id == 11
        assert payload.get("machine_id") == "MACHINE-PERF"
        assert payload.get("cabang_id") == 11
        assert len(payload) >= (2 + expected_pair_fields)
    elapsed_ms = (time.perf_counter() - started_at) * 1000.0
    assert elapsed_ms < 6000.0


def test_export_payload_build_load_perf_smoke():
    rows = [{"id": idx, "transaksi_id": idx, "produk_id": 10 + idx} for idx in range(1, 2501)]
    service = TransactionExportService(db_path=":memory:")
    batch_end = "2026-04-02 09:30:00"

    runtime_cfg = {
        "export_payload_profile": "legacy_table",
        "export_schema_version": "1.0.0",
        "api_base_url": "https://pos.example.test",
    }
    with patch(
        "pypos.modules.sinkronisasi.services.transaction_export_service.read_config",
        return_value=runtime_cfg,
    ), patch(
        "pypos.modules.sinkronisasi.services.transaction_export_service.get_current_server_hash",
        return_value="hash-perf-smoke",
    ), patch.object(
        service,
        "_get_export_device_context",
        return_value={"machine_id": "PERF-MACHINE"},
    ):
        started_at = time.perf_counter()
        payload = service._build_export_payload(
            table_name="transaksi_data",
            last_id=0,
            new_last_id=len(rows),
            batch_end=batch_end,
            rows=rows,
        )
        elapsed_ms = (time.perf_counter() - started_at) * 1000.0

    assert isinstance(payload, dict)
    assert payload.get("table") == "transaksi_data"
    assert int(payload.get("row") or 0) == len(rows)
    assert elapsed_ms < 7000.0
