from rest_framework import serializers
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Permission # Keep Permission for User model's user_permissions
from users.models import CustomPermission, CustomGroup

from users.models.users import User

class PermissionSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomPermission
        fields = ['id', 'action']

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


class PermissionMiniSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomPermission
        fields = ['id', 'action']

class GroupWithPermissionsSerializer(serializers.ModelSerializer):
    permissions = PermissionMiniSerializer(many=True)

    class Meta:
        model = CustomGroup
        fields = ['id', 'name', 'permissions']

from users.models import CustomPermission, CustomGroup, RoleGroupPermission # Import RoleGroupPermission

# ... (existing serializers) ...

class GroupWithAggregatedPermissionsSerializer(serializers.ModelSerializer):
    permissions = serializers.SerializerMethodField()

    class Meta:
        model = CustomGroup
        fields = ['id', 'name', 'permissions']

    def get_permissions(self, obj):
        # Fetch all CustomPermission objects from the database
        all_permissions = CustomPermission.objects.all()
        
        # Serialize all permissions using PermissionMiniSerializer
        return PermissionMiniSerializer(all_permissions, many=True).data

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'email', 'full_name', 'role', 'is_active', 'is_staff', 'is_superuser', 'date_joined', 'email_verified','country']

class UserGroupsWithPermissionsSerializer(serializers.ModelSerializer):
    groups = GroupWithPermissionsSerializer(many=True)

    class Meta:
        model = User
        fields = ['id', 'groups']


 ### Registration, Verify , Login Serializer


class RegistrationSerializer(serializers.ModelSerializer):
    email = serializers.EmailField()
    password = serializers.CharField(write_only=True, required=True, style={'input_type': 'password'})
    password_confirm = serializers.CharField(write_only=True, required=True, style={'input_type': 'password'})
    # country = serializers.CharField(required=False, allow_blank=True)

    class Meta:
        model = User
        fields = ['email', 'full_name', 'password', 'password_confirm', 'role', 'country']
        extra_kwargs = {'role': {'read_only': True}}
    
    def validate_email(self, value):
        try:
            existing_user = User.objects.get(email=value)
            if existing_user.email_verified:
                raise serializers.ValidationError(
                    "A verified account with this email already exists. Please login instead."
                )
            # If user exists but not verified, allow the registration to proceed
            return value
        except User.DoesNotExist:
            # Email doesn't exist, allow registration
            return value
        
    def validate(self, data):
        if data['password'] != data['password_confirm']:
            raise serializers.ValidationError({"password_confirm": "Passwords do not match."})
        return data

    def create(self, validated_data):
        validated_data.pop('password_confirm')
        user = User.objects.create_user(
            email=validated_data['email'],
            password=validated_data['password'],
            full_name=validated_data.get('full_name', ''),
            role=validated_data.get('role', 'client'),
            is_active=True,
            country=validated_data.get('country', ''),
        )
        return user

    def create_admin(self, validated_data):
        validated_data.pop('password_confirm')
        user = User.objects.create_user(
            email=validated_data['email'],
            password=validated_data['password'],
            first_name=validated_data.get('first_name', ''),
            last_name=validated_data.get('last_name', ''),
            role=validated_data.get('role', 'admin'),
            country=validated_data.get('country', ''),
            is_active=True,
            email_verified=True,
            is_staff=True,
        )
        return user

class ResendVerificationSerializer(serializers.Serializer):
    email = serializers.EmailField(required=True)

class EmailVerificationSerializer(serializers.Serializer):
    token = serializers.CharField(
        required=True,
        help_text="6-digit verification token"
    )

class LoginSerializer(serializers.Serializer):
    email = serializers.EmailField(required=False)
    id = serializers.IntegerField(required=False)
    # company_id = serializers.CharField(required=False)
    password = serializers.CharField(required=True, style={'input_type': 'password'})

#### Password Reset Serializers
class PasswordResetRequestSerializer(serializers.Serializer):
    email = serializers.EmailField(required=True)

class ResendPasswordResetSerializer(serializers.Serializer):
    email = serializers.EmailField(required=True)

class PasswordResetConfirmSerializer(serializers.Serializer):
    token = serializers.CharField(
        required=True,
        help_text="6-digit reset token"
    )
    password = serializers.CharField(required=True, style={'input_type': 'password'})
    password_confirm = serializers.CharField(required=True, style={'input_type': 'password'})

    def validate(self, data):
        if data['password'] != data['password_confirm']:
            raise serializers.ValidationError({"password_confirm": "Passwords do not match."})
        return data


### Password Change Serializer

class ChangePasswordSerializer(serializers.Serializer):
    user_id = serializers.IntegerField(required=True)
    password = serializers.CharField(write_only=True, required=True)

    def validate_user_id(self, value):
        try:
            User.objects.get(id=value)
        except User.DoesNotExist:
            raise serializers.ValidationError("User with this ID does not exist.")
        return value

# class PasswordChangeSerializer(serializers.Serializer):
#     current_password = serializers.CharField()
#     new_password = serializers.CharField()