from rest_framework import serializers
from api.models import (User)

from django.core.exceptions import ValidationError
from itrack.settings import TIME12HRSFORMAT, DATEFORMAT
from api.serializers.role import RoleDetailSerializer
from api.utils.messages.commonMessages import *
from api.utils.messages.userMessages import *


class UserLoginDetailSerializer(serializers.ModelSerializer):
    """
    Return the details of Login User.
    """
    dob = serializers.DateField(format=DATEFORMAT, input_formats=[DATEFORMAT])
    role = RoleDetailSerializer()
    
    class Meta(object):
        model = User
        fields = (
        'id', 'email', 'first_name', 'last_name', 'gender', 'dob', 'phone_no', 'address', 'image', 'image_name','role', 
        'is_active', 'is_deleted',
        )

class UserSignupSerializer(serializers.ModelSerializer):
    """
    create/update user .
    """
    class Meta:
        model = User
        fields = ('id', 'first_name', 'last_name', 'gender', 'dob', 'phone_no', 'address', 'email', 'password', 'otp')
        extra_kwargs = {
            'password': {'write_only': True},
            'otp': {'write_only': True}
        }        

    def create(self, validated_data):
        user = User(
            email=validated_data['email'].lower()
        )
        user.first_name = validated_data['first_name']
        user.last_name = validated_data['last_name']
        user.gender = validated_data['gender']
        user.dob = validated_data['dob']
        user.phone_no = validated_data['phone_no']
        user.address = validated_data['address']
        user.set_password(validated_data['password'])
        user.is_active = True
        user.save()

        return user

class UserPasswordSerializer (serializers.ModelSerializer):
    """
    This Serializer is for Update the password of user
    """

    class Meta (object):
        model = User
        fields = ('password',)

    def update(self, instance, validated_data):
        """
        Reset Password
        """
        instance.set_password (validated_data['password'])
        instance.otp = None
        instance.otp_send_time = None
        instance.save ()

        return instance


class UserSerializer (serializers.ModelSerializer):
    """
    Create and update Users.
    """

    # customer_social_media_link = CustomerSocialMediaLinkSerializer(many=True)
    dob = serializers.DateField (format=DATEFORMAT, input_formats=[DATEFORMAT])
    image = serializers.ImageField(required = False, allow_null=True)
    class Meta:
        model = User
        fields = ('id', 'email', 'first_name', 'last_name',
                  'password', 'gender', 'dob', 'phone_no', 'address', 'image', 'image_name',
                  'about_us',
                  'is_active', 'is_deleted',"role")
        extra_kwargs = {
            'password': {'write_only': True},
            'otp': {'write_only': True}
        }

    def create(self, validated_data):

        self.validate_customer_data (validated_data)

        user = User (
            email=validated_data['email'].lower ()
        )
        user.set_password(validated_data["password"])
        user.first_name = validated_data['first_name']
        user.last_name = validated_data['last_name']
        user.gender = validated_data['gender']
        user.phone_no = validated_data['phone_no']
        user.dob = validated_data['dob']
        user.role = validated_data['role'] 
        user.about_us = validated_data['about_us']

        if validated_data['image']:
            user.image = validated_data['image']

        user.is_active = True
        user.save ()

        if validated_data['image']:
            self.update_image_name (user)

        return user

    def update(self, instance, validated_data):
        """
        update customer
        """

        instance.email = validated_data['email'].lower()
        instance.first_name = validated_data.get ('first_name', instance.first_name)
        instance.last_name = validated_data.get ('last_name', instance.last_name)
        instance.gender = validated_data.get ('gender', instance.gender)
        instance.phone_no = validated_data.get ('phone_no', instance.phone_no)
        instance.dob = validated_data.get ('dob', instance.dob)
        instance.role = validated_data.get('role', instance.role)
        instance.about_us = validated_data.get('about_us', instance.about_us)

        if validated_data.get ('image') and type (validated_data.get ('image')) != 'str':
            instance.image = validated_data.get ('image', instance.image)

        instance.is_active = True

        instance.save ()

        # update uploaded image name
        if validated_data.get ('image') and type (validated_data.get ('image')) != 'str':
            self.update_image_name (instance)


        return instance


    def validate_customer_data(self, data):
        error = {}

        if not data['email'] or data['email'] == None:
            error.update ({'email': FIELD_REQUIRED})

        if 'email' in data:

            user = self.get_object_with_email_and_role(data['email'], data['role'].id)

            if user is not None:
                error.update ({'email': EMAIL_ALREADY_EXIST})

        if not data.get ('first_name') and data.get ('first_name') == '':
            error.update ({'first_name': FIELD_REQUIRED})


        if error:
            raise ValidationError (error)

        return data

    def get_object_with_email_and_role(self, email, role):
        try:
            return User.objects.get(email=email, role = role, is_deleted=0)

        except User.DoesNotExist:
            return None
    
    def update_image_name(self, instance):
        # update uploaded image name
        image_url = str (instance.image)
        print("image: ", image_url)
        image_name = image_url.replace ('customer/', '')
        instance.image_name = image_name
        instance.save ()

class UserDetailsSerailizer(serializers.ModelSerializer):
    """
    Return the details of Login User.
    """
    dob = serializers.DateField(format=DATEFORMAT, input_formats=[DATEFORMAT])
    role = RoleDetailSerializer()
    
    class Meta(object):
        model = User
        fields = (
        'id', 'email', 'first_name', 'last_name', 'gender', 'dob', 'phone_no', 'address', 'image', 'image_name','role', 'about_us',
        'is_active', 'is_deleted',
        )