from apps.vendor.models import Vendor, VendorType

from rest_framework import serializers
from rest_framework.serializers import ModelSerializer



class VendorListAPISerializer(ModelSerializer):
    type = serializers.CharField(source='type.name', allow_null=True,)
    created_by = serializers.CharField(source='get_full_name', read_only=True)

    class Meta:
        model = Vendor
        fields = ('id', 'name', 'type', 'phone_no', 'email', 'created_by', 'deleted_at', 'note',)
        read_only_fields = fields


class VendorSerializer(serializers.ModelSerializer):
    type = serializers.PrimaryKeyRelatedField(queryset=VendorType.objects.all())

    class Meta:
        model = Vendor
        fields = ('id', 'name', 'type', 'phone_no',)



class VendorStoreAPISerializer(ModelSerializer):
    type = serializers.CharField(required=True, write_only=True)
    class Meta:
        model = Vendor
        fields = ('id', 'name', 'type', 'phone_no', 'email', 'note',)

    def validate(self, attrs):
        if 'type' in attrs and attrs.get('type').isnumeric():
            vendor_type = VendorType.objects.filter(id=attrs['type']).first()

            if not vendor_type:
                raise serializers.ValidationError({'invalid_vendor': 'Please enter proper vendor!'})

        if Vendor.objects.filter(email=attrs.get('email')).exclude(id=self.instance.id if self.instance else None).exists():
            raise serializers.ValidationError({'email': 'A vendor with this email already exists.'})

        return super().validate(attrs)


class VendorDeleteAPISerializer(ModelSerializer):
    class Meta:
        model = Vendor
        fields = ('id', 'name', 'type', 'phone_no',)
