/// <summary>
        /// Subscribes the family
        /// </summary>
        /// <param name="subscription">The subscription</param>
        /// <returns></returns>
        public void Subscribe(Subscription subscription)
        {
            SubscriptionPromoCode subscriptionPromoCode = null;
            var familySubscription = _familyService.GetFamilySubscription();
            //var subscriptionPlan = GetSubscriptionPlan(subscription.SubscriptionType);
            var subscriptionPlan = new SubscriptionPlan();

            //added by promocode
            var prePromoCodeStatus = _familyService.GetPrePromoCodeStatus();

            if (!string.IsNullOrEmpty(prePromoCodeStatus.PromoCode))
            {
                subscription.SubscriptionType = SubscriptionType.PromoPlan;
                subscriptionPromoCode         = ValidatePromoCode(prePromoCodeStatus.PromoCode);
                subscriptionPlan = GetSubscriptionPlan(subscription.SubscriptionType);
            }
            else
            {
                subscriptionPlan = GetSubscriptionPlan(subscription.SubscriptionType);
            }

            if (familySubscription != null)
            {
                switch (familySubscription.Status)
                {
                case SubscriptionStatus.Active:
                    throw new InvalidOperationException(string.Format("You already have an active {0} subscription.", familySubscription.SubscriptionPlan.PlanName.ToLower()));

                case SubscriptionStatus.PendingCancellation:
                case SubscriptionStatus.Cancelled:
                    if (familySubscription.EndsOn.Date <= DateTime.UtcNow.Date)
                    {
                        subscriptionPlan = GetSubscriptionPlan(SubscriptionType.Annual);
                        familySubscription.BankTransactionID  = PurchaseAnnualSubscription(subscriptionPlan.Price);
                        familySubscription.SubscriptionPlanID = subscriptionPlan.Id;
                        familySubscription.StartsOn           = DateTime.UtcNow;
                        familySubscription.EndsOn             = DateTime.UtcNow.AddYears(1);
                        familySubscription.Status             = SubscriptionStatus.Active;
                        familySubscription.PromoCode          = subscriptionPromoCode?.PromoCode ?? string.Empty;
                        Repository.Update(familySubscription);
                    }
                    else
                    {
                        if (familySubscription.SubscriptionPlanID == subscriptionPlan.Id)
                        {
                            familySubscription.Status    = SubscriptionStatus.Active;
                            familySubscription.PromoCode = subscriptionPromoCode?.PromoCode ?? string.Empty;
                            Repository.Update(familySubscription);
                        }
                        else
                        {
                            ActivateSubscription(subscriptionPlan, subscription.SubscriptionType, familySubscription, subscriptionPromoCode);
                        }
                    }

                    // Sets IsActive of the subscription cancellation request to false.
                    var admin = _familyService.GetAdmin();
                    if (admin == null)
                    {
                        return;
                    }

                    var subscriptionCancellationRequest = Repository.Table <SubscriptionCancellationRequest>()
                                                          .FirstOrDefault(p => p.FamilyMemberID == admin.Id && p.IsActive);
                    if (subscriptionCancellationRequest == null)
                    {
                        return;
                    }
                    subscriptionCancellationRequest.IsActive = false;
                    Repository.Update(subscriptionCancellationRequest);
                    break;
                }
            }
            else
            {
                //Handle null Promocode
                //subscriptionPromoCode = ValidatePromoCode(subscription.PromoCode);
                ActivateSubscription(subscriptionPlan, subscription.SubscriptionType, null, subscriptionPromoCode);
            }
        }
        /// <summary>
        /// Activates the subscription plan
        /// </summary>
        /// <param name="subscriptionPlanId">The subscription plan identifier.</param>
        /// <param name="subscriptionType">The subscription type.</param>
        /// <param name="familySubscription">The family subscription.</param>
        /// <param name="subscriptionPromoCode">The subscription promo code.</param>
        /// <returns>The family subscription.</returns>
        private FamilySubscription ActivateSubscription(SubscriptionPlan subscriptionPlan, SubscriptionType subscriptionType, FamilySubscription familySubscription, SubscriptionPromoCode subscriptionPromoCode)
        {
            familySubscription = familySubscription ?? new FamilySubscription();
            var subscriptionEndDate = DateTime.UtcNow.AddDays(-1);

            switch (subscriptionType)
            {
            case SubscriptionType.OneMonthTrial:
                subscriptionEndDate               = DateTime.UtcNow.AddMonths(1);
                familySubscription.IsTrialUsed    = true;
                familySubscription.TrialStartDate = DateTime.UtcNow;
                break;

            case SubscriptionType.PromoPlan:
                switch (subscriptionPromoCode.DurationType)
                {
                case DurationType.Day:
                    subscriptionEndDate = DateTime.UtcNow.AddDays(subscriptionPromoCode.Duration);
                    break;

                case DurationType.Month:
                    subscriptionEndDate = DateTime.UtcNow.AddMonths(subscriptionPromoCode.Duration);
                    break;

                case DurationType.Year:
                    subscriptionEndDate = DateTime.UtcNow.AddYears(subscriptionPromoCode.Duration);
                    break;
                }
                break;

            case SubscriptionType.Annual:
                familySubscription.BankTransactionID = PurchaseAnnualSubscription(subscriptionPlan.Price);
                subscriptionEndDate = DateTime.UtcNow.AddYears(1);
                break;

            case SubscriptionType.Pendingaccount:
                subscriptionEndDate               = DateTime.UtcNow.AddMonths(1);
                familySubscription.IsTrialUsed    = true;
                familySubscription.TrialStartDate = DateTime.UtcNow;
                break;
            }
            familySubscription.SubscriptionPlanID = subscriptionPlan.Id;
            familySubscription.StartsOn           = DateTime.UtcNow;
            familySubscription.EndsOn             = subscriptionEndDate;
            familySubscription.Status             = SubscriptionStatus.Active;
            familySubscription.PromoCode          = subscriptionPromoCode?.PromoCode ?? string.Empty;

            return(_familyService.UpdatetFamilySubscription(familySubscription));
        }