/// <summary>
 /// c_blist packet
 /// </summary>
 /// <param name="cbListPacket"></param>
 public void RefreshBazarList(CbListPacket cbListPacket)
 {
     if (ServerManager.Instance.InShutdown)
     {
         return;
     }
     SpinWait.SpinUntil(() => !ServerManager.Instance.InBazaarRefreshMode);
     Session.SendPacket(UserInterfaceHelper.Instance.GenerateRcbList(cbListPacket));
 }
        public string GenerateRcbList(CbListPacket packet)
        {
            string itembazar = string.Empty;

            List <string> itemssearch = packet.ItemVNumFilter == "0"
                ? new List <string>()
                : packet.ItemVNumFilter.Split(' ').ToList();
            List <BazaarItemLink> bzlist = new List <BazaarItemLink>();

            BazaarItemLink[] billist = new BazaarItemLink[ServerManager.Instance.BazaarList.Count + 20];
            ServerManager.Instance.BazaarList.CopyTo(billist);
            foreach (BazaarItemLink bz in billist)
            {
                if (bz?.Item == null)
                {
                    continue;
                }

                switch (packet.TypeFilter)
                {
                case BazaarListType.Weapon:
                    if (bz.Item.Item.Type == InventoryType.Equipment && bz.Item.Item.ItemType == ItemType.Weapon)
                    {
                        if (packet.SubTypeFilter == 0 ||
                            (bz.Item.Item.Class + 1 >> packet.SubTypeFilter & 1) == 1)
                        {
                            if (packet.LevelFilter == 0 || packet.LevelFilter == 11 && bz.Item.Item.IsHeroic ||
                                bz.Item.Item.LevelMinimum < packet.LevelFilter * 10 + 1 &&
                                bz.Item.Item.LevelMinimum >= packet.LevelFilter * 10 - 9)     //Level filter
                            {
                                if (packet.RareFilter == 0 || packet.RareFilter == (bz.Item.Rare + 1))
                                {
                                    if (packet.UpgradeFilter == 0 || packet.UpgradeFilter == (bz.Item.Upgrade + 1))
                                    {
                                        bzlist.Add(bz);
                                    }
                                }
                            }
                        }
                    }

                    break;

                case BazaarListType.Armor:
                    if (bz.Item.Item.Type == InventoryType.Equipment && bz.Item.Item.ItemType == ItemType.Armor)
                    {
                        if (packet.SubTypeFilter == 0 ||
                            (bz.Item.Item.Class + 1 >> packet.SubTypeFilter & 1) == 1)
                        {
                            if (packet.LevelFilter == 0 || packet.LevelFilter == 11 && bz.Item.Item.IsHeroic ||
                                bz.Item.Item.LevelMinimum < packet.LevelFilter * 10 + 1 &&
                                bz.Item.Item.LevelMinimum >= packet.LevelFilter * 10 - 9)     //Level filter
                            {
                                if (packet.RareFilter == 0 || packet.RareFilter == (bz.Item.Rare + 1))
                                {
                                    if (packet.UpgradeFilter == 0 || packet.UpgradeFilter == (bz.Item.Upgrade + 1))
                                    {
                                        bzlist.Add(bz);
                                    }
                                }
                            }
                        }
                    }

                    break;

                case BazaarListType.Equipment:
                    if (bz.Item.Item.Type == InventoryType.Equipment && bz.Item.Item.ItemType == ItemType.Fashion)
                    {
                        if (packet.SubTypeFilter == 0 ||
                            packet.SubTypeFilter == 2 && bz.Item.Item.EquipmentSlot == EquipmentType.Mask ||
                            packet.SubTypeFilter == 1 && bz.Item.Item.EquipmentSlot == EquipmentType.Hat ||
                            packet.SubTypeFilter == 6 && bz.Item.Item.EquipmentSlot == EquipmentType.CostumeHat ||
                            packet.SubTypeFilter == 5 && bz.Item.Item.EquipmentSlot == EquipmentType.CostumeSuit ||
                            packet.SubTypeFilter == 3 && bz.Item.Item.EquipmentSlot == EquipmentType.Gloves ||
                            packet.SubTypeFilter == 4 && bz.Item.Item.EquipmentSlot == EquipmentType.Boots)
                        {
                            if (packet.LevelFilter == 0 || packet.LevelFilter == 11 && bz.Item.Item.IsHeroic ||
                                bz.Item.Item.LevelMinimum < packet.LevelFilter * 10 + 1 &&
                                bz.Item.Item.LevelMinimum >= packet.LevelFilter * 10 - 9)     //Level filter
                            {
                                bzlist.Add(bz);
                            }
                        }
                    }

                    break;

                case BazaarListType.Jewelery:
                    if (bz.Item.Item.Type == InventoryType.Equipment && bz.Item.Item.ItemType == ItemType.Jewelery)
                    {
                        if (packet.SubTypeFilter == 0 ||
                            packet.SubTypeFilter == 2 && bz.Item.Item.EquipmentSlot == EquipmentType.Ring ||
                            packet.SubTypeFilter == 1 && bz.Item.Item.EquipmentSlot == EquipmentType.Necklace ||
                            packet.SubTypeFilter == 5 && bz.Item.Item.EquipmentSlot == EquipmentType.Amulet ||
                            packet.SubTypeFilter == 3 && bz.Item.Item.EquipmentSlot == EquipmentType.Bracelet ||
                            packet.SubTypeFilter == 4 &&
                            (bz.Item.Item.EquipmentSlot == EquipmentType.Fairy ||
                             bz.Item.Item.ItemType == ItemType.Box && bz.Item.Item.ItemSubType == 5))
                        {
                            if (packet.LevelFilter == 0 || packet.LevelFilter == 11 && bz.Item.Item.IsHeroic ||
                                bz.Item.Item.LevelMinimum < packet.LevelFilter * 10 + 1 &&
                                bz.Item.Item.LevelMinimum >= packet.LevelFilter * 10 - 9)     //Level filter
                            {
                                bzlist.Add(bz);
                            }
                        }
                    }

                    break;

                case BazaarListType.Specialist:
                    if (bz.Item.Item.Type == InventoryType.Equipment)
                    {
                        if (bz.Item.Item.ItemType == ItemType.Box && bz.Item.Item.ItemSubType == 2)
                        {
                            if (bz.Item is BoxInstance boxInstance)
                            {
                                if (packet.SubTypeFilter == 0)
                                {
                                    if (packet.LevelFilter == 0 ||
                                        ((BoxInstance)bz.Item).SpLevel < packet.LevelFilter * 10 + 1 &&
                                        ((BoxInstance)bz.Item).SpLevel >= packet.LevelFilter * 10 - 9)
                                    {
                                        if (packet.UpgradeFilter == 0 ||
                                            packet.UpgradeFilter == (bz.Item.Upgrade + 1))
                                        {
                                            if (packet.SubTypeFilter == 0 ||
                                                packet.SubTypeFilter == 1 &&
                                                ((BoxInstance)bz.Item).HoldingVNum == 0 ||
                                                packet.SubTypeFilter == 2 &&
                                                ((BoxInstance)bz.Item).HoldingVNum != 0)
                                            {
                                                bzlist.Add(bz);
                                            }
                                        }
                                    }
                                }
                                else if (boxInstance.HoldingVNum == 0)
                                {
                                    if (packet.SubTypeFilter == 1)
                                    {
                                        if (packet.LevelFilter == 0 ||
                                            ((BoxInstance)bz.Item).SpLevel < packet.LevelFilter * 10 + 1 &&
                                            ((BoxInstance)bz.Item).SpLevel >= packet.LevelFilter * 10 - 9)
                                        {
                                            if (packet.UpgradeFilter == 0 ||
                                                packet.UpgradeFilter == (bz.Item.Upgrade + 1))
                                            {
                                                if (packet.SubTypeFilter == 0 ||
                                                    packet.SubTypeFilter == 1 &&
                                                    ((BoxInstance)bz.Item).HoldingVNum == 0 ||
                                                    packet.SubTypeFilter == 2 &&
                                                    ((BoxInstance)bz.Item).HoldingVNum != 0)
                                                {
                                                    bzlist.Add(bz);
                                                }
                                            }
                                        }
                                    }
                                }
                                else if (packet.SubTypeFilter == 2 &&
                                         ServerManager.Instance.GetItem(boxInstance.HoldingVNum).Morph == 10 ||
                                         packet.SubTypeFilter == 3 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 11 ||
                                         packet.SubTypeFilter == 4 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 2 ||
                                         packet.SubTypeFilter == 5 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 3 ||
                                         packet.SubTypeFilter == 6 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 13 ||
                                         packet.SubTypeFilter == 7 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 5 ||
                                         packet.SubTypeFilter == 8 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 12 ||
                                         packet.SubTypeFilter == 9 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 4 ||
                                         packet.SubTypeFilter == 10 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 7 ||
                                         packet.SubTypeFilter == 11 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 15 ||
                                         packet.SubTypeFilter == 12 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 6 ||
                                         packet.SubTypeFilter == 13 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 14 ||
                                         packet.SubTypeFilter == 14 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 9 ||
                                         packet.SubTypeFilter == 15 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 8 ||
                                         packet.SubTypeFilter == 16 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 1 ||
                                         packet.SubTypeFilter == 17 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 16 ||
                                         packet.SubTypeFilter == 18 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 17 ||
                                         packet.SubTypeFilter == 19 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 18 ||
                                         packet.SubTypeFilter == 20 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 19 ||
                                         packet.SubTypeFilter == 21 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 20 ||
                                         packet.SubTypeFilter == 22 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 21 ||
                                         packet.SubTypeFilter == 23 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 22 ||
                                         packet.SubTypeFilter == 24 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 23 ||
                                         packet.SubTypeFilter == 25 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 24 ||
                                         packet.SubTypeFilter == 26 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 25 ||
                                         packet.SubTypeFilter == 27 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 26 ||
                                         packet.SubTypeFilter == 28 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 27 ||
                                         packet.SubTypeFilter == 29 && ServerManager.Instance
                                         .GetItem(boxInstance.HoldingVNum).Morph == 28)
                                {
                                    if (packet.LevelFilter == 0 ||
                                        ((BoxInstance)bz.Item).SpLevel < packet.LevelFilter * 10 + 1 &&
                                        ((BoxInstance)bz.Item).SpLevel >= packet.LevelFilter * 10 - 9)
                                    {
                                        if (packet.UpgradeFilter == 0 ||
                                            packet.UpgradeFilter == (bz.Item.Upgrade + 1))
                                        {
                                            if (packet.SubTypeFilter == 0 ||
                                                packet.SubTypeFilter == 1 &&
                                                ((BoxInstance)bz.Item).HoldingVNum == 0 ||
                                                packet.SubTypeFilter >= 2 &&
                                                ((BoxInstance)bz.Item).HoldingVNum != 0)
                                            {
                                                bzlist.Add(bz);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    break;

                case BazaarListType.Pet:
                    if (bz.Item.Item.Type == InventoryType.Equipment)
                    {
                        if (bz.Item.Item.ItemType == ItemType.Box && bz.Item.Item.ItemSubType == 0)
                        {
                            if (bz.Item is BoxInstance boxinstanced &&
                                (packet.LevelFilter == 0 || boxinstanced.SpLevel < packet.LevelFilter * 10 + 1 &&
                                 boxinstanced.SpLevel >= packet.LevelFilter * 10 - 9))
                            {
                                if (packet.SubTypeFilter == 0 ||
                                    packet.SubTypeFilter == 1 && ((BoxInstance)bz.Item).HoldingVNum == 0 ||
                                    packet.SubTypeFilter == 2 && ((BoxInstance)bz.Item).HoldingVNum != 0)
                                {
                                    bzlist.Add(bz);
                                }
                            }
                        }
                    }

                    break;

                case BazaarListType.Npc:
                    if (bz.Item.Item.Type == InventoryType.Equipment)
                    {
                        if (bz.Item.Item.ItemType == ItemType.Box && bz.Item.Item.ItemSubType == 1)
                        {
                            if (bz.Item is BoxInstance box &&
                                (packet.LevelFilter == 0 || box.SpLevel < packet.LevelFilter * 10 + 1 &&
                                 box.SpLevel >= packet.LevelFilter * 10 - 9))
                            {
                                if (packet.SubTypeFilter == 0 ||
                                    packet.SubTypeFilter == 1 && ((BoxInstance)bz.Item).HoldingVNum == 0 ||
                                    packet.SubTypeFilter == 2 && ((BoxInstance)bz.Item).HoldingVNum != 0)
                                {
                                    bzlist.Add(bz);
                                }
                            }
                        }
                    }

                    break;

                case BazaarListType.Shell:
                    if (bz.Item.Item.Type == InventoryType.Equipment)
                    {
                        if (bz.Item.Item.ItemType == ItemType.Shell)
                        {
                            if (packet.SubTypeFilter == 0 ||
                                bz.Item.Item.ItemSubType == (bz.Item.Item.ItemSubType + 1))
                            {
                                if (packet.RareFilter == 0 || packet.RareFilter == (bz.Item.Rare + 1))
                                {
                                    if (bz.Item is BoxInstance box &&
                                        (packet.LevelFilter == 0 || box.SpLevel < packet.LevelFilter * 10 + 1 &&
                                         box.SpLevel >= packet.LevelFilter * 10 - 9))
                                    {
                                        bzlist.Add(bz);
                                    }
                                }
                            }
                        }
                    }

                    break;

                case BazaarListType.Main:
                    if (bz.Item.Item.Type == InventoryType.Main)
                    {
                        if (packet.SubTypeFilter == 0 ||
                            packet.SubTypeFilter == 1 && bz.Item.Item.ItemType == ItemType.Main ||
                            packet.SubTypeFilter == 2 && bz.Item.Item.ItemType == ItemType.Upgrade ||
                            packet.SubTypeFilter == 3 && bz.Item.Item.ItemType == ItemType.Production ||
                            packet.SubTypeFilter == 4 && bz.Item.Item.ItemType == ItemType.Special ||
                            packet.SubTypeFilter == 5 && bz.Item.Item.ItemType == ItemType.Potion ||
                            packet.SubTypeFilter == 6 && bz.Item.Item.ItemType == ItemType.Event)
                        {
                            bzlist.Add(bz);
                        }
                    }

                    break;

                case BazaarListType.Usable:
                    if (bz.Item.Item.Type == InventoryType.Etc)
                    {
                        if (packet.SubTypeFilter == 0 ||
                            packet.SubTypeFilter == 1 && bz.Item.Item.ItemType == ItemType.Food ||
                            packet.SubTypeFilter == 2 && bz.Item.Item.ItemType == ItemType.Snack ||
                            packet.SubTypeFilter == 3 && bz.Item.Item.ItemType == ItemType.Magical ||
                            packet.SubTypeFilter == 4 && bz.Item.Item.ItemType == ItemType.Part ||
                            packet.SubTypeFilter == 5 && bz.Item.Item.ItemType == ItemType.Teacher ||
                            packet.SubTypeFilter == 6 && bz.Item.Item.ItemType == ItemType.Sell)
                        {
                            bzlist.Add(bz);
                        }
                    }

                    break;

                case BazaarListType.Other:
                    if (bz.Item.Item.Type == InventoryType.Equipment)
                    {
                        if (bz.Item.Item.ItemType == ItemType.Box && !bz.Item.Item.Flag9)
                        {
                            bzlist.Add(bz);
                        }
                    }

                    break;

                case BazaarListType.Vehicle:
                    if (bz.Item.Item.ItemType == ItemType.Box && bz.Item.Item.ItemSubType == 4)
                    {
                        if (bz.Item is BoxInstance box &&
                            (packet.SubTypeFilter == 0 || packet.SubTypeFilter == 1 && box.HoldingVNum == 0 ||
                             packet.SubTypeFilter == 2 && box.HoldingVNum != 0))
                        {
                            bzlist.Add(bz);
                        }
                    }

                    break;

                default:
                    bzlist.Add(bz);
                    break;
                }
            }

            List <BazaarItemLink> bzlistsearched =
                bzlist.Where(s => itemssearch.Contains(s.Item.ItemVNum.ToString())).ToList();

            //price up price down quantity up quantity down
            List <BazaarItemLink> definitivelist = itemssearch.Any() ? bzlistsearched : bzlist;

            switch (packet.OrderFilter)
            {
            case 0:
                definitivelist = definitivelist.OrderBy(s => s.Item.Item.Name).ThenBy(s => s.BazaarItem.Price)
                                 .ToList();
                break;

            case 1:
                definitivelist = definitivelist.OrderBy(s => s.Item.Item.Name)
                                 .ThenByDescending(s => s.BazaarItem.Price).ToList();
                break;

            case 2:
                definitivelist = definitivelist.OrderBy(s => s.Item.Item.Name).ThenBy(s => s.BazaarItem.Amount)
                                 .ToList();
                break;

            case 3:
                definitivelist = definitivelist.OrderBy(s => s.Item.Item.Name)
                                 .ThenByDescending(s => s.BazaarItem.Amount).ToList();
                break;

            default:
                definitivelist = definitivelist.OrderBy(s => s.Item.Item.Name).ToList();
                break;
            }

            foreach (BazaarItemLink bzlink in definitivelist
                     .Where(s => (s.BazaarItem.DateStart.AddHours(s.BazaarItem.Duration) - DateTime.Now).TotalMinutes > 0 &&
                            s.Item.Amount > 0).Skip(packet.Index * 50).Take(50))
            {
                long time = (long)(bzlink.BazaarItem.DateStart.AddHours(bzlink.BazaarItem.Duration) - DateTime.Now)
                            .TotalMinutes;
                string info = string.Empty;
                if (bzlink.Item.Item.Type == InventoryType.Equipment)
                {
                    if (bzlink.Item is WearableInstance wear)
                    {
                        wear.EquipmentOptions.Clear();
                        wear.EquipmentOptions.AddRange(
                            DaoFactory.EquipmentOptionDao.GetOptionsByWearableInstanceId(wear.Id));
                    }

                    // TODO ADD RIGHT CLICK ON PET (get packet)
                    info = (bzlink.Item.Item.EquipmentSlot != EquipmentType.Sp
                        ? (bzlink.Item as WearableInstance)?.GenerateEInfo()
                        : bzlink.Item.Item.SpType == 0 && bzlink.Item.Item.ItemSubType == 4
                            ? (bzlink.Item as SpecialistInstance)?.GeneratePslInfo()
                            : bzlink.Item.Item.SpType == 3 && bzlink.Item.Item.ItemSubType == 1
                                ? (bzlink.Item as SpecialistInstance)?.GenerateSlInfo()
                                : "")?.Replace(' ', '^').Replace("slinfo^", "").Replace("e_info^", "");
                }

                itembazar +=
                    $"{bzlink.BazaarItem.BazaarItemId}|{bzlink.BazaarItem.SellerId}|{bzlink.Owner}|{bzlink.Item.Item.VNum}|{bzlink.Item.Amount}|{(bzlink.BazaarItem.IsPackage ? 1 : 0)}|{bzlink.BazaarItem.Price}|{time}|2|0|{bzlink.Item.Rare}|{bzlink.Item.Upgrade}|{info} ";
            }

            return($"rc_blist {packet.Index} {itembazar} ");
        }