from django.contrib.auth.hashers import make_password
from rest_framework import serializers
from . import models as customerModel
from user import models as userModel
from user import serializers as userSerializer


class SignupSerializer(serializers.ModelSerializer):
    class Meta:
        model = customerModel.Customer
        fields = ('id', 'mobile', 'password', 'email')
        read_only_fields = ('id',)

    def create(self, validated_data):
        validated_data['password'] = make_password(validated_data['password'])
        validated_data['username'] = validated_data['mobile']
        customer = customerModel.Customer.objects.create(**validated_data)
        return customer


class SignupWithJustMobileSerializer(serializers.ModelSerializer):
    class Meta:
        model = customerModel.Customer
        fields = ('id', 'mobile')
        read_only_fields = ('id',)

    def create(self, validated_data):
        validated_data['username'] = validated_data['mobile']
        customer = customerModel.Customer.objects.create(**validated_data)
        return customer


class ProfileSerializer(serializers.ModelSerializer):
    address_info = userSerializer.AddressSerializer(required=True)

    class Meta:
        model = customerModel.Customer
        fields = ('phone', 'nationality_code', 'wallet', 'email', 'first_name', 'last_name', 'password', 'mobile',
                  'gender', 'id', 'address_info')
        read_only_fields = ('id', 'wallet')
        ref_name = "CustomerProfileSerializer"

    def to_representation(self, instance):
        ret = super(ProfileSerializer, self).to_representation(instance)
        queryset = userModel.Address.objects.filter(user_id=instance.id)
        serializer = userSerializer.AddressSerializer(queryset, many=True)
        data = serializer.data
        extra_ret = {
            'address_info': data
        }
        ret.update(extra_ret)
        return ret


class ProfileUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = customerModel.Customer
        fields = ('phone', 'nationality_code', 'wallet', 'email', 'first_name', 'last_name', 'password', 'mobile',
                  'gender', 'id')
        read_only_fields = ('id', 'wallet')
        ref_name = "CustomerProfileUpdateSerializer"

    def update(self, instance, validated_data):
        if 'password' in validated_data:
            validated_data['password'] = make_password(validated_data['password'])
        if 'mobile' in validated_data:
            validated_data['username'] = validated_data['mobile']
        return super(ProfileUpdateSerializer, self).update(instance, validated_data)


class RequestSerializer(serializers.ModelSerializer):
    class Meta:
        model = customerModel.Request
        fields = ('id', 'phone', 'name', 'product', 'car')
        read_only_fields = ('id',)
