private HudLayoutInfo GetHudLayoutInfo(List <HudSavedLayout> layouts, HudViewType hudViewType)
        {
            var masterLayout = layouts.FirstOrDefault();

            if (masterLayout == null)
            {
                return(null);
            }

            var tableDescription = GetTableDescription(masterLayout.LayoutId);

            var sameDefault =
                defaultLayouts.FirstOrDefault(
                    l => l.TableType == tableDescription.TableType && l.HudViewType == hudViewType);

            if (settingsService.GetSettings().GeneralSettings.HudViewMode != (int)hudViewType &&
                hudViewType != HudViewType.Plain)
            {
                return(null);
            }

            var filteredLayouts = hudViewType == HudViewType.Plain
                                      ? layouts.Where(
                l =>
                GetTableDescription(l.LayoutId).PokerSite != EnumPokerSites.Ignition &&
                GetTableDescription(l.LayoutId).PokerSite != EnumPokerSites.Bodog)
                                  .ToList()
                                      : layouts.Where(
                l =>
                GetTableDescription(l.LayoutId).PokerSite == EnumPokerSites.Ignition ||
                GetTableDescription(l.LayoutId).PokerSite == EnumPokerSites.Bodog)
                                  .ToList();

            if (filteredLayouts.Count == 0)
            {
                return(null);
            }

            var newLayout = new HudLayoutInfo();

            newLayout.TableType             = tableDescription.TableType;
            newLayout.HudBumperStickerTypes = masterLayout.HudBumperStickerTypes.Select(s => s.Clone()).ToList();
            newLayout.HudPlayerTypes        = masterLayout.HudPlayerTypes.Select(p => p.Clone()).ToList();

            newLayout.HudStats = masterLayout.HudStats.Select(s =>
            {
                var statInfoBreak = s as StatInfoBreak;

                if (statInfoBreak != null)
                {
                    return(statInfoBreak.Clone());
                }

                return(s.Clone());
            }).ToList();

            newLayout.IsDefault       = false;
            newLayout.HudViewType     = hudViewType;
            newLayout.UiPositionsInfo = sameDefault?.UiPositionsInfo.Select(p => p.Clone()).ToList();
            newLayout.Name            = masterLayout.Name;

            foreach (var hudSavedLayout in filteredLayouts)
            {
                var newPositionInfo = new HudPositionsInfo();

                newPositionInfo.GameType  = GetTableDescription(hudSavedLayout.LayoutId).GameType;
                newPositionInfo.PokerSite = GetTableDescription(hudSavedLayout.LayoutId).PokerSite;

                newPositionInfo.HudPositions =
                    hudSavedLayout.HudPositions.Where(
                        p => p.HudType == (hudViewType == HudViewType.Plain ? HudType.Plain : HudType.Default))
                    .Select(
                        p => new HudPositionInfo {
                    Position = new Point(p.Position.X, p.Position.Y), Seat = p.Seat
                })
                    .ToList();

                if (newPositionInfo.HudPositions.Any())
                {
                    newLayout.HudPositionsInfo.Add(newPositionInfo);
                }
            }

            if (sameDefault != null)
            {
                foreach (var defaultPosInfo in sameDefault.HudPositionsInfo)
                {
                    if (
                        newLayout.HudPositionsInfo.Any(
                            p => p.GameType == defaultPosInfo.GameType && p.PokerSite == defaultPosInfo.PokerSite))
                    {
                        continue;
                    }
                    newLayout.HudPositionsInfo.Add(defaultPosInfo.Clone());
                }
            }

            if (HudObjectsComparer.AreEquals(newLayout, sameDefault))
            {
                return(null);
            }

            if (HudObjectsComparer.AreEqualsExceptPositions(newLayout, sameDefault))
            {
                sameDefault.HudPositionsInfo = newLayout.HudPositionsInfo.Select(p => p.Clone()).ToList();
                return(sameDefault);
            }

            return(newLayout.HudPositionsInfo.Any() ? newLayout : null);
        }
        public override void Up()
        {
            try
            {
                LogProvider.Log.Info("Preparing migration #14");

                defaultLayouts = GetDefaultLayouts();

                var oldLayouts = LoadOldLayouts(Path.Combine(StringFormatter.GetAppDataFolderPath(), "Layouts.xml"));

                if (oldLayouts == null)
                {
                    return;
                }

                while (oldLayouts.Layouts.Count > 0)
                {
                    var currentLayout = oldLayouts.Layouts[0];

                    var tableDescription = hashTable.FirstOrDefault(h => h.Hash == currentLayout.LayoutId);

                    if (tableDescription == null)
                    {
                        oldLayouts.Layouts.RemoveAt(0);
                        continue;
                    }

                    var grouppedLayouts =
                        oldLayouts.Layouts.Where(
                            l =>
                            GetTableDescription(l.LayoutId).TableType == tableDescription?.TableType &&
                            l.HudStats.Any() &&
                            HudObjectsComparer.AreEquals(
                                l.HudBumperStickerTypes,
                                currentLayout.HudBumperStickerTypes) &&
                            HudObjectsComparer.AreEquals(l.HudPlayerTypes, currentLayout.HudPlayerTypes) &&
                            HudObjectsComparer.AreEquals(l.HudStats, currentLayout.HudStats)).ToList();

                    foreach (var hudViewType in Enum.GetValues(typeof(HudViewType)).OfType <HudViewType>())
                    {
                        var newLayout = GetHudLayoutInfo(grouppedLayouts, hudViewType);

                        if (newLayout == null)
                        {
                            continue;
                        }

                        if (!newLayout.IsDefault)
                        {
                            var i = 1;

                            string hudTypeName = string.Empty;

                            if (hudViewType != HudViewType.Plain)
                            {
                                hudTypeName = $" {hudViewType}";
                            }

                            string tableTypeName = string.Empty;

                            if (!newLayout.Name.Contains(CommonResourceManager.Instance.GetEnumResource(tableDescription.TableType)))
                            {
                                tableTypeName = $" {CommonResourceManager.Instance.GetEnumResource(tableDescription.TableType)}";
                            }

                            var layoutName = $"{newLayout.Name}{tableTypeName}{hudTypeName}";

                            while (hudLayoutsService.HudLayoutMappings.Mappings.Any(f => f.Name == layoutName))
                            {
                                layoutName = $"{newLayout.Name}{tableTypeName}{hudTypeName} {i}";
                                i++;
                            }

                            newLayout.Name = layoutName;
                        }
                        else
                        {
                            var def = defaultLayouts.FirstOrDefault(l => l.Name == newLayout.Name);
                            if (def != null)
                            {
                                defaultLayouts[defaultLayouts.IndexOf(def)] = newLayout;
                            }
                        }

                        var layoutFileName = Save(newLayout);

                        foreach (var selected in grouppedLayouts)
                        {
                            var table = hashTable.FirstOrDefault(h => h.Hash == selected.LayoutId);

                            if (table == null)
                            {
                                continue;
                            }

                            var mapping = new HudLayoutMapping
                            {
                                FileName    = Path.GetFileName(layoutFileName),
                                GameType    = table.GameType,
                                TableType   = table.TableType,
                                PokerSite   = table.PokerSite,
                                IsDefault   = false,
                                IsSelected  = selected.IsDefault,
                                Name        = newLayout.Name,
                                HudViewType = newLayout.HudViewType
                            };

                            if (mapping.IsSelected &&
                                hudLayoutsService.HudLayoutMappings.Mappings.Any(
                                    m =>
                                    m.IsSelected && m.PokerSite == table.PokerSite && m.TableType == table.TableType &&
                                    m.GameType == table.GameType))
                            {
                                mapping.IsSelected = false;
                            }

                            hudLayoutsService.HudLayoutMappings.Mappings.Add(mapping);
                        }
                    }

                    oldLayouts.Layouts.RemoveAll(
                        l =>
                        GetTableDescription(l.LayoutId).TableType == tableDescription.TableType &&
                        HudObjectsComparer.AreEquals(l.HudBumperStickerTypes, currentLayout.HudBumperStickerTypes) &&
                        HudObjectsComparer.AreEquals(l.HudPlayerTypes, currentLayout.HudPlayerTypes) &&
                        HudObjectsComparer.AreEquals(l.HudStats, currentLayout.HudStats));
                }

                hudLayoutsService.SaveLayoutMappings();

                LogProvider.Log.Info("Migration #14 executed.");
            }
            catch (Exception e)
            {
                LogProvider.Log.Error(this, $"Migration #14 failed.", e);
            }
        }