from django.contrib.auth.hashers import make_password
from rest_framework import serializers
from . import models as sellerModel
from user import models as userModel
from user import serializers as userSerializer


class CompanySerializer(serializers.ModelSerializer):
    company_name = serializers.CharField(source='name')
    national_id = serializers.CharField(source='nationality_code')

    class Meta:
        model = sellerModel.Company
        fields = ('id', 'company_name', 'type', 'registration_number', 'national_id', 'economic_code', 'signatories')
        read_only_fields = ('id',)


class ProfileSerializer(serializers.ModelSerializer):
    address_info = userSerializer.AddressSerializer(required=True)
    company_info = CompanySerializer(required=False)

    class Meta:
        model = sellerModel.Seller
        fields = ('phone', 'account_type', 'logo', 'nationality_code', 'identifier', 'birthdate', 'shop_name', 'about',
                  'bank_account_id', 'wallet', 'email', 'first_name', 'last_name', 'password', 'mobile',
                  'gender', 'id', 'address_info', 'company_info')
        read_only_fields = ('id', 'wallet')
        ref_name = "SellerProfileSerializer"

    def create(self, validated_data):
        validated_data['password'] = make_password(validated_data['password'])
        validated_data['username'] = validated_data['mobile']
        address_data = validated_data.pop('address_info')
        company_data = {}
        if 'company_info' in validated_data:
            company_data = validated_data.pop('company_info')
        seller = sellerModel.Seller.objects.create(**validated_data)
        if company_data and validated_data['account_type'] == 'legal':
            sellerModel.Company.objects.create(seller=seller, **company_data)
        userModel.Address.objects.create(user=seller, **address_data)
        return seller

    def to_representation(self, instance):
        ret = super(ProfileSerializer, self).to_representation(instance)
        address_queryset = userModel.Address.objects.filter(user_id=instance.id)
        company_queryset = sellerModel.Company.objects.filter(seller_id=instance.id)
        address_serializer = userSerializer.AddressSerializer(address_queryset, many=True)
        company_serializer = CompanySerializer(company_queryset, many=True)
        address_data = address_serializer.data
        company_data = company_serializer.data
        extra_ret = {
            'address_info': address_data,
            'company_info': company_data,
        }
        ret.update(extra_ret)
        return ret


class ProfileUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = sellerModel.Seller
        fields = ('phone', 'account_type', 'logo', 'nationality_code', 'identifier', 'birthdate', 'shop_name', 'about',
                  'bank_account_id', 'wallet', 'email', 'first_name', 'last_name', 'password', 'mobile',
                  'gender', 'id')
        read_only_fields = ('id', 'wallet')
        ref_name = "SellerProfileUpdateSerializer"

    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 WarehouseSerializer(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 = sellerModel.Warehouse
        fields = ('id', 'name', 'province', 'province_name', 'city', 'city_name', 'address', 'location')
        read_only_fields = ('id',)


class FieldsSerializer(serializers.ModelSerializer):
    cars = serializers.ListField(
        child=serializers.IntegerField()
    )
    products = serializers.ListField(
        child=serializers.IntegerField()
    )

    class Meta:
        model = sellerModel.Seller
        fields = ('cars', 'products')


# class FieldsDetailSerializer(serializers.ModelSerializer):
#     car_name = serializers.CharField(source='car.name')
#     product_name = serializers.CharField(source='product.name')
#
#     class Meta:
#         model = sellerModel.Seller
#         fields = ('id', 'car', 'car_name', 'product', 'product_name')
#         read_only_fields = ('id',)


class DocumentsSerializer(serializers.ModelSerializer):
    class Meta:
        model = sellerModel.Documents
        exclude = ('seller',)
        read_only_fields = ('id', 'status')


class DuplicationSerializer(serializers.ModelSerializer):
    shop_name = serializers.CharField(required=False)
    bank_account_id = serializers.CharField(required=False)

    class Meta:
        model = sellerModel.Seller
        fields = ('shop_name', 'bank_account_id')
        ref_name = "SellerDuplicationSerializer"

    @staticmethod
    def validate_shop_name(value):
        if sellerModel.Seller.objects.filter(shop_name__iexact=value).exists():
            raise serializers.ValidationError("این نام قبلا استفاده شده است")
        return value

    @staticmethod
    def validate_bank_account_id(value):
        if sellerModel.Seller.objects.filter(bank_account_id__iexact=value).exists():
            raise serializers.ValidationError("این شماره شبا قبلا استفاده شده است")
        return value
