import pytest

from hgitaly.service.commit import CommitServicer
from hgitaly.service.ref import RefServicer
from hgitaly.service.diff import DiffServicer
from hgitaly.service.repository_service import RepositoryServiceServicer
from hgitaly.stub.commit_pb2_grpc import add_CommitServiceServicer_to_server
from hgitaly.stub.ref_pb2_grpc import add_RefServiceServicer_to_server
from hgitaly.stub.diff_pb2_grpc import add_DiffServiceServicer_to_server
from hgitaly.stub.repository_service_pb2_grpc import (
    add_RepositoryServiceServicer_to_server
)


@pytest.fixture(scope='module')
def grpc_server(_grpc_server, grpc_addr, server_repos_root):
    storages = dict(default=str(server_repos_root / 'default').encode())

    add_CommitServiceServicer_to_server(CommitServicer(storages),
                                        _grpc_server)
    add_RefServiceServicer_to_server(RefServicer(storages),
                                     _grpc_server)
    add_DiffServiceServicer_to_server(DiffServicer(storages),
                                      _grpc_server)
    add_RepositoryServiceServicer_to_server(
        RepositoryServiceServicer(storages),
        _grpc_server)
    _grpc_server.add_insecure_port(grpc_addr)
    _grpc_server.start()
    yield _grpc_server
    _grpc_server.stop(grace=None)


@pytest.fixture(scope='module')
def server_repos_root(tmp_path_factory):
    return tmp_path_factory.mktemp("server-repos")