public static Api.Resources.Crew BuildCrew(IMapper mapper, Models.Competition competition, Models.Crew modelCrew)
        {
            if (mapper is null)
            {
                throw new ArgumentNullException(nameof(mapper));
            }
            if (competition is null)
            {
                throw new ArgumentNullException(nameof(competition));
            }
            if (modelCrew is null)
            {
                throw new ArgumentNullException(nameof(modelCrew));
            }

            TimingPoint startPoint = competition.TimingPoints.First();

            Api.Resources.Crew apiCrew = mapper.Map <Api.Resources.Crew>(modelCrew);

            foreach (Models.Result modelResult in modelCrew.Results)
            {
                Api.Resources.Result apiResult = new Api.Resources.Result()
                {
                    Id          = modelResult.TimingPointId,
                    TimeOfDay   = modelResult.TimeOfDay,
                    Name        = modelResult.TimingPoint.Name,
                    RunTime     = modelCrew.RunTime(startPoint.TimingPointId, modelResult.TimingPointId),
                    SectionTime = startPoint.TimingPointId != modelResult.TimingPointId ?
                                  modelCrew.RunTime(competition.TimingPoints[competition.TimingPoints.IndexOf(modelResult.TimingPoint) - 1].TimingPointId,
                                                    modelResult.TimingPointId) : null
                };
                apiCrew.Results.Add(apiResult);
            }

            return(apiCrew);
        }
        public static List <Api.Resources.Crew> BuildCrewsList(IMapper mapper, Models.Competition competition, IEnumerable <Models.Crew> crews)
        {
            if (mapper is null)
            {
                throw new ArgumentNullException(nameof(mapper));
            }
            if (competition is null)
            {
                throw new ArgumentNullException(nameof(competition));
            }
            if (crews is null)
            {
                throw new ArgumentNullException(nameof(crews));
            }

            List <Api.Resources.Crew> apiCrews = new List <Api.Resources.Crew>();

            if (!crews.Any())
            {
                return(apiCrews);
            }

            TimingPoint finishPoint = competition.TimingPoints.Last();

            foreach (Models.Crew modelCrew in crews)
            {
                Api.Resources.Crew apiCrew = BuildCrew(mapper, competition, modelCrew);

                apiCrews.Add(apiCrew);
            }

            for (int i = 1; i < competition.TimingPoints.Count; i++)
            {
                apiCrews = OrderCrews(apiCrews, competition, competition.TimingPoints[i]);

                int currentTimingPointId = competition.TimingPoints[i].TimingPointId;
                int rank = 1;
                for (int j = 0; j < apiCrews.Count; j++)
                {
                    Api.Resources.Result currentResult = apiCrews[j].Results.FirstOrDefault(y => y.Id == currentTimingPointId);
                    if (currentResult == null)
                    {
                        break;
                    }

                    if (j == 0)
                    {
                        currentResult.Rank = rank.ToString(CultureInfo.CurrentCulture);
                        if (apiCrews.Count > 1)
                        {
                            currentResult.Rank += (apiCrews[j + 1].Results.FirstOrDefault(y => y.Id == currentTimingPointId)?.RunTime == currentResult.RunTime ? "=" : String.Empty);
                        }
                    }
                    else if (currentResult.RunTime == apiCrews[j - 1].Results.FirstOrDefault(y => y.Id == currentTimingPointId).RunTime)
                    {
                        currentResult.Rank = rank.ToString(CultureInfo.CurrentCulture) + "=";
                    }
                    else
                    {
                        rank = j + 1;
                        currentResult.Rank = rank.ToString(CultureInfo.CurrentCulture);
                        if (j < apiCrews.Count - 1)
                        {
                            currentResult.Rank += (apiCrews[j + 1].Results.FirstOrDefault(y => y.Id == currentTimingPointId)?.RunTime == currentResult?.RunTime ? "=" : String.Empty);
                        }
                    }
                }
            }

            apiCrews = OrderCrews(apiCrews, competition);

            int overallRank = 1;

            for (int i = 0; i < apiCrews.Count; i++)
            {
                if (apiCrews[i].OverallTime == null)
                {
                    break;
                }

                if (i == 0)
                {
                    apiCrews[i].Rank = overallRank.ToString(CultureInfo.CurrentCulture);
                    if (apiCrews.Count > 1)
                    {
                        apiCrews[i].Rank += (apiCrews[i + 1].OverallTime == apiCrews[i].OverallTime ? "=" : String.Empty);
                    }
                }
                else if (apiCrews[i].OverallTime == apiCrews[i - 1].OverallTime)
                {
                    apiCrews[i].Rank = overallRank.ToString(CultureInfo.CurrentCulture) + "=";
                }
                else
                {
                    overallRank      = i + 1;
                    apiCrews[i].Rank = overallRank.ToString(CultureInfo.CurrentCulture);
                    if (i < apiCrews.Count - 1)
                    {
                        apiCrews[i].Rank += (apiCrews[i + 1].OverallTime == apiCrews[i].OverallTime ? "=" : String.Empty);
                    }
                }
            }

            return(apiCrews);
        }