from django.db.models import Prefetch
from rest_framework import serializers

from courses.models import MemberCourse
from .models import Member


class MemberSerializer(serializers.ModelSerializer):
    remaining_sessions = serializers.SerializerMethodField()
    course_fee = serializers.SerializerMethodField()
    paid_fee = serializers.SerializerMethodField()
    debt = serializers.SerializerMethodField()
    course_end_date = serializers.SerializerMethodField()
    course_status = serializers.SerializerMethodField()

    class Meta:
        model = Member
        fields = '__all__'
        read_only_fields = (
            'inserted_date_time',
            'updated_date_time',
            'remaining_sessions',
            'course_fee',
            'paid_fee',
            'debt',
            'course_end_date',
            'course_status',
        )

    def _course(self, obj):
        courses = getattr(obj, '_current_course', [])
        return courses[0] if courses else None

    def get_remaining_sessions(self, obj):
        course = self._course(obj)
        return course.remaining_sessions if course else None

    def get_course_fee(self, obj):
        course = self._course(obj)
        return course.fee if course else None

    def get_paid_fee(self, obj):
        course = self._course(obj)
        return course.paid_fee if course else None

    def get_debt(self, obj):
        course = self._course(obj)
        return max(course.fee - course.paid_fee, 0) if course else None

    def get_course_end_date(self, obj):
        course = self._course(obj)
        return course.end_date if course else None

    def get_course_status(self, obj):
        course = self._course(obj)
        if not course:
            return 'بدون دوره'
        if course.is_active:
            return 'فعال'
        if course.is_expired:
            return 'منقضی'
        return 'غیرفعال'

    def validate_mobile(self, value):
        value = value.strip()
        if not value:
            raise serializers.ValidationError('شماره موبایل الزامی است.')
        return value

    def validate_national_code(self, value):
        if value is None or value == '':
            return None

        value = value.strip()
        if not value.isdigit() or len(value) != 10:
            raise serializers.ValidationError('کد ملی باید ۱۰ رقم باشد.')
        return value

    def validate_enroll_code(self, value):
        if value <= 0:
            raise serializers.ValidationError('کد شناسایی باید بزرگ‌تر از صفر باشد.')
        return value
