from rest_framework import serializers
from service.models.services import Services
from company_benefits.serializers.service_benefits_serializer import CompanyBenefitsSerializer
from service_category.serializers.category_serializer import ServiceCategorySerializer
from company_service_offered.serializers.service_offered_serializers import CompanyServiceOfferedSerializer
from company_social_medias.serializers.serive_social_media_serializers import CompanySocialMediaSerializer
from contact_service_provider.serializers.contact_service_provider_serializer import ContactServiceProviderSerializer
from service_ownership.models.service_ownership import ServiceOwnership
from company_review.serializers.service_review_serializer import CompanyReviewSerializer
from service.serializers.summary_service_serializer import ReviewOnlySerializer
from django.db import models

class ServiceSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()
    # social_benefits = CompanyBenefitsSerializer(many=True, read_only=True)
    # # categories = ServiceCategorySerializer(many=True,read_only=True)
    # service_offered = CompanyServiceOfferedSerializer(many=True,read_only=True)
    # social_medias = CompanySocialMediaSerializer(many=True,read_only=True)
    # contact_service = ContactServiceProviderSerializer(many=True,read_only=True)
    image_url_path = serializers.SerializerMethodField('get_image_url')
    service_status = serializers.SerializerMethodField()

    class Meta:
        model = Services
        fields = ['id', 'company', 'category_services', 'service_category','name','country','state','city','image_url','image_url_path','service_status','created_by','sub_category']
        read_only_fields = ['id', 'created_at', 'updated_at','service_status']
# 'company_benefits','service_category','company_service_offered','service_social'

    def get_image_url(self, obj):
        request = self.context.get("request")
        if obj.image_url and hasattr(obj.image_url, 'url'):
            return request.build_absolute_uri(obj.image_url.url)
        return None
    
    def get_service_status(self, obj):
        try:
            return obj.service_ownership.get_service_status_display()
        except ServiceOwnership.DoesNotExist:
            return None
        
class ServiceSimpleSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()
    # social_benefits = CompanyBenefitsSerializer(many=True, read_only=True)
    # # categories = ServiceCategorySerializer(many=True,read_only=True)
    # service_offered = CompanyServiceOfferedSerializer(many=True,read_only=True)
    # social_medias = CompanySocialMediaSerializer(many=True,read_only=True)
    # contact_service = ContactServiceProviderSerializer(many=True,read_only=True)
    image_url_path = serializers.SerializerMethodField('get_image_url')
    total_reviews = serializers.SerializerMethodField()
    total_avg_star = serializers.SerializerMethodField() 
    # service_status = serializers.SerializerMethodField()

    class Meta:
        model = Services
        fields = ['id', 'company', 'name','image_url','image_url_path', 'total_reviews','total_avg_star']
        read_only_fields = ['id', 'created_at', 'updated_at']
# 'company_benefits','service_category','company_service_offered','service_social'

    def get_image_url(self, obj):
        request = self.context.get("request")
        if obj.image_url and hasattr(obj.image_url, 'url'):
            return request.build_absolute_uri(obj.image_url.url)
        return None
    
    def get_total_reviews(self, obj):
        return obj.service_review.count()

    def get_total_avg_star(self, obj):
        reviews = obj.service_review.all()
        if not reviews.exists():
            return 0.0
        avg = reviews.aggregate(models.Avg('review_star'))['review_star__avg']
        return round(avg or 0.0, 1)
    
class ServiceCarouselSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()
    # social_benefits = CompanyBenefitsSerializer(many=True, read_only=True)
    # # categories = ServiceCategorySerializer(many=True,read_only=True)
    # service_offered = CompanyServiceOfferedSerializer(many=True,read_only=True)
    # social_medias = CompanySocialMediaSerializer(many=True,read_only=True)
    # contact_service = ContactServiceProviderSerializer(many=True,read_only=True)
    image_url_path = serializers.SerializerMethodField('get_image_url')

    class Meta:
        model = Services
        fields = ['id','name','image_url','image_url_path']
        # read_only_fields = ['id', 'created_at', 'updated_at','service_status']
# 'company_benefits','service_category','company_service_offered','service_social'

    def get_image_url(self, obj):
        request = self.context.get("request")
        if obj.image_url and hasattr(obj.image_url, 'url'):
            return request.build_absolute_uri(obj.image_url.url)
        return None
    
    def get_service_status(self, obj):
        try:
            return obj.service_ownership.get_service_status_display()
        except ServiceOwnership.DoesNotExist:
            return None