/// <summary>
        /// Check if revision is correct
        /// </summary>
        /// <param name="inputRevisionId"></param>
        /// <param name="taxonRevision"></param>
        /// <returns></returns>
        protected bool CheckRevisionValidity(string inputRevisionId, ITaxonRevision taxonRevision)
        {
            string errorMsg;
            bool   valid = true;

            if (taxonRevision.IsNull())
            {
                errorMsg = Resources.DyntaxaResource.RevisionAddInvalidRevisionErrorText;
                ModelState.AddModelError("", errorMsg);
                valid = false;
            }
            if (taxonRevision.IsNotNull() && !taxonRevision.Id.ToString().Equals(inputRevisionId))
            {
                errorMsg = Resources.DyntaxaResource.RevisionSharedNoValidRevisionIdErrorText;
                string propName  = string.Empty;
                string propValue = string.Empty;
                if (taxonRevision.IsNotNull())
                {
                    propName = ReflectionUtility.GetPropertyName(() => taxonRevision.Id);
                    PropertyInfo pi = taxonRevision.GetType().GetProperty(propName);
                    propValue = pi.GetValue(taxonRevision, null).ToString();
                    ModelState.AddModelError("", errorMsg + " " + propValue);
                }
                else
                {
                    ModelState.AddModelError("", errorMsg);
                }

                valid = false;
            }
            return(valid);
        }
        public RevisionTaxonInfoViewModel GetRevisionInfoViewModel(ITaxon revisionTaxon, ITaxonRevision taxonRevision)
        {
            RevisionTaxonInfoViewModel revisionTaxonInfoViewModel = new RevisionTaxonInfoViewModel();

            if (revisionTaxon.IsNotNull())
            {
                revisionTaxonInfoViewModel.CommonName = revisionTaxon.CommonName.IsNotEmpty()
                                                              ? revisionTaxon.CommonName
                                                              : string.Empty;
                revisionTaxonInfoViewModel.ScientificName    = revisionTaxon.ScientificName;
                revisionTaxonInfoViewModel.Category          = revisionTaxon.Category.Name;
                revisionTaxonInfoViewModel.CategorySortOrder = revisionTaxon.Category.SortOrder;
            }
            else
            {
                revisionTaxonInfoViewModel.CommonName        = string.Empty;
                revisionTaxonInfoViewModel.ScientificName    = string.Empty;
                revisionTaxonInfoViewModel.Category          = string.Empty;
                revisionTaxonInfoViewModel.CategorySortOrder = 0;
            }
            if (taxonRevision.IsNotNull())
            {
                revisionTaxonInfoViewModel.Id = taxonRevision.Id.ToString();
            }
            else
            {
                revisionTaxonInfoViewModel.Id = "0";
            }

            revisionTaxonInfoViewModel.RevisionText   = Resources.DyntaxaResource.SharedRevisionIdLabelText;
            revisionTaxonInfoViewModel.MainHeaderText = Resources.DyntaxaResource.RevisionListEventMainHeaderlText;

            return(revisionTaxonInfoViewModel);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="loggedInUser"></param>
        /// <param name="dyntaxaApplicationUserContext"></param>
        /// <param name="taxonRevision"></param>
        /// <param name="isTaxonInRevision"></param>
        /// <param name="revisionUsers"></param>
        /// <param name="allUsers"></param>
        /// <param name="roleId"></param>
        /// <returns></returns>
        public RevisionEditViewModel GetRevisionEditViewModel(
            IUserContext loggedInUser,
            IUserContext dyntaxaApplicationUserContext,
            ITaxonRevision taxonRevision,
            ITaxon taxon,
            bool isTaxonInRevision,
            IList <RevisionUserItemModelHelper> revisionUsers,
            IList <RevisionUserItemModelHelper> allUsers,
            int roleId)
        {
            RevisionEditViewModel model = new RevisionEditViewModel();

            if (loggedInUser.IsNotNull() && dyntaxaApplicationUserContext.IsNotNull())
            {
                // Set locale to logged in user.
                dyntaxaApplicationUserContext.Locale = loggedInUser.Locale;

                if (taxonRevision.IsNotNull())
                {
                    if (taxon.IsNotNull())
                    {
                        model.ExpectedStartDate             = taxonRevision.ExpectedStartDate;
                        model.ExpectedPublishingDate        = taxonRevision.ExpectedEndDate;
                        model.IsSpeciesFactPublished        = taxonRevision.IsSpeciesFactPublished;
                        model.IsReferenceRelationsPublished = taxonRevision.IsReferenceRelationsPublished;
                        model.GUID = taxonRevision.Guid;
                        model.RevisionReferencesList = new List <int>();
                        model.NoOfRevisionReferences = 0;
                        foreach (ReferenceRelation referenceRelation in taxonRevision.GetReferences(loggedInUser))
                        {
                            model.RevisionReferencesList.Add(referenceRelation.Id);
                            model.NoOfRevisionReferences++;
                        }

                        model.SelectedUserList = new List <RevisionUserItemModelHelper>();
                        model.UserList         = new List <RevisionUserItemModelHelper>();
                        foreach (RevisionUserItemModelHelper user in allUsers)
                        {
                            bool userAssigedToRevision = false;
                            foreach (RevisionUserItemModelHelper revisionUser in revisionUsers)
                            {
                                if (user.Id == revisionUser.Id)
                                {
                                    //We found a alreday assigned user
                                    userAssigedToRevision = true;
                                    break;
                                }
                            }

                            if (userAssigedToRevision)
                            {
                                model.SelectedUserList.Add(user);
                            }
                            else
                            {
                                model.UserList.Add(user);
                            }
                        }
                        string url = Resources.DyntaxaResource.SharedRevisionUserAdminLinkText;
                        model.RoleId        = roleId.ToString();
                        model.UserAdminLink = new LinkItem(LinkType.Url, LinkQuality.Automatic, url, userAdminRoleLink);

                        model.RevisionDescription = taxonRevision.Description;

                        // Get specices fact information
                        try
                        {
                            SpeciesFactModelManager speciesModel = new SpeciesFactModelManager(taxon, loggedInUser);
                            try
                            {
                                if (speciesModel.QualityStatus.IsNotNull())
                                {
                                    model.RevisionQualityId = speciesModel.QualityStatus.Id;
                                }
                                else if (speciesModel.QualityStatusList.IsNotNull() && speciesModel.QualityStatusList.Count > 1)
                                {
                                    model.RevisionQualityId = speciesModel.QualityStatusList.ElementAt(0).Id;
                                }
                                else
                                {
                                    model.RevisionQualityId = 0;
                                }

                                model.RevisionQualityList = new List <TaxonDropDownModelHelper>();
                                foreach (var status in speciesModel.QualityStatusList)
                                {
                                    model.RevisionQualityList.Add(new TaxonDropDownModelHelper(status.Id, status.Label));
                                }
                                model.RevisionQualityDescription = speciesModel.QualityDescription;
                            }
                            catch (Exception)
                            {
                                model.ErrorMessage = Resources.DyntaxaResource.SharedNotPossibleToReadSpeciesFactError;
                            }
                        }
                        catch (Exception)
                        {
                            model.ErrorMessage = Resources.DyntaxaResource.SharedNotPossibleToReadSpeciesFactError;
                        }

                        model.RevisionTaxonInfoViewModel = new RevisionTaxonInfoViewModel();

                        model.RevisionTaxonInfoViewModel.Id                = taxonRevision.Id.ToString();
                        model.RevisionTaxonInfoViewModel.CommonName        = taxon.CommonName.IsNotEmpty() ? taxon.CommonName : string.Empty;
                        model.RevisionTaxonInfoViewModel.ScientificName    = taxon.ScientificName;
                        model.RevisionTaxonInfoViewModel.Category          = taxon.Category.Name;
                        model.RevisionTaxonInfoViewModel.CategorySortOrder = taxon.Category.SortOrder;

                        model.RevisionTaxonInfoViewModel.RevisionText   = Resources.DyntaxaResource.SharedRevisionIdLabelText;
                        model.RevisionTaxonInfoViewModel.MainHeaderText = Resources.DyntaxaResource.RevisionEditMainHeaderFullText;

                        model.RevisionId          = taxonRevision.Id.ToString();
                        model.ShowFinalizeButton  = false;
                        model.ShowInitalizeButton = false;
                        model.ShowDeleteButton    = false;
                        ITaxon revisionTaxon = taxonRevision.RootTaxon;
                        int    state         = taxonRevision.State.Id;
                        if (state == (int)TaxonRevisionStateId.Created)
                        {
                            model.RevisionStatus      = Resources.DyntaxaResource.RevisionListSelectedRevisionStatusCreatedText;
                            model.ShowInitalizeButton = true;
                            model.IsTaxonInRevision   = revisionTaxon.IsInRevision;
                            model.ShowDeleteButton    = true;
                        }
                        else if (state == (int)TaxonRevisionStateId.Ongoing)
                        {
                            model.RevisionStatus     = Resources.DyntaxaResource.RevisionListSelectedRevisionStatusOngoingText;
                            model.ShowFinalizeButton = true;
                        }
                        else if (state == (int)TaxonRevisionStateId.Closed)
                        {
                            model.RevisionStatus = Resources.DyntaxaResource.RevisionListSelectedRevisionStatusClosedText;
                            model.ShowUpdateSpeciesFactButton        = !taxonRevision.IsSpeciesFactPublished;
                            model.ShowUpdateReferenceRelationsButton = !taxonRevision.IsReferenceRelationsPublished;
                        }
                        model.RevisionTaxonId = revisionTaxon.Id.ToString();

                        return(model);
                    }
                    else
                    {
                        model.ErrorMessage = Resources.DyntaxaResource.RevisonAddInvalidTaxonErrorText;
                    }
                }
                else
                {
                    model.ErrorMessage = Resources.DyntaxaResource.RevisionSharedNoValidRevisionIdErrorText + taxonRevision.Id + ".";
                }
            }
            else
            {
                model.ErrorMessage = Resources.DyntaxaResource.SharedInvalidUserContext + " " + Resources.DyntaxaResource.SharedInvalidApplicationUserContext;
            }
            return(model);
        }
        public RevisionEditViewModel ReloadRevisionEditViewModel(
            IUserContext userContext,
            IUserContext dyntaxaApplicationUserContext,
            ITaxon taxon,
            ITaxonRevision taxonRevision,
            RevisionEditViewModel model,
            IList <RevisionUserItemModelHelper> revisionUsers,
            IList <RevisionUserItemModelHelper> allUsers)
        {
            IUserContext loggedInUser = userContext;

            model.RevisionQualityList        = new List <TaxonDropDownModelHelper>();
            model.SelectedUserList           = new List <RevisionUserItemModelHelper>();
            model.UserList                   = new List <RevisionUserItemModelHelper>();
            model.RevisionReferencesList     = new List <int>();
            model.RevisionTaxonInfoViewModel = new RevisionTaxonInfoViewModel();
            if (loggedInUser.IsNotNull() && dyntaxaApplicationUserContext.IsNotNull())
            {
                if (taxonRevision.IsNotNull())
                {
                    foreach (ReferenceRelation referenceRelation in taxonRevision.GetReferences(userContext))
                    {
                        model.RevisionReferencesList.Add(referenceRelation.Id);
                    }
                }

                foreach (RevisionUserItemModelHelper user in allUsers)
                {
                    bool userAssigedToRevision = false;
                    if (revisionUsers.IsNotNull())
                    {
                        foreach (RevisionUserItemModelHelper revisionUser in revisionUsers)
                        {
                            if (user.Id == revisionUser.Id)
                            {
                                //We found a alreday assigned user
                                userAssigedToRevision = true;
                                break;
                            }
                        }
                    }
                    if (userAssigedToRevision)
                    {
                        model.SelectedUserList.Add(user);
                    }
                    else
                    {
                        model.UserList.Add(user);
                    }
                }

                if (taxon.IsNotNull())
                {
                    SpeciesFactModelManager speciesModel = new SpeciesFactModelManager(taxon, loggedInUser);
                    foreach (var status in speciesModel.QualityStatusList)
                    {
                        model.RevisionQualityList.Add(new TaxonDropDownModelHelper(status.Id, status.Label));
                    }
                }
                if (taxon.IsNotNull() && taxonRevision.IsNotNull())
                {
                    model.RevisionTaxonInfoViewModel = new RevisionTaxonInfoViewModel();

                    model.RevisionTaxonInfoViewModel.Id                = taxonRevision.Id.ToString();
                    model.RevisionTaxonInfoViewModel.CommonName        = taxon.CommonName.IsNotEmpty() ? taxon.CommonName : string.Empty;
                    model.RevisionTaxonInfoViewModel.ScientificName    = taxon.ScientificName;
                    model.RevisionTaxonInfoViewModel.Category          = taxon.Category.Name;
                    model.RevisionTaxonInfoViewModel.CategorySortOrder = taxon.Category.SortOrder;

                    model.RevisionTaxonInfoViewModel.RevisionText   = Resources.DyntaxaResource.SharedRevisionIdLabelText;
                    model.RevisionTaxonInfoViewModel.MainHeaderText = Resources.DyntaxaResource.RevisionEditMainHeaderFullText;
                }

                string url = Resources.DyntaxaResource.SharedRevisionUserAdminLinkText;
                model.UserAdminLink = new LinkItem(LinkType.Url, LinkQuality.Automatic, url, userAdminRoleLink);
            }
            else
            {
                model.ErrorMessage = Resources.DyntaxaResource.SharedInvalidUserContext + " " + Resources.DyntaxaResource.SharedInvalidApplicationUserContext;
            }
            return(model);
        }
        /// <summary>
        /// Get all taxa that are possible parents for this taxon.
        /// </summary>
        /// <param name="taxon">The taxon.</param>
        /// <param name="userContext">User context.</param>
        /// <param name="taxonRevision">Revision that this taxon belongs to.</param>
        /// <returns>List of taxa that are possible parent taxa.</returns>
        public static TaxonList GetTaxaPossibleParents(
            this ITaxon taxon,
            IUserContext userContext,
            ITaxonRevision taxonRevision)
        {
            ITaxonCategory genusTaxonCategory;
            ITaxonTreeNode revisionTaxonTree;
            TaxonList      parentTaxa, possibleParents, revisionTaxa;

            possibleParents = new TaxonList(true);
            if (taxonRevision.IsNotNull())
            {
                genusTaxonCategory = CoreData.TaxonManager.GetTaxonCategory(userContext, TaxonCategoryId.Genus);
                revisionTaxonTree  = taxonRevision.RootTaxon.GetChildTaxonTree(userContext, true);
                revisionTaxa       = revisionTaxonTree.GetChildTaxa();
                // Add revision root taxon if it doesn't exist in revisionTaxa list.
                if (!revisionTaxa.Exists(taxonRevision.RootTaxon))
                {
                    revisionTaxa.Add(taxonRevision.RootTaxon);
                }
                parentTaxa = new TaxonList();
                GetParentTaxa(revisionTaxonTree, taxon, parentTaxa);

                revisionTaxa.RemoveAll(x => parentTaxa.Contains(x));
                revisionTaxa.SortTaxonCategory();
                return(revisionTaxa);

                //foreach (ITaxon revisionTaxon in revisionTaxa)
                //{
                //    possibleParents.Merge(revisionTaxon);
                //    continue;
                //    // add all taxa that has IsTaxonomic = false to the list of possibleParents -- GuNy 2013-01-09
                //    if (!revisionTaxon.Category.IsTaxonomic && !parentTaxa.Exists(revisionTaxon))
                //    {
                //        possibleParents.Merge(revisionTaxon);
                //    }
                //    // all taxa that is below taxon.Category is removed
                //    else if ((revisionTaxon.Category.SortOrder < taxon.Category.SortOrder) &&
                //        !parentTaxa.Exists(revisionTaxon))
                //    {
                //        if (genusTaxonCategory.SortOrder < taxon.Category.SortOrder)
                //        {
                //            // Limit possible parents to max genus taxon category.
                //            // If the taxon you want to move is below genus then you can only
                //            // move it to taxa that is of genus category or below.
                //            if (genusTaxonCategory.SortOrder <= revisionTaxon.Category.SortOrder)
                //            {
                //                possibleParents.Merge(revisionTaxon);
                //            }
                //        }
                //        else
                //        {
                //            // Include all possible parents from higher taxon categories.
                //            possibleParents.Merge(revisionTaxon);
                //        }
                //    }
                //}
                //possibleParents.SortTaxonCategory();
            }

            return(possibleParents);
        }