from rest_framework import serializers class PlanSerializer(serializers.Serializer): id = serializers.CharField() title = serializers.CharField() price = serializers.IntegerField() currency = serializers.CharField(required=False) popular = serializers.BooleanField() discountPercent = serializers.IntegerField(required=False) durationDays = serializers.IntegerField(required=False) features = serializers.ListField(child=serializers.CharField()) badge = serializers.CharField(allow_blank=True) aiDailyQuota = serializers.IntegerField(help_text='سوال در روز از دستیار برای مشترکِ این پلن.') kind = serializers.ChoiceField(choices=['pack', 'subscription']) questionCredits = serializers.IntegerField(help_text='بسته: سوال‌هایی که به اعتبار اضافه می‌شود (منقضی نمی‌شود).') heartsDays = serializers.IntegerField(help_text='بسته: روزهای قلبِ نامحدودِ هدیه.') bazaarSku = serializers.CharField( allow_blank=True, help_text='SKUِ همین بسته در کافه‌بازار؛ خالی یعنی در بازار خریدنی نیست.') class PlansListResponseSerializer(serializers.Serializer): plans = PlanSerializer(many=True) # تا کارتِ پلن بتواند بگوید «۵ سوال در روز (رایگان: ۳)» بی‌آن‌که عدد در فرانت هاردکد شود. freeAiDailyQuota = serializers.IntegerField() class PurchaseRequestSerializer(serializers.Serializer): # هدر Idempotency-Key هم روی همین درخواست لازمه (بخش ۴.۳ سند API)؛ # از request.headers خونده می‌شه، نه از بدنه. planId = serializers.CharField() # تا ۲۰۲۶-۱۰-۰۳ هر مقداری پذیرفته و نادیده گرفته می‌شد، پس «bazaar» بی‌صدا به زرین‌پال می‌رفت. paymentMethod = serializers.ChoiceField(choices=['zarinpal', 'bazaar'], required=False, default='zarinpal') class PurchaseResponseSerializer(serializers.Serializer): orderId = serializers.CharField() paymentUrl = serializers.CharField( allow_null=True, help_text='زرین‌پال: آدرسی که کاربر به آن برود. بازار: null.') bazaarSku = serializers.CharField( required=False, help_text='فقط بازار: SKUی که اپِ اندروید با Poolakey می‌خرد؛ ' 'developerPayload همان orderId باشد.') class SubscriptionStatusResponseSerializer(serializers.Serializer): active = serializers.BooleanField(help_text='اشتراکِ زمانی (ماهانه/سالانه‌ی قدیمی)؛ نه بسته.') planId = serializers.CharField(allow_null=True) expiresAt = serializers.DateTimeField(allow_null=True) questionCredits = serializers.IntegerField(help_text='سوال‌های خریده‌شده‌ی باقی‌مانده (منقضی نمی‌شوند).') unlimitedHeartsUntil = serializers.DateTimeField(allow_null=True, help_text='پایانِ قلبِ نامحدودِ هدیه‌ی بسته.')