public async Task<TransportRouteData> GetTransportRoute(Guid id,
            IList<Domain.Country> countries)
        {
            var idContainer = new TransportRouteIdContainer();

            var stateOfImport = await draftRepository.GetDraftData<Draft.StateOfImport>(id);
            var stateOfExport = await draftRepository.GetDraftData<Draft.StateOfExport>(id);
            var transitStateCollection = await draftRepository.GetDraftData<Draft.TransitStateCollection>(id);

            /* 
            * We must find the ids for the competent authorities and entry or exit points used by
            * the state of export, import and transit states.
            * Since these are all nullable we use a series of methods to gather the non-null ids we need
            * to load data for. This is so we can load the data in 2 calls rather than multiple calls.
            */
            AddTransitStateIds(transitStateCollection, idContainer);
            AddStateOfExportIds(stateOfExport, idContainer);
            AddStateOfImportIds(stateOfImport, idContainer);

            var competentAuthorities = await competentAuthorityRepository.GetByIds(idContainer.CompetentAuthorityIds);
            var entryOrExitPoints = await entryOrExitPointRepository.GetByIds(idContainer.EntryOfExitPointIds);
            var lookups = new TransportRouteLookups(countries, competentAuthorities, entryOrExitPoints);

            // Use the loaded competent authorities and entry or exit points to retrieve names for summary data.
            return new TransportRouteData(GenerateTransitStates(transitStateCollection, lookups),
                GenerateStateOfExport(stateOfExport, lookups),
                GenerateStateOfImport(stateOfImport, lookups),
                transitStateCollection.HasNoTransitStates);
        }
 private void AddStateOfImportIds(Draft.StateOfImport stateOfImport, TransportRouteIdContainer idContainer)
 {
     if (stateOfImport != null)
     {
         idContainer.AddCompetentAuthority(stateOfImport.CompetentAuthorityId);
         idContainer.AddEntryOrExitPoint(stateOfImport.EntryPointId);
     }
 }
 private void AddTransitStateIds(Draft.TransitStateCollection transitStateCollection,
     TransportRouteIdContainer idContainer)
 {
     if (transitStateCollection != null && transitStateCollection.TransitStates != null)
     {
         idContainer.AddCompetentAuthorities(transitStateCollection.TransitStates.Select(ts => ts.CompetentAuthorityId));
         idContainer.AddEntryOrExitPoints(transitStateCollection.TransitStates.Select(ts => ts.EntryPointId));
         idContainer.AddEntryOrExitPoints(transitStateCollection.TransitStates.Select(ts => ts.ExitPointId));
     }
 }