public static List <DayActualEntity> CalculateTopics(bool hourlyTimeSlots, int timeSlots, IMainFilterEntity mfe
                                                             , bool withLabels, bool siteQ = false)
        {
            var returned = new List <DayActualEntity>();
            List <DayActualEntity> feaData, adjustments, checkInData, checkOutData;
            var bufferData = new List <DayActualEntity>();
            int buffer     = 0;

            using (var db = new MarsDBDataContext())
            {
                db.Log = new DebugTextWriter();

                feaData = withLabels
                            ? DayActualEntityRetrievers.GetFeaDataWithLabel(mfe, hourlyTimeSlots, db, siteQ)
                            : DayActualEntityRetrievers.GetFeaData(mfe, hourlyTimeSlots, db);


                adjustments = withLabels
                            ? DayActualEntityRetrievers.GetAdditionDeletionDataWithLabels(mfe, hourlyTimeSlots, db, siteQ)
                            : DayActualEntityRetrievers.GetCurrentAdditionDeletion(mfe, hourlyTimeSlots, db);
                if (withLabels)
                {
                    bufferData = DayActualEntityRetrievers.GetBuffersWithLabels(mfe, db, siteQ);
                }
                else
                {
                    buffer = DayActualEntityRetrievers.GetBuffers(mfe, db);
                }
            }
            using (var db = new PoolingDataClassesDataContext())
            {
                checkInData = withLabels
                            ? DayActualEntityRetrievers.GetPoolingCheckInDataWithLabels(mfe, hourlyTimeSlots, db, siteQ)
                            : DayActualEntityRetrievers.GetPoolingCheckInData(mfe, hourlyTimeSlots, db);
                checkOutData = withLabels
                            ? DayActualEntityRetrievers.GetPoolingCheckOutDataWithLabels(mfe, hourlyTimeSlots, db, siteQ)
                            : DayActualEntityRetrievers.GetPoolingCheckOutData(mfe, hourlyTimeSlots, db);
            }

            var emptyHolder = new DayActualEntity();


            var checkInLocations  = checkInData.Select(d => d.Label).Distinct().ToList();
            var checkOutLocations = checkInData.Select(d => d.Label).Distinct().ToList();
            var labels            = withLabels ? GetLabels(mfe, siteQ) : new List <string> {
                null
            };

            if (withLabels)
            {
                labels.AddRange(checkInLocations);
                labels.AddRange(checkOutLocations);
                labels = labels.Distinct().ToList();
            }

            for (var i = 0; i < timeSlots; i++)
            {
                foreach (var lbl in labels)
                {
                    var fea = feaData.FirstOrDefault(d => d.Tme == i && (d.Label == lbl)) ?? emptyHolder;
                    var adj = adjustments.FirstOrDefault(d => d.Tme == i && (d.Label == lbl)) ?? emptyHolder;

                    var ci           = checkInData.FirstOrDefault(d => d.Tme == i && (d.Label == lbl)) ?? emptyHolder;
                    var co           = checkOutData.FirstOrDefault(d => d.Tme == i && (d.Label == lbl)) ?? emptyHolder;
                    var bufferHolder = bufferData.FirstOrDefault(d => d.Label == lbl) ?? emptyHolder;
                    if (withLabels)
                    {
                        buffer = bufferHolder.Buffer;
                    }
                    var previousBalance    = returned.FirstOrDefault(d => d.Tme == i - 1 && (d.Label == lbl));
                    var previousBalanceInt = previousBalance == null ? 0 : previousBalance.Balance;


                    var available = i == 0
                        ? fea.Available + adj.AddditionDeletion
                        : previousBalanceInt + buffer;



                    var balance = available
                                  //+ fea.Opentrips
                                  - co.Reservations + (fea.Offset + ci.Offset)
                                  - buffer + adj.AddditionDeletion;

                    var dae = new DayActualEntity
                    {
                        Tme                     = i,
                        Label                   = lbl,
                        Available               = available,
                        Opentrips               = fea.Opentrips,
                        Reservations            = co.Reservations,
                        OnewayRes               = co.OnewayRes,
                        GoldServiceReservations = co.GoldServiceReservations,
                        PrepaidReservations     = 0,      // co.PrepaidReservations,
                        Checkin                 = fea.Checkin + ci.Checkin,
                        OnewayCheckin           = fea.OnewayCheckin + ci.OnewayCheckin,
                        Offset                  = fea.Offset + ci.Offset,
                        LocalCheckIn            = fea.LocalCheckIn,// + ci.LocalCheckIn,
                        Balance                 = balance,
                        Buffer                  = buffer,
                        AddditionDeletion       = adj.AddditionDeletion,
                        JustAdditions           = adj.JustAdditions,
                        JustDeletions           = adj.JustDeletions,
                    };
                    returned.Add(dae);

                    if (string.IsNullOrEmpty(lbl))
                    {
                        break;
                    }
                }
            }


            return(returned);
        }