from apps.user.authentication_backends import EmailOrPhoneNoAuthBackend

from rest_framework import serializers
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework import exceptions

from apps.user.models import User, Permission



class UserLoginSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):

        user = EmailOrPhoneNoAuthBackend.authenticate(email=attrs.get('phone_no', None), password=attrs.get('password', None))

        if user:
            refresh = self.get_token(user)

            user_data = UserSerializer(user, context={'request': self.context['request']}).data
            data = {**user_data}

            data['access'] = str(refresh.access_token)
            data['refresh'] = str(refresh)

            return data
        else:
            raise exceptions.NotFound('No active account found with the given credentials')


class UserSerializer(serializers.ModelSerializer):
    role_name = serializers.CharField(source='role.name', read_only=True, allow_null=True)

    class Meta:
        model = User
        fields = ('id', 'first_name', 'last_name', 'email', 'phone_no', 'profile_pic', 'profile_pic_thumb', 'role_name',)
        read_only_fields = fields


class UserDetailSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('id', 'first_name', 'last_name', 'email', 'phone_no', 'profile_pic', 'profile_pic_thumb',)
        read_only_fields = fields



class UserPermissionAPISerializer(serializers.Serializer):
    permissions = serializers.CharField()


class UserEditProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'phone_no', 'profile_pic', 'profile_pic_thumb',)

        read_only_fields = ['profile_pic_thumb']

    def validate(self, attrs):
        profile_pic = attrs.get('profile_pic')

        if profile_pic:
            if attrs.get('profile_pic'):
                attrs['profile_pic_thumb'] = attrs['profile_pic']

        return super().validate(attrs)


class ChangePasswordSerializer(serializers.Serializer):
    current_password = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True)
    confirm_new_password = serializers.CharField(required=True)

    def validate(self, data):
        user = self.context['request'].user
        current_password = data.get('current_password')
        new_password = data.get('new_password')
        confirm_new_password = data.get('confirm_new_password')

        if not user.check_password(current_password):
            raise serializers.ValidationError("Current password is incorrect.")

        if new_password == current_password:
            raise serializers.ValidationError("New password must be different from the current password.")

        if new_password != confirm_new_password:
            raise serializers.ValidationError("New password and confirm new password must match.")

        return data
