from rest_framework import serializers

from .models import Course, CourseFee, MemberCourse


class CourseSerializer(serializers.ModelSerializer):
    current_fee = serializers.SerializerMethodField()

    class Meta:
        model = Course
        fields = ('id', 'inserted_date_time', 'title', 'total_sessions', 'current_fee')

    def get_current_fee(self, obj):
        fee = obj.fees.first()
        return fee.fee if fee else 0


class CourseFeeSerializer(serializers.ModelSerializer):
    class Meta:
        model = CourseFee
        fields = ('id', 'inserted_date_time', 'course', 'fee')


class MemberCourseSerializer(serializers.ModelSerializer):
    remaining_sessions = serializers.IntegerField(read_only=True)
    is_active = serializers.BooleanField(read_only=True)
    is_expired = serializers.BooleanField(read_only=True)

    class Meta:
        model = MemberCourse
        fields = (
            'id', 'member', 'start_date', 'end_date',
            'total_sessions', 'used_sessions', 'remaining_sessions',
            'fee', 'paid_fee', 'pos_payment', 'cash_payment',
            'transfer_payment', 'inserted_date_time',
            'is_active', 'is_expired',
        )

    def validate(self, attrs):
        start = attrs.get('start_date', getattr(self.instance, 'start_date', None))
        end = attrs.get('end_date', getattr(self.instance, 'end_date', None))
        total = attrs.get('total_sessions', getattr(self.instance, 'total_sessions', 0))
        used = attrs.get('used_sessions', getattr(self.instance, 'used_sessions', 0))
        paid = attrs.get('paid_fee', getattr(self.instance, 'paid_fee', 0))

        if start and end and end <= start:
            raise serializers.ValidationError({'end_date': 'تاریخ پایان باید بعد از تاریخ شروع باشد.'})
        if used > total:
            raise serializers.ValidationError({'used_sessions': 'جلسات استفاده شده نمی‌تواند بیشتر از کل جلسات باشد.'})
        if paid < 0:
            raise serializers.ValidationError({'paid_fee': 'مبلغ پرداختی نمی‌تواند منفی باشد.'})

        return attrs
