from rest_framework import serializers
from . import models as userModel


class ProvincesListSerializer(serializers.ModelSerializer):
    class Meta:
        model = userModel.Province
        fields = '__all__'


class CitiesListSerializer(serializers.ModelSerializer):
    class Meta:
        model = userModel.City
        fields = '__all__'


class AddressSerializer(serializers.ModelSerializer):
    province_name = serializers.CharField(source='province.name', read_only=True)
    city_name = serializers.CharField(source='city.name', read_only=True)

    class Meta:
        model = userModel.Address
        fields = ('id', 'name', 'province', 'province_name', 'city', 'city_name', 'address', 'zipcode', 'location')
        read_only_fields = ('id',)


class LoginSerializer(serializers.ModelSerializer):
    class Meta:
        model = userModel.User
        fields = ('username', 'password')


class RegisterSerializer(serializers.ModelSerializer):
    mobile_number = serializers.CharField(source='mobile')
    verification_code = serializers.CharField(source='code')

    class Meta:
        model = userModel.Verification
        fields = ('mobile_number', 'verification_code')


class LogoutSerializer(serializers.Serializer):
    refresh = serializers.CharField()


class DuplicationSerializer(serializers.ModelSerializer):
    nationality_code = serializers.CharField(required=False)
    mobile = serializers.CharField(required=False)
    email = serializers.CharField(required=False)

    class Meta:
        model = userModel.User
        fields = ('nationality_code', 'mobile', 'email')
        ref_name = "UserDuplicationSerializer"

    @staticmethod
    def validate_nationality_code(value):
        if userModel.User.objects.filter(nationality_code__iexact=value).exists():
            raise serializers.ValidationError("این کدملی قبلا استفاده شده است")
        return value

    @staticmethod
    def validate_email(value):
        lower_email = value.lower()
        if userModel.User.objects.filter(email__iexact=lower_email).exists():
            raise serializers.ValidationError("این ایمیل قبلا استفاده شده است")
        return lower_email

    @staticmethod
    def validate_mobile(value):
        if userModel.User.objects.filter(mobile__iexact=value).exists():
            raise serializers.ValidationError("این شماره موبایل قبلا استفاده شده است")
        return value


class ChangePasswordSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, required=True)
    password2 = serializers.CharField(write_only=True, required=True)
    old_password = serializers.CharField(write_only=True, required=True)

    class Meta:
        model = userModel.User
        fields = ('old_password', 'password', 'password2')

    def validate(self, attrs):
        if attrs['password'] != attrs['password2']:
            raise serializers.ValidationError({"password": "پسورد ها یکسان نیستند."})
        return attrs

    def validate_old_password(self, value):
        user = self.context['request'].user
        if not user.check_password(value):
            raise serializers.ValidationError("کلمه عبور صحیح نیست.")
        return value

    def update(self, instance, validated_data):
        instance.set_password(validated_data['password'])
        instance.save()
        return instance


class MessageSerializer(serializers.ModelSerializer):
    class Meta:
        model = userModel.Message
        fields = ('id', 'title', 'message', 'jalali_created')
        read_only_fields = ('id', 'title', 'message', 'created')
