from rest_framework import serializers
from .models import Listing, ListingTerms, ListingCategory, ListingCategoryService


class ListingTermsSerializer(serializers.ModelSerializer):
    class Meta:
        model = ListingTerms
        fields = ['term', 'note']


class ListingCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = ListingCategory
        fields = ['listing', 'vendor_category', 'description']


class ListingCategoryServiceSerializer(serializers.ModelSerializer):
    class Meta:
        model = ListingCategoryService
        fields = ['listing', 'vendor_category_services']


class ListingSerializer(serializers.ModelSerializer):
    terms = ListingTermsSerializer(many=True, required=False)
    categories = ListingCategorySerializer(many=True, required=False)
    services = ListingCategoryServiceSerializer(many=True, required=False)

    class Meta:
        model = Listing
        fields = ['title', 'description', 'deadline', 'note', 'categories', 'services', 'terms']

    def create(self, validated_data):
        terms_data = validated_data.pop('terms', [])
        categories_data = validated_data.pop('categories', [])
        services_data = validated_data.pop('services', [])
        listing = Listing.objects.create(**validated_data)
        for term_data in terms_data:
            ListingTerms.objects.create(listing=listing, **term_data)
        for category_data in categories_data:
            ListingCategory.objects.create(listing=listing, **category_data)
        for service_data in services_data:
            ListingCategoryService.objects.create(listing=listing, **service_data)
        return listing


class ListingRecentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Listing
        fields = ['title', 'created_at', 'deadline']


class ListingSingleAPISerializer(serializers.ModelSerializer):
    categories = ListingCategorySerializer(many=True, source='listingcategory_set')
    services = ListingCategoryServiceSerializer(many=True, source='listingcategoryservice_set')
    terms = ListingTermsSerializer(many=True, source='listingterms_set')

    class Meta:
        model = Listing
        fields = ['id', 'title', 'description', 'deadline', 'note', 'created_at', 'updated_at', 'categories', 'services', 'terms']
