from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from rest_framework import serializers

User = get_user_model()


class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = ['id', 'name']


class UserGroupsSerializer(serializers.Serializer):
    """Serializer for getting user's assigned and available groups."""
    user_id = serializers.IntegerField()
    user_name = serializers.CharField(source='full_name')
    email = serializers.EmailField()
    assigned_groups = GroupSerializer(many=True, read_only=True)
    available_groups = GroupSerializer(many=True, read_only=True)


class AssignGroupsSerializer(serializers.Serializer):
    """Serializer for assigning groups to a user."""
    group_ids = serializers.ListField(
        child=serializers.IntegerField(),
        help_text="List of group IDs to assign to the user"
    )

    def validate_group_ids(self, value):
        """Validate that all group IDs exist."""
        groups = Group.objects.filter(id__in=value)
        if len(groups) != len(set(value)):
            raise serializers.ValidationError("One or more group IDs do not exist or are duplicated.")
        if len(value) == 0:
            raise serializers.ValidationError("At least one group must be assigned.")
        return value
