from rest_framework import serializers
from .models import (
    DistributorLevelProgress,
    FranchiseMonthlyIncentive,
    UserBonanzaCounter,
    RewardAchievement,
    Service,
    ServiceClaim,
    Gift,
    GiftClaim,
)

class DistributorLevelProgressSerializer(serializers.ModelSerializer):
    class Meta:
        model = DistributorLevelProgress
        fields = ['id', 'distributor', 'current_level', 'total_positions_after', 'last_calculated_at']
        read_only_fields = ['id', 'last_calculated_at']


class UserBonanzaCounterSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserBonanzaCounter
        fields = ['id', 'user', 'category', 'quantity', 'amount', 'notes', 'is_active', 'created_at', 'updated_at']
        read_only_fields = ['id', 'created_at', 'updated_at']


class FranchiseMonthlyIncentiveSerializer(serializers.ModelSerializer):
    class Meta:
        model = FranchiseMonthlyIncentive
        fields = ['id', 'user', 'period_month', 'amount', 'notes', 'is_active', 'created_at', 'updated_at']
        read_only_fields = ['id', 'created_at', 'updated_at']


class RewardAchievementSerializer(serializers.ModelSerializer):
    class Meta:
        model = RewardAchievement
        fields = ['id', 'user', 'level', 'reward_name', 'supercoin_amount', 'status', 'claimed_at', 'notes', 'created_at', 'updated_at']
        read_only_fields = ['id', 'created_at', 'updated_at']


class ServiceSerializer(serializers.ModelSerializer):
    is_quota_available = serializers.SerializerMethodField()

    class Meta:
        model = Service
        fields = ['id', 'level', 'service_name', 'service_description', 'category', 'quota', 'claimed_count', 'is_quota_available', 'is_active', 'created_at', 'updated_at']
        read_only_fields = ['id', 'claimed_count', 'created_at', 'updated_at']

    def get_is_quota_available(self, obj):
        return obj.is_quota_available()


class ServiceClaimSerializer(serializers.ModelSerializer):
    service_detail = ServiceSerializer(source='service', read_only=True)
    approved_by_name = serializers.CharField(source='approved_by.get_full_name', read_only=True)

    class Meta:
        model = ServiceClaim
        fields = ['id', 'user', 'service', 'service_detail', 'status', 'approved_by', 'approved_by_name', 'approved_at', 'completed_at', 'notes', 'admin_notes', 'created_at', 'updated_at']
        read_only_fields = ['id', 'approved_at', 'created_at', 'updated_at']


class GiftSerializer(serializers.ModelSerializer):
    is_quota_available = serializers.SerializerMethodField()

    class Meta:
        model = Gift
        fields = ['id', 'level', 'gift_name', 'gift_description', 'gift_category', 'quota', 'claimed_count', 'is_quota_available', 'value', 'is_active', 'created_at', 'updated_at']
        read_only_fields = ['id', 'claimed_count', 'created_at', 'updated_at']

    def get_is_quota_available(self, obj):
        return obj.is_quota_available()


class GiftClaimSerializer(serializers.ModelSerializer):
    gift_detail = GiftSerializer(source='gift', read_only=True)
    approved_by_name = serializers.CharField(source='approved_by.get_full_name', read_only=True)

    class Meta:
        model = GiftClaim
        fields = ['id', 'user', 'gift', 'gift_detail', 'status', 'approved_by', 'approved_by_name', 'approved_at', 'completed_at', 'notes', 'admin_notes', 'created_at', 'updated_at']
        read_only_fields = ['id', 'approved_at', 'created_at', 'updated_at']
