# edited by glg
import time

import pytest

from pypos.modules.auth.services import employee_seed_use_case_service as seed_module
from pypos.modules.auth.services.employee_seed_use_case_service import (
    EmployeeSeedContextError,
    EmployeeSeedTimeoutError,
    EmployeeSeedUseCaseService,
)


pytestmark = [pytest.mark.unit]


class _DummyLogger:
    @staticmethod
    def warning(*_args, **_kwargs):
        return None


def test_ensure_seed_skip_when_local_rows_sudah_ada(monkeypatch):
    calls = []

    def _fake_set_bool(key, value):
        calls.append((str(key), bool(value)))

    monkeypatch.setattr(seed_module, "set_bool", _fake_set_bool)
    monkeypatch.setattr(seed_module, "get_bool", lambda *_args, **_kwargs: False)
    monkeypatch.setattr(seed_module, "get_active_device_info", lambda *_args, **_kwargs: {})

    service = EmployeeSeedUseCaseService(
        logger=_DummyLogger(),
        seed_pending_key="seed_pending",
        seed_done_key="seed_done",
    )
    monkeypatch.setattr(service, "_count_local_per_employee_rows", lambda *_args, **_kwargs: 5)

    result = service.ensure_seed(device_id="DEV-01", strict=False)
    assert result["ok"] is True
    assert result["seeded"] is False
    assert result["local_rows"] == 5
    assert ("seed_pending", False) in calls
    assert ("seed_done", True) in calls


def test_ensure_seed_raise_context_error_when_device_invalid(monkeypatch):
    monkeypatch.setattr(seed_module, "set_bool", lambda *_args, **_kwargs: None)
    monkeypatch.setattr(seed_module, "get_bool", lambda *_args, **_kwargs: False)
    monkeypatch.setattr(seed_module, "get_active_device_info", lambda *_args, **_kwargs: {})

    service = EmployeeSeedUseCaseService(
        logger=_DummyLogger(),
        seed_pending_key="seed_pending",
        seed_done_key="seed_done",
    )
    monkeypatch.setattr(service, "_count_local_per_employee_rows", lambda *_args, **_kwargs: 0)

    with pytest.raises(EmployeeSeedContextError):
        service.ensure_seed(device_id="DEV-INVALID", strict=True)


def test_sync_once_timeout_raise_typed_exception(monkeypatch):
    service = EmployeeSeedUseCaseService(
        logger=_DummyLogger(),
        seed_pending_key="seed_pending",
        seed_done_key="seed_done",
        default_wait_seconds=0.05,
    )

    def _slow_sync(*, machine_id, cabang_id):
        _ = machine_id
        _ = cabang_id
        time.sleep(0.2)
        return 1

    monkeypatch.setattr(service, "_sync_per_employee_once_impl", _slow_sync)

    with pytest.raises(EmployeeSeedTimeoutError):
        service._sync_per_employee_once(machine_id="M-01", cabang_id=1)
