using System;
using Bit.Core.Enums;
using Bit.Core.Models.StaticStore;

namespace Bit.Core.Models.Api
{
    public class PlanResponseModel : ResponseModel
    {
        public PlanResponseModel(Plan plan, string obj = "plan")
            : base(obj)
        {
            if (plan == null)
            {
                throw new ArgumentNullException(nameof(plan));
            }

            Type = plan.Type;
            Product = plan.Product;
            Name = plan.Name;
            IsAnnual = plan.IsAnnual;
            NameLocalizationKey = plan.NameLocalizationKey;
            DescriptionLocalizationKey = plan.DescriptionLocalizationKey;
            CanBeUsedByBusiness = plan.CanBeUsedByBusiness;
            BaseSeats = plan.BaseSeats;
            BaseStorageGb = plan.BaseStorageGb;
            MaxCollections = plan.MaxCollections;
            MaxUsers = plan.MaxUsers;
            HasAdditionalSeatsOption = plan.HasAdditionalSeatsOption;
            HasAdditionalStorageOption = plan.HasAdditionalStorageOption;
            MaxAdditionalSeats = plan.MaxAdditionalSeats;
            MaxAdditionalStorage = plan.MaxAdditionalStorage;
            HasPremiumAccessOption = plan.HasPremiumAccessOption;
            TrialPeriodDays = plan.TrialPeriodDays;
            HasSelfHost = plan.HasSelfHost;
            HasPolicies = plan.HasPolicies;
            HasGroups = plan.HasGroups;
            HasDirectory = plan.HasDirectory;
            HasEvents = plan.HasEvents;
            HasTotp = plan.HasTotp;
            Has2fa = plan.Has2fa;
            HasSso = plan.HasSso;
            UsersGetPremium = plan.UsersGetPremium;
            UpgradeSortOrder = plan.UpgradeSortOrder;
            DisplaySortOrder = plan.DisplaySortOrder;
            LegacyYear = plan.LegacyYear;
            Disabled = plan.Disabled;
            StripePlanId = plan.StripePlanId;
            StripeSeatPlanId = plan.StripeSeatPlanId;
            StripeStoragePlanId = plan.StripeStoragePlanId;
            BasePrice = plan.BasePrice;
            SeatPrice = plan.SeatPrice;
            AdditionalStoragePricePerGb = plan.AdditionalStoragePricePerGb;
            PremiumAccessOptionPrice = plan.PremiumAccessOptionPrice;
        }

        public PlanType Type { get; set; }
        public ProductType Product { get; set; }
        public string Name { get; set; }
        public bool IsAnnual { get; set; }
        public string NameLocalizationKey { get; set; }
        public string DescriptionLocalizationKey { get; set; }
        public bool CanBeUsedByBusiness { get; set; }
        public int BaseSeats { get; set; }
        public short? BaseStorageGb { get; set; }
        public short? MaxCollections { get; set; }
        public short? MaxUsers { get; set; }

        public bool HasAdditionalSeatsOption { get; set; }
        public short? MaxAdditionalSeats { get; set; }
        public bool HasAdditionalStorageOption { get; set; }
        public short? MaxAdditionalStorage { get; set; }
        public bool HasPremiumAccessOption { get; set; }
        public int? TrialPeriodDays { get; set; }

        public bool HasSelfHost { get; set; }
        public bool HasPolicies { get; set; }
        public bool HasGroups { get; set; }
        public bool HasDirectory { get; set; }
        public bool HasEvents { get; set; }
        public bool HasTotp { get; set; }
        public bool Has2fa { get; set; }
        public bool HasApi { get; set; }
        public bool HasSso { get; set; }
        public bool UsersGetPremium { get; set; }

        public int UpgradeSortOrder { get; set; }
        public int DisplaySortOrder { get; set; }
        public int? LegacyYear { get; set; }
        public bool Disabled { get; set; }

        public string StripePlanId { get; set; }
        public string StripeSeatPlanId { get; set; }
        public string StripeStoragePlanId { get; set; }
        public string StripePremiumAccessPlanId { get; set; }
        public decimal BasePrice { get; set; }
        public decimal SeatPrice { get; set; }
        public decimal AdditionalStoragePricePerGb { get; set; }
        public decimal PremiumAccessOptionPrice { get; set; }
    }
}
