/// <summary>
        /// Get the street DTO for operational object.
        /// </summary>
        /// <param name="networkLinkID">networkLink unique identifier Guid.</param>
        /// <returns>Nearest street and the intersection point.</returns>
        public NetworkLinkDTO GetNetworkLink(Guid networkLinkID)
        {
            using (loggingHelper.RMTraceManager.StartTrace("Business.GetNetworkLink"))
            {
                string methodName = typeof(NetworkManagerBusinessService) + "." + nameof(GetNetworkLink);
                loggingHelper.LogMethodEntry(methodName, priority, entryEventId);

                NetworkLinkDataDTO getNetworkLink = streetNetworkDataService.GetNetworkLink(networkLinkID);
                NetworkLinkDTO     networkLink    = new NetworkLinkDTO()
                {
                    Id                   = getNetworkLink.ID,
                    LinkGeometry         = getNetworkLink.LinkGeometry,
                    NetworkLinkType_GUID = getNetworkLink.NetworkLinkTypeGUID,
                    TOID                 = getNetworkLink.TOID,
                    DataProvider_GUID    = getNetworkLink.DataProviderGUID,
                    StartNode_GUID       = getNetworkLink.StartNodeID,
                    EndNode_GUID         = getNetworkLink.EndNodeID,
                    LinkGradientType     = getNetworkLink.LinkGradientType,
                    LinkLength           = getNetworkLink.LinkLength,
                    LinkName             = getNetworkLink.LinkName,
                    RoadName_GUID        = getNetworkLink.RoadNameGUID,
                    StreetName_GUID      = getNetworkLink.StreetNameGUID
                };

                loggingHelper.LogMethodExit(methodName, priority, exitEventId);
                return(networkLink);
            }
        }
        /// <summary>
        /// Setup for Nunit Tests.
        /// </summary>
        protected override void OnSetup()
        {
            mockStreetNetworkDataService         = CreateMock <IStreetNetworkDataService>();
            mockNetworkManagerIntegrationService = CreateMock <INetworkManagerIntegrationService>();
            mockOsRoadLinkDataService            = CreateMock <IOSRoadLinkDataService>();
            mockRoadNameDataService = CreateMock <IRoadNameDataService>();
            loggingHelperMock       = CreateMock <ILoggingHelper>();

            dbGeometry = DbGeometry.PointFromText("POINT (488938 197021)", 27700);
            List <SqlGeometry> listOfnetworkIntersectionPoint = new List <SqlGeometry>();
            SqlGeometry        networkIntersectionPoint       = new SqlGeometry();

            coordinates  = "POLYGON ((505058.162109375 100281.69677734375, 518986.84887695312 100281.69677734375, 518986.84887695312 114158.546875, 505058.162109375 114158.546875, 505058.162109375 100281.69677734375))";
            lineGeometry = DbGeometry.LineFromText("LINESTRING (512722.70000000019 104752.6799999997, 512722.70000000019 104738)", 27700);

            NetworkLinkDataDTO networkLink = new NetworkLinkDataDTO()
            {
                ID = Guid.NewGuid(), LinkGeometry = lineGeometry
            };
            List <Tuple <NetworkLinkDataDTO, SqlGeometry> > listOfTuple = new List <Tuple <NetworkLinkDataDTO, SqlGeometry> > {
                new Tuple <NetworkLinkDataDTO, SqlGeometry>(networkLink, networkIntersectionPoint)
            };
            Tuple <NetworkLinkDataDTO, SqlGeometry> tuple = new Tuple <NetworkLinkDataDTO, SqlGeometry>(networkLink, networkIntersectionPoint);

            referenceDataCategoryDTOList = new List <ReferenceDataCategoryDTO>()
            {
                new ReferenceDataCategoryDTO()
                {
                    ReferenceDatas = new List <ReferenceDataDTO>()
                    {
                        new ReferenceDataDTO()
                        {
                            ReferenceDataValue = FileType.Nyb.ToString(),
                            ID = Guid.NewGuid(),
                        }
                    },
                    CategoryName = PostalAddressType
                }
            };

            // Setup Methods.
            mockNetworkManagerIntegrationService.Setup(x => x.GetReferenceDataSimpleLists(It.IsAny <List <string> >())).ReturnsAsync(referenceDataCategoryDTOList);
            mockNetworkManagerIntegrationService.Setup(x => x.GetReferenceDataNameValuePairs(It.IsAny <List <string> >())).ReturnsAsync(referenceDataCategoryDTOList);
            mockStreetNetworkDataService.Setup(x => x.GetNearestNamedRoad(It.IsAny <DbGeometry>(), It.IsAny <string>(), It.IsAny <List <ReferenceDataCategoryDTO> >())).Returns(tuple);
            mockStreetNetworkDataService.Setup(x => x.GetNearestSegment(It.IsAny <DbGeometry>(), It.IsAny <List <ReferenceDataCategoryDTO> >())).Returns(listOfTuple);
            mockStreetNetworkDataService.Setup(x => x.GetNetworkLink(It.IsAny <Guid>())).Returns(networkLink);
            mockStreetNetworkDataService.Setup(x => x.GetCrossingNetworkLink(It.IsAny <string>(), It.IsAny <DbGeometry>())).Returns(new List <NetworkLinkDataDTO>()
            {
                networkLink
            });
            mockStreetNetworkDataService.Setup(x => x.GetStreetNamesForBasicSearch(It.IsAny <string>(), It.IsAny <Guid>(), "Delivery Office")).ReturnsAsync(new List <StreetNameDataDTO>()
            {
                new StreetNameDataDTO()
                {
                    LocalName = "abc"
                }
            });
            mockStreetNetworkDataService.Setup(x => x.GetStreetNameCount(It.IsAny <string>(), It.IsAny <Guid>(), "Delivery Office")).ReturnsAsync(5);
            mockStreetNetworkDataService.Setup(x => x.GetStreetNamesForAdvanceSearch(It.IsAny <string>(), It.IsAny <Guid>(), "Delivery Office")).ReturnsAsync(new List <StreetNameDataDTO>()
            {
                new StreetNameDataDTO()
                {
                    LocalName = "abc"
                }
            });
            mockOsRoadLinkDataService.Setup(x => x.GetOSRoadLink(It.IsAny <string>())).ReturnsAsync("abc");
            mockRoadNameDataService.Setup(x => x.GetRoadRoutes(It.IsAny <string>(), It.IsAny <Guid>(), It.IsAny <List <ReferenceDataCategoryDTO> >(), It.IsAny <string>())).Returns(new List <NetworkLinkDataDTO>()
            {
                networkLink
            });

            // Setup for IRMTraceManager.
            var rmTraceManagerMock = new Mock <IRMTraceManager>();

            rmTraceManagerMock.Setup(x => x.StartTrace(It.IsAny <string>(), It.IsAny <Guid>()));
            loggingHelperMock.Setup(x => x.RMTraceManager).Returns(rmTraceManagerMock.Object);
            SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

            testCandidate = new NetworkManagerBusinessService(mockStreetNetworkDataService.Object, mockNetworkManagerIntegrationService.Object, mockOsRoadLinkDataService.Object, mockRoadNameDataService.Object, loggingHelperMock.Object);
        }
        /// <summary>
        /// Setup for Nunit Tests.
        /// </summary>
        protected override void OnSetup()
        {
            mockLoggingHelper = CreateMock <ILoggingHelper>();
            unit1Guid         = Guid.NewGuid();
            unit2Guid         = Guid.NewGuid();
            unit3Guid         = Guid.NewGuid();
            user1Id           = System.Guid.NewGuid();
            user2Id           = System.Guid.NewGuid();

            var unitBoundary = DbGeometry.PolygonFromText("POLYGON((511570.8590967182 106965.35195621933, 511570.8590967182 107474.95297542136, 512474.1409032818 107474.95297542136, 512474.1409032818 106965.35195621933, 511570.8590967182 106965.35195621933))", 27700);
            var location     = new List <Location>()
            {
                new Location()
                {
                    ID = unit1Guid, Shape = unitBoundary
                }
            };
            var networkLinks = new List <NetworkLink>()
            {
                new NetworkLink()
                {
                    LinkGeometry = unitBoundary,
                }
            };
            var networkLink = new NetworkLink()
            {
                LinkGeometry = unitBoundary,
            };
            var accessLink = new List <AccessLink>()
            {
                new AccessLink()
                {
                    ID = Guid.NewGuid(), NetworkLink = networkLink
                }
            };
            var deliveryPoint = new List <DeliveryPoint>()
            {
                new DeliveryPoint()
                {
                    NetworkNode = new NetworkNode()
                    {
                        Location = new Location()
                        {
                            Shape = unitBoundary
                        }
                    }
                }
            };

            var networkNodeDataDTO = new NetworkNodeDataDTO()
            {
                ID       = Guid.NewGuid(),
                Location = new LocationDataDTO()
                {
                    ID                = Guid.NewGuid(),
                    Shape             = unitBoundary,
                    RowCreateDateTime = DateTime.UtcNow
                }
            };

            var accessLinkDataDTOs = new AccessLinkDataDTO()
            {
                Approved               = true,
                ID                     = Guid.NewGuid(),
                WorkloadLengthMeter    = 40,
                LinkDirectionGUID      = Guid.NewGuid(),
                ConnectedNetworkLinkID = Guid.NewGuid(),
                AccessLinkTypeGUID     = Guid.NewGuid()
            };

            var accessLinkStatus = new AccessLinkStatusDataDTO()
            {
                ID                   = Guid.NewGuid(),
                NetworkLinkID        = Guid.NewGuid(),
                AccessLinkStatusGUID = Guid.NewGuid(),
                StartDateTime        = DateTime.UtcNow,
                RowCreateDateTime    = DateTime.UtcNow
            };

            netWorkLinkDataDto = new NetworkLinkDataDTO()
            {
                ID = Guid.NewGuid(),
                DataProviderGUID    = Guid.NewGuid(),
                NetworkLinkTypeGUID = Guid.NewGuid(),
                StartNodeID         = Guid.NewGuid(),
                EndNodeID           = Guid.NewGuid(),
                LinkLength          = 40,
                LinkGeometry        = unitBoundary,
                RowCreateDateTime   = DateTime.UtcNow,
            };

            var mockAsynEnumerable = new DbAsyncEnumerable <AccessLink>(accessLink);

            mockFmoDbContext = CreateMock <AccessLinkDBContext>();
            mockFmoDbContext.Setup(x => x.SaveChanges()).Returns(1);
            var mockAccessLinkDataService = MockDbSet(accessLink);

            mockFmoDbContext.Setup(x => x.Set <AccessLink>()).Returns(mockAccessLinkDataService.Object);
            mockFmoDbContext.Setup(x => x.AccessLinks).Returns(mockAccessLinkDataService.Object);

            // mockFmoDbContext.Setup(c => c.AccessLinks.AsNoTracking()).Returns(mockAccessLinkDataService.Object);
            mockAccessLinkDataService.Setup(x => x.Include(It.IsAny <string>())).Returns(mockAccessLinkDataService.Object);
            mockAccessLinkDataService.Setup(x => x.AsNoTracking()).Returns(mockAccessLinkDataService.Object);

            var mockAccessLinkDataService1 = MockDbSet(networkLinks);

            mockFmoDbContext.Setup(x => x.Set <NetworkLink>()).Returns(mockAccessLinkDataService1.Object);
            mockFmoDbContext.Setup(x => x.NetworkLinks).Returns(mockAccessLinkDataService1.Object);

            // mockFmoDbContext.Setup(c => c.NetworkLinks.AsNoTracking()).Returns(mockAccessLinkDataService1.Object);
            mockAccessLinkDataService1.Setup(x => x.AsNoTracking()).Returns(mockAccessLinkDataService1.Object);

            var mockAccessLinkDataService4 = MockDbSet(deliveryPoint);

            mockFmoDbContext.Setup(x => x.Set <DeliveryPoint>()).Returns(mockAccessLinkDataService4.Object);
            mockFmoDbContext.Setup(x => x.DeliveryPoints).Returns(mockAccessLinkDataService4.Object);
            mockAccessLinkDataService4.Setup(x => x.AsNoTracking()).Returns(mockAccessLinkDataService4.Object);

            var mockAsynEnumerable2        = new DbAsyncEnumerable <Location>(location);
            var mockAccessLinkDataService2 = MockDbSet(location);

            mockFmoDbContext.Setup(x => x.Set <Location>()).Returns(mockAccessLinkDataService2.Object);
            mockFmoDbContext.Setup(x => x.Locations).Returns(mockAccessLinkDataService2.Object);
            mockFmoDbContext.Setup(c => c.Locations.AsNoTracking()).Returns(mockAccessLinkDataService2.Object);

            mockDatabaseFactory = CreateMock <IDatabaseFactory <AccessLinkDBContext> >();
            mockDatabaseFactory.Setup(x => x.Get()).Returns(mockFmoDbContext.Object);

            var rmTraceManagerMock = new Mock <IRMTraceManager>();

            rmTraceManagerMock.Setup(x => x.StartTrace(It.IsAny <string>(), It.IsAny <Guid>()));
            mockLoggingHelper.Setup(x => x.RMTraceManager).Returns(rmTraceManagerMock.Object);

            testCandidate = new AccessLinkDataService(mockDatabaseFactory.Object, mockLoggingHelper.Object);
        }
        /// <summary>
        /// Get the nearest street for operational object.
        /// </summary>
        /// <param name="operationalObjectPoint">Operational object unique identifier.</param>
        /// <param name="streetName">Street name.</param>
        /// <param name="referenceDataCategoryList">The reference data category list.</param>
        /// <returns>Nearest street and the intersection point.</returns>
        public Tuple <NetworkLinkDataDTO, SqlGeometry> GetNearestNamedRoad(DbGeometry operationalObjectPoint, string streetName, List <ReferenceDataCategoryDTO> referenceDataCategoryList)
        {
            using (loggingHelper.RMTraceManager.StartTrace("DataService.GetNearestNamedRoad"))
            {
                string methodName = typeof(StreetNetworkDataService) + "." + nameof(GetNearestNamedRoad);
                loggingHelper.LogMethodEntry(methodName, priority, entryEventId);

                SqlGeometry        networkIntersectionPoint = SqlGeometry.Null;
                NetworkLinkDataDTO networkLink = null;

                // find the nearest named road for the provided operational object.
                var nearestNamedRoad = DataContext.StreetNames
                                       .Where(m => m.Descriptor == streetName ||
                                              m.DesignatedName == streetName ||
                                              m.LocalName == streetName)
                                       .OrderBy(n => operationalObjectPoint.Distance(n.Geometry))
                                       .Select(l => new StreetNameDataDTO
                {
                    ID               = l.ID,
                    StreetType       = l.StreetType,
                    NationalRoadCode = l.NationalRoadCode,
                    DesignatedName   = l.DesignatedName,
                    Descriptor       = l.Descriptor
                }).FirstOrDefault();

                if (nearestNamedRoad != null)
                {
                    // check if the there are no intersections with any other roads and the access link
                    // intersection point
                    Guid networkPathLinkType = referenceDataCategoryList.Where(x => x.CategoryName.Replace(" ", string.Empty) == ReferenceDataCategoryNames.NetworkLinkType)
                                               .SelectMany(x => x.ReferenceDatas)
                                               .Single(x => x.ReferenceDataValue == ReferenceDataValues.NetworkLinkPathLink).ID;

                    Guid networkRoadLinkType = referenceDataCategoryList.Where(x => x.CategoryName.Replace(" ", string.Empty) == ReferenceDataCategoryNames.NetworkLinkType)
                                               .SelectMany(x => x.ReferenceDatas)
                                               .Single(x => x.ReferenceDataValue == ReferenceDataValues.NetworkLinkRoadLink).ID;

                    networkLink = DataContext.NetworkLinks.AsNoTracking().Where(m => m.StreetNameGUID == nearestNamedRoad.ID)
                                  .OrderBy(n => n.LinkGeometry.Distance(operationalObjectPoint))
                                  .Select(l => new NetworkLinkDataDTO
                    {
                        ID                  = l.ID,
                        LinkGeometry        = l.LinkGeometry,
                        NetworkLinkTypeGUID = l.NetworkLinkTypeGUID,
                        TOID                = l.TOID
                    }).FirstOrDefault();

                    if (networkLink != null)
                    {
                        SqlGeometry accessLinkLine =
                            operationalObjectPoint.ToSqlGeometry().ShortestLineTo(networkLink.LinkGeometry.ToSqlGeometry());

                        if (!accessLinkLine.IsNull)
                        {
                            DbGeometry accessLinkDbGeometry = accessLinkLine.ToDbGeometry();

                            // find any road or path segment intersects with the planned access link.
                            var intersectionCountForRoadOrPath = DataContext.NetworkLinks.AsNoTracking()
                                                                 .Count(m => m.LinkGeometry.Intersects(accessLinkDbGeometry) &&
                                                                        (m.NetworkLinkTypeGUID == networkRoadLinkType || m.NetworkLinkTypeGUID == networkPathLinkType));

                            if (intersectionCountForRoadOrPath == 0)
                            {
                                networkIntersectionPoint = accessLinkLine.STEndPoint();
                            }
                        }
                    }
                }

                loggingHelper.LogMethodExit(methodName, priority, exitEventId);
                return(new Tuple <NetworkLinkDataDTO, SqlGeometry>(networkLink, networkIntersectionPoint));
            }
        }