public void Add(ImportResultModel model)
 {
     Rows       += model.Rows;
     Added      += model.Added;
     Updated    += model.Updated;
     ErrorCount += model.ErrorCount;
     Errors.AddRange(model.Errors);
 }
        public async Task <object> Import(CsvReader projectsCsvReader, CsvReader contestantsCsvReader, bool debug)
        {
            var projectsResult        = new ImportResultModel();
            var participantsResult    = new ImportResultModel();
            var participantsIdsToFind = new List <string>();
            var opResponse            = await GetOldPlatformApiResponse();

            var cats = await _catsRepo.GetAll();

            while (await projectsCsvReader.ReadAsync())
            {
                ExpandoObject recordEo   = projectsCsvReader.GetRecord <dynamic>();
                var           recordDict = recordEo.ToDictionary(kvp => kvp.Key, kvp => kvp.Value?.ToString());
                var           opApiObj   = opResponse.FirstOrDefault(p => p.Id == recordDict["Id"]);
                if (opApiObj == null)
                {
                    continue;
                }

                var project         = ProjectFrom(recordDict, opApiObj, cats);
                var existingProject = GetProjectCaching(project.OldPlatformId);
                if (existingProject == null)
                {
                    if (!debug)
                    {
                        project = await AddProject(project);
                    }
                    else
                    {
                        _projectsCache.Add(project);
                    }

                    projectsResult.Added++;
                }
                else
                {
                    project.IsInOpen = existingProject.IsInOpen;
                    var patchDiff = JsonPatchUtils.CreatePatch(existingProject, project);
                    SanitizePatchDocument(patchDiff);
                    if (!patchDiff.IsEmpty())
                    {
                        if (!debug)
                        {
                            patchDiff.ApplyTo(existingProject);
                        }

                        projectsResult.Updated++;
                    }
                    else
                    {
                        projectsResult.NotTouched++;
                    }
                }

                var contestantsIds = recordDict["Id [Contestants]"];
                participantsIdsToFind.AddRange(contestantsIds.Split(",", StringSplitOptions.RemoveEmptyEntries)
                                               .Select(id => id.Trim()));
            }

            participantsIdsToFind = participantsIdsToFind.Distinct().ToList();

            while (await contestantsCsvReader.ReadAsync())
            {
                ExpandoObject recordEo   = contestantsCsvReader.GetRecord <dynamic>();
                var           recordDict = recordEo.ToDictionary(kvp => kvp.Key, kvp => kvp.Value?.ToString());
                var           opId       = recordDict["Id"];
                if (!participantsIdsToFind.Contains(opId))
                {
                    continue;
                }

                var participant         = ParticipantFrom(recordDict);
                var projectIds          = recordDict["Id [Projects]"].Split(",", StringSplitOptions.RemoveEmptyEntries);
                var existingParticipant = GetParticipantCaching(participant.OldPlatformId);
                if (existingParticipant == null)
                {
                    if (!debug)
                    {
                        participant.User = await AddUserAsync(participant.User);

                        participant = await AddParticipant(participant);
                    }

                    participantsResult.Added++;
                }
                else
                {
                    participant.ActivationEmailSent = existingParticipant.ActivationEmailSent;
                    var patchDiff = JsonPatchUtils.CreatePatch(existingParticipant, participant);
                    SanitizePatchDocument(patchDiff);
                    if (!patchDiff.IsEmpty())
                    {
                        if (!debug)
                        {
                            patchDiff.ApplyTo(existingParticipant);
                        }

                        participantsResult.Updated++;
                    }
                    else
                    {
                        participantsResult.NotTouched++;
                    }

                    participant = existingParticipant;
                }

                foreach (var projectId in projectIds)
                {
                    participant.Projects ??= new();
                    if (participant.Projects.All(proj => proj.OldPlatformId != projectId))
                    {
                        var project = GetProjectCaching(projectId);
                        if (project == null)
                        {
                            participantsResult.Errors.Add(
                                $"required project with id {projectId} not found (for contestant with id: " + opId +
                                ")");
                        }
                        else
                        {
                            participant.Projects.Add(project);
                        }
                    }
                }
            }


            return(new { projectsResult, participantsResult });
        }