

from rest_framework import serializers
from django.contrib.auth.models import User

from customer.models import Customer
from account.models import UserProfile

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['username', 'email', 'last_name', 'first_name', 'is_staff', 'is_active', 'is_superuser']
        extra_kwargs = {
            'is_staff': {'write_only': True},
            'is_active': {'write_only': True},
            'username': {'write_only': True},
            'last_name': {'write_only': True},
            'first_name': {'write_only': True},
            'is_supperuser': {'write_only': True},
        }

class UserProfileSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    class Meta:
        model = UserProfile
        fields = ['phone_number', 'user']

class RegistrationSerializer(serializers.ModelSerializer):    
    password = serializers.CharField(style={'input_type':'password'}, write_only=True)
    password2 = serializers.CharField(style={'input_type':'password'}, write_only=True)
    username = serializers.CharField(max_length=150)
    first_name = serializers.CharField(max_length=150, required=False)
    last_name = serializers.CharField(max_length=150, required=True)
    phone_number = serializers.CharField(max_length=150, required=False)
    user_email = serializers.CharField(max_length=150, required=False)
    customer_id = serializers.IntegerField(required=True)

    class Meta:
        model = UserProfile
        fields = ['last_name', 'first_name', 'username', 'user_email', 'phone_number', 'password', 'password2', 'customer_id']
        extra_kwargs = {
            'password': {'write_only': True}
        }

    def save(self):
        password = self.validated_data['password']
        password2 = self.validated_data['password2']

        errors = {}
        if password != password2:
            errors['password'] = "The two paswwords must match."
        if 'customer_id' not in self.validated_data: 
            errors['customer_id'] = "The Customer ID cannot be empty."
        else:
            try:
                customer = Customer.objects.get(id=self.validated_data['customer_id'])
            except Customer.DoesNotExist:
                errors['customer_id'] = "This customer ID doest not exist."

        if 'last_name' not in self.validated_data: 
            errors['last_name'] = "The user last name is required."

        if 'username' in self.validated_data:
            users = User.objects.filter(username=self.validated_data['username'])
            if len(users) > 0:
                errors['username'] = "This user name is already used."
        
        if ('user_email' in self.validated_data) and (self.validated_data['user_email'].strip() != ''):
            users = User.objects.filter(email=self.validated_data['user_email'])
            if len(users) > 0:
                errors['user_email'] = "This email is already used."

        if ('phone_number' in self.validated_data) and (self.validated_data['phone_number'].strip() != ''):
            userprofiles = UserProfile.objects.filter(phone_number=self.validated_data['phone_number'])
            if len(userprofiles) > 0:
                errors['phone_number'] = "This phone number is already used."


        if len(errors) > 0:
            raise serializers.ValidationError(errors)
        
        """
        The list of user of this customer
        """
        userprofiles = UserProfile.objects.select_related('user').filter(customer=customer)
        issupperuser = False
        isactive = False
        isstaff = False
        if userprofiles.count() == 0:
            issupperuser = True
            isactive = True
            isstaff = True

        #print("user : Before")
        user = User(
            username=self.validated_data['username'],
            email=self.validated_data['user_email'].strip(),
            last_name=self.validated_data['last_name'],
            first_name=self.validated_data['first_name'],
            is_superuser=issupperuser,
            is_active=isactive,
            is_staff=isstaff
        )
        user.set_password(self.validated_data['password'])
        user.save()
        #print("user : ", user)

        userprofile = UserProfile(
            phone_number=self.validated_data['phone_number'].strip(),
            user=user,
            customer=customer
        )
        userprofile.save()
        #print("userprofile : ", userprofile)

        return userprofile


