internal static LandedTitleEntity ToEntity(this IEnumerable <LandedTitle> landedTitles)
        {
            LandedTitleEntity landedTitleEntity = landedTitles.FirstOrDefault(x => landedTitles.All(y => y.Id != x.ParentId)).ToEntity();

            AddChildrenToEntityRecursively(landedTitleEntity, landedTitles);

            return(landedTitleEntity);
        }
        private static void AddChildrenToEntityRecursively(LandedTitleEntity landedTitleEntity, IEnumerable <LandedTitle> landedTitles)
        {
            foreach (LandedTitle landedTitle in landedTitles.Where(x => x.ParentId == landedTitleEntity.Id))
            {
                LandedTitleEntity child = landedTitle.ToEntity();
                landedTitleEntity.Children.Add(child);

                AddChildrenToEntityRecursively(child, landedTitles);
            }
        }
        internal static IEnumerable <LandedTitle> ToDomainModelsRecursively(this LandedTitleEntity landedTitleEntity)
        {
            List <LandedTitle> landedTitles = new List <LandedTitle>();

            landedTitles.Add(landedTitleEntity.ToDomainModel());

            foreach (LandedTitleEntity child in landedTitleEntity.Children)
            {
                landedTitles.AddRange(child.ToDomainModelsRecursively());
            }

            return(landedTitles);
        }
        /// <summary>
        /// Converts the domain models into entities.
        /// </summary>
        /// <returns>The entities.</returns>
        /// <param name="landedTitles">LandedTitles.</param>
        internal static IEnumerable <LandedTitleEntity> ToEntities(this IEnumerable <LandedTitle> landedTitles)
        {
            IEnumerable <LandedTitle> roots = landedTitles.Where(x => landedTitles.All(y => y.Id != x.ParentId));
            List <LandedTitleEntity>  landedTitleEntities = new List <LandedTitleEntity>();

            foreach (LandedTitle root in roots)
            {
                LandedTitleEntity landedTitleEntity = root.ToEntity();

                AddChildrenToEntityRecursively(landedTitleEntity, landedTitles);

                landedTitleEntities.Add(landedTitleEntity);
            }

            return(landedTitleEntities);
        }
        /// <summary>
        /// Converts the domain model into an entity.
        /// </summary>
        /// <returns>The entity.</returns>
        /// <param name="landedTitle">LandedTitle.</param>
        internal static LandedTitleEntity ToEntity(this LandedTitle landedTitle)
        {
            LandedTitleEntity landedTitleEntity = new LandedTitleEntity
            {
                Id       = landedTitle.Id,
                ParentId = landedTitle.ParentId,
                //Children = landedTitle.Children.ToEntities().ToList(),
                FemaleNames               = landedTitle.FemaleNames,
                MaleNames                 = landedTitle.MaleNames,
                HolySites                 = landedTitle.HolySites,
                DynamicNames              = landedTitle.DynamicNames,
                PrimaryColour             = new int[] { landedTitle.PrimaryColour.R, landedTitle.PrimaryColour.G, landedTitle.PrimaryColour.B },
                SecondaryColour           = new int[] { landedTitle.SecondaryColour.R, landedTitle.SecondaryColour.G, landedTitle.SecondaryColour.B },
                CultureId                 = landedTitle.CultureId,
                ControlledReligionId      = landedTitle.ControlledReligionId,
                GraphicalCulture          = landedTitle.GraphicalCulture,
                MercenaryType             = landedTitle.MercenaryType,
                ReligionId                = landedTitle.ReligionId,
                TitleFormOfAddress        = landedTitle.TitleFormOfAddress,
                TitleLocalisationId       = landedTitle.TitleLocalisationId,
                TitleLocalisationFemaleId = landedTitle.TitleLocalisationFemaleId,
                TitleLocalisationPrefixId = landedTitle.TitleLocalisationPrefixId,
                TitleNameTierId           = landedTitle.TitleNameTierId,
                AllowsAssimilation        = landedTitle.AllowsAssimilation,
                CreationRequiresCapital   = landedTitle.CreationRequiresCapital,
                TitleContainsCapital      = landedTitle.TitleContainsCapital,
                HasPurpleBornHeirs        = landedTitle.HasPurpleBornHeirs,
                HasTopDeJureCapital       = landedTitle.HasTopDeJureCapital,
                IsCaliphate               = landedTitle.IsCaliphate,
                IsHolyOrder               = landedTitle.IsHolyOrder,
                IsIndependent             = landedTitle.IsIndependent,
                IsLandless                = landedTitle.IsLandless,
                IsMercenaryGroup          = landedTitle.IsMercenaryGroup,
                IsPirate                 = landedTitle.IsPirate,
                IsPrimaryTitle           = landedTitle.IsPrimaryTitle,
                IsTribe                  = landedTitle.IsTribe,
                UseDynastyTitleNames     = landedTitle.UseDynastyTitleNames,
                UseShortName             = landedTitle.UseShortName,
                StrengthGrowthPerCentury = landedTitle.StrengthGrowthPerCentury,
                CapitalId                = landedTitle.CapitalId,
                Dignity                  = landedTitle.Dignity,
                MonthlyIncome            = landedTitle.MonthlyIncome
            };

            return(landedTitleEntity);
        }
        /// <summary>
        /// Converts a <see cref="LandedTitleEntity"/> data object into a <see cref="LandedTitle"/> domain model.
        /// </summary>
        /// <returns>The <see cref="LandedTitle"/> domain model.</returns>
        /// <param name="dataObject">The <see cref="LandedTitleEntity"/> data object.</param>
        internal static LandedTitle ToDomainModel(this LandedTitleEntity dataObject)
        {
            LandedTitle domainModel = new LandedTitle
            {
                Id       = dataObject.Id,
                ParentId = dataObject.ParentId,
                //Children = landedTitleEntity.Children.ToDomainModels().ToList(),
                FemaleNames               = dataObject.FemaleNames,
                MaleNames                 = dataObject.MaleNames,
                HolySites                 = dataObject.HolySites,
                DynamicNames              = dataObject.DynamicNames.ToDictionary(kvp => kvp.Key, kvp => kvp.Value),
                PrimaryColour             = GetColorFromIntArray(dataObject.PrimaryColour),
                SecondaryColour           = GetColorFromIntArray(dataObject.SecondaryColour),
                ControlledReligionId      = dataObject.ControlledReligionId,
                CultureId                 = dataObject.CultureId,
                GraphicalCulture          = dataObject.GraphicalCulture,
                MercenaryType             = dataObject.MercenaryType,
                ReligionId                = dataObject.ReligionId,
                TitleFormOfAddress        = dataObject.TitleFormOfAddress,
                TitleLocalisationId       = dataObject.TitleLocalisationId,
                TitleLocalisationFemaleId = dataObject.TitleLocalisationFemaleId,
                TitleLocalisationPrefixId = dataObject.TitleLocalisationPrefixId,
                TitleNameTierId           = dataObject.TitleNameTierId,
                AllowsAssimilation        = dataObject.AllowsAssimilation,
                CreationRequiresCapital   = dataObject.CreationRequiresCapital,
                TitleContainsCapital      = dataObject.TitleContainsCapital,
                HasPurpleBornHeirs        = dataObject.HasPurpleBornHeirs,
                HasTopDeJureCapital       = dataObject.HasTopDeJureCapital,
                IsCaliphate               = dataObject.IsCaliphate,
                IsHolyOrder               = dataObject.IsHolyOrder,
                IsIndependent             = dataObject.IsIndependent,
                IsLandless                = dataObject.IsLandless,
                IsMercenaryGroup          = dataObject.IsMercenaryGroup,
                IsPirate                 = dataObject.IsPirate,
                IsPrimaryTitle           = dataObject.IsPrimaryTitle,
                IsTribe                  = dataObject.IsTribe,
                UseDynastyTitleNames     = dataObject.UseDynastyTitleNames,
                UseShortName             = dataObject.UseShortName,
                StrengthGrowthPerCentury = dataObject.StrengthGrowthPerCentury,
                CapitalId                = dataObject.CapitalId,
                Dignity                  = dataObject.Dignity,
                MonthlyIncome            = dataObject.MonthlyIncome
            };

            return(domainModel);
        }
 public LandedTitleDefinition()
 {
     Entity = new LandedTitleEntity();
 }