from rest_framework import serializers

from Members.models import Member

from .models import Attendance


class AttendanceSerializer(serializers.ModelSerializer):
    member_name = serializers.SerializerMethodField()
    enroll_code = serializers.IntegerField(source='member.enroll_code', read_only=True)
    is_inside = serializers.BooleanField(read_only=True)
    duration_seconds = serializers.IntegerField(read_only=True)

    class Meta:
        model = Attendance
        fields = (
            'id',
            'member',
            'member_name',
            'enroll_code',
            'entry_at',
            'exit_at',
            'entry_event_id',
            'exit_event_id',
            'entry_source',
            'exit_source',
            'entry_device',
            'exit_device',
            'notes',
            'is_inside',
            'duration_seconds',
        )
        read_only_fields = (
            'id',
            'member_name',
            'enroll_code',
            'entry_at',
            'exit_at',
            'entry_event_id',
            'exit_event_id',
            'is_inside',
            'duration_seconds',
        )

    def get_member_name(self, obj):
        return f'{obj.member.first_name} {obj.member.last_name}'.strip()


class AttendanceEventSerializer(serializers.Serializer):
    enroll_code = serializers.IntegerField(required=False, min_value=1)
    member_id = serializers.IntegerField(required=False, min_value=1)
    event_id = serializers.UUIDField(required=False)
    event_at = serializers.DateTimeField(required=False)
    source = serializers.ChoiceField(
        choices=[choice[0] for choice in Attendance.SOURCE_CHOICES],
        default='internal',
    )
    device = serializers.CharField(max_length=100, required=False, allow_blank=True, default='')
    notes = serializers.CharField(max_length=500, required=False, allow_blank=True, default='')

    def validate(self, attrs):
        if not attrs.get('enroll_code') and not attrs.get('member_id'):
            raise serializers.ValidationError('enroll_code یا member_id الزامی است.')
        if attrs.get('enroll_code') and attrs.get('member_id'):
            raise serializers.ValidationError('فقط یکی از enroll_code یا member_id را ارسال کنید.')
        return attrs

    def get_member(self):
        if self.validated_data.get('enroll_code'):
            member = Member.objects.filter(
                enroll_code=self.validated_data['enroll_code']
            ).first()
        else:
            member = Member.objects.filter(
                pk=self.validated_data['member_id']
            ).first()

        if not member:
            raise serializers.ValidationError('عضو موردنظر پیدا نشد.')
        if not member.is_active:
            raise serializers.ValidationError('عضو غیرفعال است.')
        return member
