using System.Runtime.Serialization; using System.Text.Json.Serialization; using Bit.Core.Utilities; using Stripe; namespace Bit.Core.Billing.Subscriptions.Models; /// /// The type of discounts Bitwarden supports. /// public enum BitwardenDiscountType { [EnumMember(Value = "amount-off")] AmountOff, [EnumMember(Value = "percent-off")] PercentOff } /// /// A record representing a discount applied to a Bitwarden subscription. /// public record BitwardenDiscount { /// /// The type of the discount. /// [JsonConverter(typeof(EnumMemberJsonConverter))] public required BitwardenDiscountType Type { get; init; } /// /// The value of the discount. /// public required decimal Value { get; init; } public static implicit operator BitwardenDiscount(Discount? discount) { if (discount is not { Coupon.Valid: true }) { return null!; } return discount.Coupon switch { { AmountOff: > 0 } => new BitwardenDiscount { Type = BitwardenDiscountType.AmountOff, Value = discount.Coupon.AmountOff.Value }, { PercentOff: > 0 } => new BitwardenDiscount { Type = BitwardenDiscountType.PercentOff, Value = discount.Coupon.PercentOff.Value }, _ => null! }; } }