from rest_framework import serializers from apps.billing.api.services import REFERRAL_MILESTONES, FeatureAccessService from apps.billing.models import FeaturePlan, FeaturePlanTier, GemPack class WalletSerializer(serializers.Serializer): gem_balance = serializers.IntegerField() is_in_trial = serializers.BooleanField() trial_expires_at = serializers.DateTimeField() referral_code = serializers.CharField() referral_count = serializers.IntegerField() next_referral_milestone = serializers.SerializerMethodField() def get_next_referral_milestone(self, obj): count = obj["referral_count"] for milestone, bonus in sorted(REFERRAL_MILESTONES.items()): if count < milestone: return {"referrals_needed": milestone, "referrals_remaining": milestone - count, "bonus_gems": bonus} return None class FeaturePlanTierSerializer(serializers.ModelSerializer): class Meta: model = FeaturePlanTier fields = ["duration_months", "gem_price"] class FeaturePlanSerializer(serializers.ModelSerializer): tiers = FeaturePlanTierSerializer(many=True, read_only=True) is_active = serializers.SerializerMethodField() expires_at = serializers.SerializerMethodField() class Meta: model = FeaturePlan fields = ["key", "name", "tiers", "is_active", "expires_at"] def get_is_active(self, obj: FeaturePlan) -> bool: return FeatureAccessService.is_active(self.context["request"].user, obj.key) def get_expires_at(self, obj: FeaturePlan): return FeatureAccessService.expires_at(self.context["request"].user, obj.key) class GemPackSerializer(serializers.ModelSerializer): class Meta: model = GemPack fields = ["id", "bazaar_sku", "display_name", "gem_amount"] class ActivateFeatureSerializer(serializers.Serializer): duration_months = serializers.IntegerField(min_value=1) class CreatePurchaseSerializer(serializers.Serializer): gem_pack_id = serializers.IntegerField() purchase_token = serializers.CharField(max_length=255)