private IHttpClientFactory MockHttpFactory()
        {
            var content = new BaseClientResult <ErrorCodes>
            {
                IsSuccess  = true,
                StatusCode = HttpStatusCode.OK
            };

            HttpMessageHandler = new Mock <HttpMessageHandler>(MockBehavior.Strict);
            HttpMessageHandler.Protected().Setup <Task <HttpResponseMessage> >("SendAsync",
                                                                               ItExpr.IsAny <HttpRequestMessage>(),
                                                                               ItExpr.IsAny <CancellationToken>()).ReturnsAsync(new HttpResponseMessage()
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new JsonContent(content)
            });

            var httpClient = new HttpClient(HttpMessageHandler.Object)
            {
                BaseAddress = new Uri("https://www.test.test/")
            };
            var httpFactoryMock = new Mock <IHttpClientFactory>();

            httpFactoryMock.Setup(x => x.CreateClient(It.IsAny <string>())).Returns(httpClient);

            return(httpFactoryMock.Object);
        }
        /// <summary>
        /// Сообщить Gateway о принятии вызова от заявителя
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public async Task <Result> NotifyGatewayAboutAcceptedApplicantCall(RouteCallClientDto data)
        {
            var url = $"{_baseUrl}acceptIncomingCall";
            BaseClientResult <ErrorCodes> baseResult = await SendData <RouteCallClientDto, ErrorCodes>(data, url);

            Result result = ProcessResult(baseResult);

            return(result);
        }
        /// <summary>
        /// Добавить в конференцию
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public async Task <Result> AddToConference(RouteCallClientDto data)
        {
            var url = $"{_baseUrl}addToConference";

            BaseClientResult <ErrorCodes> baseResult = await SendData <RouteCallClientDto, ErrorCodes>(data, url);

            Result result = ProcessResult(baseResult);

            return(result);
        }
        /// <summary>
        /// Сообщить Gateway о необходимости совершить звонок от пользователя
        /// </summary>
        public async Task <Result> CallFromUser(RouteCallClientDto data)
        {
            var url = $"{_baseUrl}callFromUser";

            BaseClientResult <ErrorCodes> baseResult = await SendData <RouteCallClientDto, ErrorCodes>(data, url);

            Result result = ProcessResult(baseResult);

            return(result);
        }
        private Result ProcessResult(BaseClientResult <ErrorCodes> baseResult)
        {
            if (baseResult.IsSuccess)
            {
                return(Result.Success());
            }

            if (baseResult.CodeType == ErrorCodes.Unknown)
            {
                return(Result.Failure(ErrorCodes.UnexpectedServiceResponse));
            }

            return(Result.Failure(baseResult.CodeType));
        }
        /// <summary>
        /// Отправить данные о непредвиденном прерывании вызова
        /// </summary>
        public async Task <Result> NotifyGatewayAboutInterruptedCall(Guid callId, Guid?applicantCallId)
        {
            var url  = $"{_baseUrl}forceHangUp";
            var data =
                new RouteCallClientDto
            {
                FromCallId = applicantCallId,
                ToCallId   = callId
            };

            BaseClientResult <ErrorCodes> baseResult = await SendData <RouteCallClientDto, ErrorCodes>(data, url);

            Result result = ProcessResult(baseResult);

            return(result);
        }
        /// <summary>
        /// Отправить данные о изменении роли в DemoGateway
        /// </summary>
        public async Task <Result> NotifyGatewayAboutChangeRole(Guid lineId, Guid fromCallId, Guid toCallId)
        {
            var url  = $"{_baseUrl}exchangeRoles";
            var data =
                new RouteCallClientDto
            {
                ToCallId   = toCallId,
                FromCallId = fromCallId,
                LineId     = lineId
            };

            BaseClientResult <ErrorCodes> baseResult = await SendData <RouteCallClientDto, ErrorCodes>(data, url);

            Result result = ProcessResult(baseResult);

            return(result);
        }
        /// <summary>
        /// Отправить информацию о изолированном звонке.
        /// </summary>
        /// <param name="callId"></param>
        /// <param name="isolation"></param>
        /// <returns></returns>
        public async Task <Result> NotifyGatewayAboutChangedIsolationStatus(Guid callId, bool isolation)
        {
            var DemoGatewayIsolationUri = $"{_baseUrl}isolate";

            var data =
                new SetIsolationStatusClientDto
            {
                CallId   = callId,
                Isolated = isolation
            };

            BaseClientResult <ErrorCodes> baseResult = await SendData <SetIsolationStatusClientDto, ErrorCodes>(data, DemoGatewayIsolationUri);

            Result result = ProcessResult(baseResult);

            if (result.IsFailure)
            {
                _logger.Warning(result.ErrorMessage);
            }

            return(result);
        }
        /// <summary>
        /// Отправить информацию о новом состоянии микрофона.
        /// </summary>
        /// <param name="callId"></param>
        /// <param name="newMicState"></param>
        /// <returns></returns>
        public async Task <Result> ChangedMicrophoneMuteStatus(Guid callId, bool newMicState)
        {
            var microphoneMuteUri = $"{_baseUrl}mute";

            var data =
                new SetMuteStatusClientDto
            {
                CallId = callId,
                Muted  = newMicState
            };

            BaseClientResult <ErrorCodes> baseResult =
                await SendData <SetMuteStatusClientDto, ErrorCodes>(data, microphoneMuteUri);

            Result result = ProcessResult(baseResult);

            if (result.IsFailure)
            {
                _logger.Warning(result.ErrorMessage);
            }

            return(result);
        }