public static async Task <bool> IsFeatureUsedInTheLastXDays(this UsageRule self, LocalAnalytics analytics)
        {
            var allEvents = await analytics.GetAllEventsForCategory(self.categoryId);

            if (allEvents.IsNullOrEmpty())
            {
                return(false);
            }
            DateTime lastEvent      = allEvents.Last().GetDateTimeUtc();
            TimeSpan lastEventVsNow = DateTimeV2.UtcNow - lastEvent;

            return(lastEventVsNow.Days <= self.days);
        }
        public static async Task <bool> IsNotificationMinXDaysOld(this UsageRule self, LocalAnalytics analytics)
        {
            var allEvents = await analytics.GetAllEventsForCategory(EventConsts.catUsage);

            var showEvents = allEvents.Filter(x => x.action == EventConsts.SHOW + "_" + self.categoryId);

            if (showEvents.IsNullOrEmpty())
            {
                return(false);
            }
            DateTime firstShownEvent = showEvents.First().GetDateTimeUtc();
            TimeSpan firstShownVsNow = DateTimeV2.UtcNow - firstShownEvent;

            return(firstShownVsNow.Days >= self.days);
        }
        public static UsageRule SetupUsing(this UsageRule self, LocalAnalytics analytics)
        {
            self.isTrue = async() => {
                switch (self.ruleType)
                {
                case UsageRule.AppUsedXDays: return(await self.IsAppUsedXDays(analytics));

                case UsageRule.AppNotUsedXDays: return(!await self.IsAppUsedXDays(analytics));

                case UsageRule.AppUsedInTheLastXDays: return(self.IsAppUsedInTheLastXDays());

                case UsageRule.AppNotUsedInTheLastXDays: return(!self.IsAppUsedInTheLastXDays());

                case UsageRule.FeatureUsedInTheLastXDays: return(await self.IsFeatureUsedInTheLastXDays(analytics));

                case UsageRule.FeatureNotUsedInTheLastXDays: return(!await self.IsFeatureUsedInTheLastXDays(analytics));

                case UsageRule.FeatureUsedXDays: return(await self.IsFeatureUsedXDays(analytics));

                case UsageRule.FeatureNotUsedXDays: return(!await self.IsFeatureUsedXDays(analytics));

                case UsageRule.FeatureUsedXTimes: return(await self.IsFeatureUsedXTimes(analytics));

                case UsageRule.FeatureNotUsedXTimes: return(!await self.IsFeatureUsedXTimes(analytics));

                case UsageRule.NotificationMinXDaysOld: return(await self.IsNotificationMinXDaysOld(analytics));

                case UsageRule.ConcatRule:
                    foreach (var rule in self.andRules)
                    {
                        if (rule.isTrue == null)
                        {
                            rule.SetupUsing(analytics);
                        }
                        if (!await rule.isTrue())
                        {
                            return(false);
                        }
                    }
                    return(true);

                default:
                    Log.e("Unknown ruleType: " + self.ruleType);
                    return(false);
                }
            };
            return(self);
        }
        public static async Task <bool> IsAppUsedXDays(this UsageRule self, LocalAnalytics analytics)
        {
            var allEvents = await analytics.GetAll();

            return(allEvents.GroupByDay().Count() >= self.days);
        }
        public static async Task <bool> IsFeatureUsedXTimes(this UsageRule self, LocalAnalytics analytics)
        {
            var startEvents = await analytics.GetStartEvents(self.categoryId);

            return(startEvents.Count() >= self.timesUsed.Value);
        }
        public static bool IsAppUsedInTheLastXDays(this UsageRule self)
        {
            var tSinceLatestLaunch = DateTimeV2.UtcNow - EnvironmentV2.instance.systemInfo.GetLatestLaunchDate();

            return(tSinceLatestLaunch.Days < self.days);
        }
        public static async Task <bool> IsFeatureUsedXDays(this UsageRule self, LocalAnalytics analytics)
        {
            var allEvents = await analytics.GetAllEventsForCategory(self.categoryId);

            return(allEvents.GroupByDay().Count() >= self.days);
        }