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

User = get_user_model()


class GroupMemberSerializer(serializers.ModelSerializer):
    user_id = serializers.IntegerField(source='user.id', read_only=True)
    username = serializers.CharField(source='user.username', read_only=True)
    first_name = serializers.CharField(source='user.first_name', read_only=True)
    last_name = serializers.CharField(source='user.last_name', read_only=True)
    avatar = serializers.SerializerMethodField()

    class Meta:
        model = GroupMember
        fields = ['id', 'user_id', 'username', 'first_name', 'last_name', 'avatar', 'role', 'joined_at', 'is_active']
        read_only_fields = ['id', 'joined_at']

    def get_avatar(self, obj):
        if obj.user.avatar:
            request = self.context.get('request')
            if request:
                return request.build_absolute_uri(obj.user.avatar.url)
            return obj.user.avatar.url
        return None


class GroupSerializer(serializers.ModelSerializer):
    created_by_username = serializers.CharField(source='created_by.username', read_only=True)
    member_count = serializers.SerializerMethodField()
    post_count = serializers.SerializerMethodField()
    user_role = serializers.SerializerMethodField()
    image_url = serializers.SerializerMethodField()

    class Meta:
        model = Group
        fields = ['id', 'name', 'description', 'image', 'image_url', 'created_at',
                  'created_by', 'created_by_username', 'member_count', 'post_count', 'user_role', 'is_deleted']
        read_only_fields = ['id', 'created_at', 'created_by', 'is_deleted']

    def get_member_count(self, obj):
        return obj.members.filter(is_active=True).count()

    def get_post_count(self, obj):
        return obj.group_posts.filter(is_active=True).count()

    def get_user_role(self, obj):
        request = self.context.get('request')
        if request and request.user.is_authenticated:
            try:
                member = obj.members.get(user=request.user, is_active=True)
                return member.role
            except GroupMember.DoesNotExist:
                return None
        return None

    def get_image_url(self, obj):
        if obj.image:
            request = self.context.get('request')
            if request:
                return request.build_absolute_uri(obj.image.url)
            return obj.image.url
        return None


class GroupCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = ['name', 'description', 'image']

    def create(self, validated_data):
        user = self.context['request'].user
        group = Group.objects.create(created_by=user, **validated_data)
        GroupMember.objects.create(user=user, group=group, role='ADMIN')
        return group


class AddMemberSerializer(serializers.Serializer):
    user_id = serializers.IntegerField()
    role = serializers.ChoiceField(choices=['MEMBER', 'MODERATOR'], default='MEMBER')


class ChangeRoleSerializer(serializers.Serializer):
    role = serializers.ChoiceField(choices=['MEMBER', 'MODERATOR'])
