
from rest_framework import serializers
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from authentication.models import User
from quotation.models import Technician_Assigned_Order_Item,Order_Item,Order,Technician_Comment,Invoice
from service.models import Service,Service_Request_image,Heading,SubHeading,Question,Answer,Parts_Request,Chat,ChatImage,Service_Signature,Accepted_Image
from user.models import UserInfo
from rest_framework.validators import ValidationError
from datetime import datetime
from product.models import  Product
from technician.models import CallDetail,Notification,Job_Time,Job_Interval_Time
from user.models import UserInfo
from datetime import timedelta
from customer.models import Customer,Customer_Info
from django.db.models import Q
from datetime import datetime
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer, TokenRefreshSerializer
from rest_framework_simplejwt.tokens import RefreshToken
from leads.models import Lead,Leadnote,Lead_Quote,LeadAttachmentPhotos,LeadAttachmentFiles
from fcm_django.models import FCMDevice

class NoteActionSerializer(serializers.Serializer):
    action_type = serializers.ChoiceField(choices=["mark_read", "update_log", "reschedule"])
    log_note = serializers.CharField(required=False, allow_blank=True)
    groupid = serializers.CharField(required=False)
    reschedule_date = serializers.DateField(  input_formats=["%d-%m-%Y", "%Y-%m-%d"],  required=False )
    
class LeadAttachmentPhotosSerializer(serializers.ModelSerializer):
    class Meta:
        model = LeadAttachmentPhotos
        fields = '__all__'
class LeadAttachmentFilesSerializer(serializers.ModelSerializer):
    class Meta:
        model = LeadAttachmentFiles
        fields = '__all__'
        # fields = ['id', 'lead', 'attachment', 'created_by', 'updated_by', 'created_at', 'updated_at']
        # read_only_fields = ['created_by', 'updated_by', 'created_at', 'updated_at']
# class RoleSerializer(serializers.ModelSerializer):
#     class Meta:
#         model = Role  # replace with your actual Role model
#         fields = ['id', 'name']  # include fields you need
class LeadQuoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Lead_Quote
        fields = ['id', 'lead', 'attachment', 'mailstatus','version',  'created_by']
        read_only_fields = ['id', 'created_by', 'mailstatus']
        
class LeadQuoteListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Lead_Quote
        fields = ['id', 'lead', 'attachment', 'mailstatus','version', 'created_by', 'created_at']
        
class UserSerializer(serializers.ModelSerializer):
    # role = RoleSerializer()

    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'first_name', 'last_name']
        
class LeadNoteCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Leadnote
        fields = '__all__'

class LeadSerializer(serializers.ModelSerializer):
    products = serializers.ListField(
        child=serializers.IntegerField(), required=False, allow_empty=True
    )

    class Meta:
        model = Lead
        fields = '__all__'
        
class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name', 'price', 'description']
# class SalesUsersSerializer(serializers.ModelSerializer):
#     class Meta:
#         model = Product
#         fields = ['id', 'name', 'price', 'description']
class TokenRefreshLifetimeSerializer(TokenRefreshSerializer):

    def validate(self, attrs):
        try:
            data = super().validate(attrs)
            token = RefreshToken(attrs['refresh'])
            new_access = str(token.access_token)
            author, created = TokenAuthentication.objects.get_or_create(user_id = token.payload['user_id'],defaults={'access': new_access})
            if not created:
                author.access = new_access
                author.save()
            get_fcm_device = FCMDevice.objects.get(user_id = token.payload['user_id'])
            get_fcm_device.active = False
            get_fcm_device.save()
            token.blacklist()
            # print(refresh.access_token)
            # print(refresh.__dir__())
            # print()
            # data['access_token'] = refresh['access_token']
            # data['lifetime'] = int(refresh.access_token.lifetime.total_seconds())
            # user_instance = User.objects.get(id = )
            return {
                "status":status.HTTP_200_OK,
                "success":True,
                "error_status":False,
            }
        except Exception as exception:
            return {
                'status':status.HTTP_200_OK,
                "success":True,
                'error_status':False,
            }





class TechnicianTokenSerializer(TokenObtainPairSerializer):

    username_field = User.USERNAME_FIELD


class UniqueTechnicianAssignedOrderSerializer(serializers.ListSerializer):
    def to_representation(self, data):
        data = super().to_representation(data)
        unique_order_ids = set()

        unique_data = []
        for item in data:
            print(item)
            if item["order_id"] not in unique_order_ids:
                unique_data.append(item)
                unique_order_ids.add(item["order_id"])

        return unique_data

class AssignedOrderSerializer(serializers.ModelSerializer):
    order_id = serializers.IntegerField(source='order_item.order.id', read_only=True)
    customer = serializers.CharField(source='order_item.order.invoice.customer', read_only=True)
    installation_date = serializers.DateField(format='%d-%m-%Y')
    installation_time= serializers.TimeField()
    booking_date = serializers.DateField(format='%d-%m-%Y')
    class Meta:
        model = Technician_Assigned_Order_Item
        fields = ['order_id', 'customer','booking_date','installation_date','installation_time','technician']
        list_serializer_class = UniqueTechnicianAssignedOrderSerializer

class DateFormattedField(serializers.DateField):
    def to_internal_value(self, value):
        try:
            return datetime.strptime(value, '%d-%m-%Y').date()
        except ValueError:
            raise serializers.ValidationError('Invalid date format. Use dd-mm-yyyy.')

    def to_representation(self, value):
        return value.strftime('%d-%m-%Y')
        
        
        
class CallDetail_Serializer(serializers.ModelSerializer):
    
    caller_type = serializers.CharField(source='get_caller_type_display', read_only=True)
    call_time = serializers.DateTimeField(format='%b %d, %Y %I:%M %p')
    phone = serializers.CharField(required=False, allow_null=True)
    class Meta:
        model = CallDetail
        fields = ['call_time','call_duration','caller_type','phone']
        
class ServiceRequestImageSerializer(serializers.ModelSerializer):
    service_request_image = serializers.ImageField(required=False, allow_null=True)
    service_request_video = serializers.FileField(required=False, allow_null=True)

    class Meta:
        model = Service_Request_image
        fields = ['service_request_image','service_request_video']
        
class RequestImageSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Service_Request_image
        fields = ['service_request_image']
        
class RequestvideoSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Service_Request_image
        fields = ['service_request_video']
                
                
        
        
        
class ServiceSerializer(serializers.ModelSerializer):
    service_request_images = RequestImageSerializer(many=True, source='service_request', read_only=True)
    service_request_videos = RequestvideoSerializer(many=True, source='service_request', read_only=True)

    class Meta:
        model = Service
        fields = ['order_item', 'comment', 'title', 'description', 'service_request_images', 'service_request_videos']
        
        
                
        
class AssignedItemSerializer(serializers.ModelSerializer):
    
    order_item_id = serializers.IntegerField(source='order_item.id', read_only=True)
    product = serializers.CharField(source='order_item.product', read_only=True)
    customer = serializers.CharField(source='order_item.order.invoice.customer', read_only=True)
    city = serializers.CharField(source='order_item.order.invoice.customer.city', read_only=True)
    country = serializers.CharField(source='order_item.order.invoice.customer.country', read_only=True)
    state = serializers.CharField(source='order_item.order.invoice.customer.state', read_only=True)
    street = serializers.CharField(source='order_item.order.invoice.customer.street', read_only=True)
    phone1 = serializers.CharField(source='order_item.order.invoice.customer.phone1', read_only=True)
    email = serializers.CharField(source='order_item.order.invoice.customer.email', read_only=True)    # def to_representation(self, instance):
    #     representation = super().to_representation(instance)
    #     representation['service_type'] = instance.get_service_type_display()
    #     representation['working_status'] = instance.get_working_status_display()
        
    #     return representation
    
    sku=serializers.CharField(source='order_item.product.sku', read_only=True)
    view_by_technician=serializers.CharField(source='order_item.view_by_technician')
    installation_complete=serializers.CharField(source='order_item.installation_complete')
    # installation_time = serializers.TimeField(format='%I:%M:%S %p', input_formats=['%I:%M:%S %p',])
    installation_date = DateFormattedField()
    
    # service_request_time = serializers.TimeField(format='%I:%M:%S %p', input_formats=['%I:%M:%S %p',])
    # service_request_date = DateFormattedField()
    booking_date = serializers.DateField(format='%d-%m-%Y')
    latitude = serializers.CharField(source='order_item.latitude', read_only=True)
    longitude= serializers.CharField(source='order_item.longitude', read_only=True)
    call_details = CallDetail_Serializer(many=True, read_only=True)
    service=ServiceSerializer()
   
    job_status = serializers.SerializerMethodField()
    serial_number = serializers.SerializerMethodField()
    def get_serial_number(self, instance):
        if instance.order_item.is_trade==0:
            return instance.order_item.serial_number.serial_number
        else:
            return ' '
    def get_job_status(self, instance):
        return instance.order_item.get_status_display()
    

    class Meta:
        model = Technician_Assigned_Order_Item
        fields = ['id','order_item_id', 'product','sku' ,'booking_date','latitude','longitude','call_details','installation_date','installation_time','job_status','status','comment','view_by_technician','installation_complete','customer','country','state','street','city','phone1','email','service','serial_number']
        


class AssignedJobsSerializer(serializers.ModelSerializer):
    job_id = serializers.IntegerField(source='id', read_only=True)
    order_item_id = serializers.IntegerField(source='order_item.id', read_only=True)
    product = serializers.CharField(source='order_item.product', read_only=True)
    product_image = serializers.CharField(source='order_item.product.product_image_main', read_only=True)
    customer = serializers.CharField(source='order_item.order.invoice.customer', read_only=True)
    city = serializers.CharField(source='order_item.order.invoice.customer.city', read_only=True)
    country = serializers.CharField(source='order_item.order.invoice.customer.country', read_only=True)
    state = serializers.CharField(source='order_item.order.invoice.customer.state', read_only=True)
    street = serializers.CharField(source='order_item.order.invoice.customer.street', read_only=True)
    phone1 = serializers.CharField(source='order_item.order.invoice.customer.phone1', read_only=True)
    postcode = serializers.CharField(source='order_item.order.invoice.customer.post_code', read_only=True)
    email = serializers.CharField(source='order_item.order.invoice.customer.email', read_only=True)
    
    sku=serializers.CharField(source='order_item.product.sku', read_only=True)
    is_trade=serializers.IntegerField(source='order_item.product.is_product', read_only=True)
    installation_complete=serializers.CharField(source='order_item.installation_complete')
    # installation_time = serializers.TimeField(format='%I:%M:%S %p', input_formats=['%I:%M:%S %p',])
    installation_date = DateFormattedField()
    
    # service_request_time = serializers.TimeField(format='%I:%M:%S %p', input_formats=['%I:%M:%S %p',])
    # service_request_date = DateFormattedField()
    booking_date = serializers.DateField(format='%d-%m-%Y')
    latitude = serializers.CharField(source='order_item.latitude', read_only=True)
    longitude= serializers.CharField(source='order_item.longitude', read_only=True)
    call_details = CallDetail_Serializer(many=True, read_only=True)
    service=ServiceSerializer()
    type = serializers.SerializerMethodField(read_only=True)
    notify_counter_technician = serializers.SerializerMethodField()
    notify_counter_customer = serializers.SerializerMethodField()

    serial_number = serializers.SerializerMethodField()
    def get_serial_number(self, obj):
        if obj.order_item.is_trade==0:
            return obj.order_item.serial_number.serial_number
        else:
            return ' '
    def get_type(self, obj):
        return obj.order_item.get_service_type_display()
        
    job_status = serializers.SerializerMethodField()
    total_job_time = serializers.SerializerMethodField()

    def get_job_status(self, instance):
        return instance.order_item.get_status_display()
        
    job_type = serializers.SerializerMethodField()    
    def get_job_type(self, instance):
        return instance.get_job_type_display()    
    
    def get_notify_counter_technician(self, instance):
        if instance:
            print(instance.id)
            chatsCount = Chat.objects.filter(  Q(recipient=instance.technician.id) & Q(job__id=instance.id) & Q(is_read=0)   ).count()
            return chatsCount
    def get_notify_counter_customer(self, instance):
        if instance:
            chatsCount = Chat.objects.filter(   Q(sender=instance.technician.id) & Q(job__id=instance.id) & Q(is_read=0)   ).count()
            return chatsCount  
        
    def get_total_job_time(self, obj):

        jobs = obj.technician_jobs.all()

        total_job_seconds = sum((job.total_job_time.seconds if job.total_job_time else 0) for job in jobs)

        hours, remainder = divmod(total_job_seconds, 3600)
        minutes, seconds = divmod(remainder, 60)

        
        
        if hours == 0 and minutes == 0 and seconds == 0:
            return '00:00:00'
    
        formatted_time = ''
    
        if hours > 0:
            formatted_time += f"{int(hours):02d}:"
        else:
            formatted_time += f"{int(hours):02d}:"
        
        if minutes > 0 or hours > 0:
            formatted_time += f"{int(minutes):02d}:"
        else:
            formatted_time += f"{int(hours):02d}:"
    
        formatted_time += f"{int(seconds):02d}"
    
        return formatted_time
        
        
    def get_total_job_interval_time(self, obj):

        jobs = obj.technician_jobs_interval.all()

        total_job_seconds = sum((job.total_time_timer.seconds if job.total_time_timer else 0) for job in jobs)

        hours, remainder = divmod(total_job_seconds, 3600)
        minutes, seconds = divmod(remainder, 60)

        
        
        if hours == 0 and minutes == 0 and seconds == 0:
            return '00:00:00'
    
        formatted_time = ''
    
        if hours > 0:
            formatted_time += f"{int(hours):02d}:"
        else:
            formatted_time += f"{int(hours):02d}:"
        
        if minutes > 0 or hours > 0:
            formatted_time += f"{int(minutes):02d}:"
        else:
            formatted_time += f"{int(hours):02d}:"
    
        formatted_time += f"{int(seconds):02d}"
    
        return formatted_time
        
        
    checklist_pdf = serializers.SerializerMethodField()    
    def get_checklist_pdf(self, instance):
        request = self.context.get('request')
        if instance.pdf_file and hasattr(instance.pdf_file, 'url'):
            base_url =  settings.BASE_URL
            return f"{base_url}{instance.pdf_file.url}"
        return None      
    job_complete_datetime = serializers.SerializerMethodField()   
    def get_job_complete_datetime(self, obj):
        if obj.job_complete_datetime:
            return obj.job_complete_datetime.strftime('%d-%m-%Y %H:%M:%S')
        return None
    job_created_date =serializers.SerializerMethodField()
    job_created_time =serializers.SerializerMethodField()
    def get_job_created_date(self, obj):
        if obj.created_at:
            return obj.created_at.strftime('%d-%m-%Y')
        return None
    def get_job_created_time(self, obj):
        if obj.created_at:
            return obj.created_at.strftime('%H:%M:%S')
        return None
    is_selected_warranty = serializers.SerializerMethodField()  
    def get_is_selected_warranty(self, obj):
        if obj.service:
            return obj.service.is_selected_warranty
        return None
    class Meta:
        model = Technician_Assigned_Order_Item
        # def get_job_complete_datetime(self, instance):
        #     request = self.context.get('request')
        #     if instance.job_complete_datetime:
        #         job_complete_datetime =  instance.job_complete_datetime.strftime('%d-%m-%Y %H:%M:%S')
        #         return job_complete_datetime
        #     return None
        fields = ['job_id','order_item_id','job_type','job_created_date','job_created_time', 'is_selected_warranty','is_trade','product','product_image','sku' ,'booking_date','latitude','longitude','call_details','installation_date','installation_time','job_status','total_job_time','status','comment','view_by_technician','installation_complete','customer','country','state','street','city','phone1','postcode','email','service','type','total_job_interval_time','checklist_pdf','created_at','job_complete_datetime','notify_counter_customer','notify_counter_technician','serial_number']
        



class JobStartStopSerializer(serializers.Serializer):
    action = serializers.CharField()

    def validate_action(self, value):
        valid_actions = ['start', 'stop']

        if value not in valid_actions:
            raise serializers.ValidationError("Invalid action. Use 'start' or 'stop'.")
        
        return value
        



class JobTimeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Job_Time
        fields = '__all__'







class ForgotPasswordSerializer(serializers.Serializer):
    email = serializers.EmailField()



class PasswordResetSerializer(serializers.Serializer):
    new_password = serializers.CharField(write_only=True)
    confirm_password = serializers.CharField(write_only=True)
    
    
    
class JobsViewTechnicianSerializer(serializers.ModelSerializer):
    
    view_by_technician=serializers.CharField(required=True)
    class Meta:
        model = Technician_Assigned_Order_Item
        fields = ['view_by_technician']

    error_messages = {
        'view_by_technician': {
            'required': 'The view_by_technician field is required.',
            'blank': 'The view_by_technician field cannot be blank.',
        }
    }
    
    
class TechnicianUpdateInstallationStatusSerializer(serializers.ModelSerializer):
    
    installation_complete=serializers.CharField(required=True)
    class Meta:
        model = Order_Item
        fields = ['installation_complete']    
    
    

class TechnicianCommentSerializer(serializers.ModelSerializer):
    installation_date = DateFormattedField()
    
    comment=serializers.CharField()
  
    class Meta:
        model = Technician_Comment
        fields = ['technician_assigend_order_item','comment','installation_date','installation_time']
        
        
# class NotificationSerializer(serializers.ModelSerializer):
#     order_id = serializers.IntegerField(source='order_item.order.id', read_only=True)
#     customer = serializers.CharField(source='order_item.order.invoice.customer', read_only=True)
#     # notification_count = serializers.SerializerMethodField(read_only=True)
#     notification_count = serializers.SerializerMethodField()
#     class Meta:
#         model = Technician_Assigned_Order_Item
#         fields = ['order_id','customer','notification_count']

#     def get_notification_count(self, instance):
#         return instance.notification_count


class NotificationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Notification
        fields = ['id','order_id']
    

    

    
    





# class NotificationSerializer(serializers.ModelSerializer):
#     order_id = serializers.IntegerField(source='order_item.order.id', read_only=True)
#     customer = serializers.CharField(source='order_item.order.invoice.customer', read_only=True)
#     # notification_count = serializers.SerializerMethodField(read_only=True)
#     notification_count = serializers.SerializerMethodField()
#     class Meta:
#         model = Technician_Assigned_Order_Item
#         fields = ['order_id','customer','notification_count']

#     def get_notification_count(self, instance):
#         return instance.notification_count

class NotificationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Notification
        fields = ['id','order_id']

# customer 

class ServiceRequestSerializer(serializers.ModelSerializer):
    class Meta:
        model = Service
        fields = ['order_item','comment','service_request_image']    
    
    

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'product_name','sku']        
        
# def CustomerOrderSerializer(serializers.ModelSerializer):
#         # Replace 'order_item' with the actual related name in your ForeignKey definition
#         order_id = obj.id
#         technician_items = Technician_Assigned_Order_Item.objects.filter(order_item__order__id=order_id).exclude(job_status=4)
#         # Use TechnicianAssignedOrderItemSerializer to serialize the filtered items
#         serializer = AssignedOrderItemDetailSerializer(instance=technician_items, many=True)
#         return serializer.data       
class CustomerOrderSerializer(serializers.ModelSerializer):
    order_status = serializers.SerializerMethodField()
    order_id = serializers.IntegerField(source='id')
    order_date = serializers.DateField(format='%d-%m-%Y')
    total_price = serializers.CharField(source='invoice.total', read_only=True)
    job = serializers.SerializerMethodField()
    # serial_number = serializers.SerializerMethodField()
    # def get_serial_number(self, instance):
    #     if instance.order_item.is_trade==0:
    #         return instance.order_item.serial_number.serial_number
    #     else:
    #         return ' '
    class Meta:
        model = Order
        fields = ['order_id','order_date','order_status','total_price' ,'job']
    
    
    def get_job(self, obj):
        # Replace 'order_item' with the actual related name in your ForeignKey definition
        order_id = obj.id
        technician_items = Technician_Assigned_Order_Item.objects.filter(order_item__order__id=order_id).exclude(job_status=4)
        # Use TechnicianAssignedOrderItemSerializer to serialize the filtered items
        serializer = AssignedOrderItemDetailSerializer(instance=technician_items, many=True)
        return serializer.data
        
    def get_order_status(self, obj):
        order_list = [order_item.get_status for order_item in obj.orderset.filter().order_by('-updated_at')]
    
        if order_list:
            order_status = order_list[0]
            return order_status
        else:
            return None  
        
class UserInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserInfo
        fields = ['first_name', 'last_name'] 
        

class ChatImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = ChatImage
        fields = ['chat_image']
 


        
        
class ChatSerializer(serializers.ModelSerializer):
    chat_images = ChatImageSerializer(many=True, required=False)
  
    sender = serializers.SerializerMethodField()
    recipient = serializers.SerializerMethodField()
    timestamp_formatted = serializers.DateTimeField(source='timestamp',format='%b %d, %Y %I:%M:%S %p')
    class Meta:
        model = Chat
        fields = ['id', 'job', 'sender', 'recipient', 'content', 'timestamp', 'is_visible', 'chat_images','timestamp_formatted']

    def get_username(self, user):
        if user.role.filter(id__in=[3, 4]).exists():
            if user.role.filter(id=3).exists():
                return f"{user.userinfo.first_name.capitalize()} {user.userinfo.last_name.capitalize()}"
            else:
                try:
                    customer = Customer.objects.get(email=user.email)
                    return f"{customer}"
                except Customer.DoesNotExist:
                    customer = Customer_Info.objects.get(email=user.email)
                    return f"{customer}" 
                
        else:
            return None  # Or return a default value if no conditions are met

    def get_sender(self, chat):
        return self.get_username(chat.sender)

    def get_recipient(self, chat):
        return self.get_username(chat.recipient) 
     

        
    
class UserInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserInfo
        fields = ['first_name', 'last_name','phone1']
        
        
        
   
        
from django.db.models import Sum        
class JobTimeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Job_Time
        fields = ['total_job_time']

class TechnicianAssignedOrderItemSerializer(serializers.ModelSerializer):
    technician_info = UserInfoSerializer(source='technician.userinfo', read_only=True)
    total_job_time = serializers.SerializerMethodField()
    def get_total_job_time(self, obj):
        # Calculate the total job time for the Technician_Assigned_Order_Item
        jobs = obj.technician_jobs.all()
        total_job_seconds = sum((job.total_job_time.seconds if job.total_job_time else 0) for job in jobs)
        hours, remainder = divmod(total_job_seconds, 3600)
        minutes, seconds = divmod(remainder, 60)
        if hours == 0 and minutes == 0 and seconds == 0:
            return '00:00:00'
        formatted_time = ''
        if hours > 0:
            formatted_time += f"{int(hours):02d}:"
        
        if minutes > 0 or hours > 0:
            formatted_time += f"{int(minutes):02d}:"
    
        formatted_time += f"{int(seconds):02d}"
    
        return formatted_time
    # status= "Service Requested",
    # installation_date="16-07-2024",
    # installation_time= "10:00:00",
    # job_type="Installation",
    # working_status="Installed",
    # checklist_pdf="https://ea.stagingstorm.com/media/checklist_pdfs/job_1_GZ0nHiE.pdf",
    # is_trade=0,
    # created_at="2024-07-16T12:07:12.746165+10:00",
    # notify_counter_customer=0,
    # notify_counter_technician=0,
    # serial_number="EB123"
    


    class Meta:
        model = Technician_Assigned_Order_Item
        fields = ['id', 'technician_info','total_job_time','is_signature' ]
        read_only_fields = ['id', 'technician_info', 'total_job_time', 'is_signature']
        
        

from django.conf import settings

class AssignedOrderItemDetailSerializer(serializers.ModelSerializer):
    technician_info = UserInfoSerializer(source='technician.userinfo', read_only=True)
    total_job_time = serializers.SerializerMethodField()
    def get_total_job_time(self, obj):
        # Calculate the total job time for the Technician_Assigned_Order_Item
        jobs = obj.technician_jobs.all()
        total_job_seconds = sum((job.total_job_time.seconds if job.total_job_time else 0) for job in jobs)

        hours, remainder = divmod(total_job_seconds, 3600)
        minutes, seconds = divmod(remainder, 60)

        if hours == 0 and minutes == 0 and seconds == 0:
            return '00:00:00'
    
        formatted_time = ''
    
        if hours > 0:
            formatted_time += f"{int(hours):02d}:"
        
        if minutes > 0 or hours > 0:
            formatted_time += f"{int(minutes):02d}:"
    
        formatted_time += f"{int(seconds):02d}"
    
        return formatted_time
    
    status = serializers.SerializerMethodField()
    checklist_pdf = serializers.SerializerMethodField()
    job_type = serializers.SerializerMethodField()
    working_status = serializers.SerializerMethodField()
    is_trade=serializers.SerializerMethodField()
    installation_date=serializers.SerializerMethodField()
    notify_counter_technician = serializers.SerializerMethodField()
    notify_counter_customer = serializers.SerializerMethodField()
    # created_at=serializers.SerializerMethodField()
    def get_installation_date(self, obj):
        if obj.installation_date:
            return obj.installation_date.strftime('%d-%m-%Y')
        return None
    job_created_date =serializers.SerializerMethodField()
    job_created_time =serializers.SerializerMethodField()
    def get_job_created_date(self, obj):
        if obj.created_at:
            return obj.created_at.strftime('%d-%m-%Y')
        return None
    def get_job_created_time(self, obj):
        if obj.created_at:
            return obj.created_at.strftime('%H:%M:%S')
        return None
    def get_checklist_pdf(self, obj):
        request = self.context.get('request')
        if obj.pdf_file and hasattr(obj.pdf_file, 'url'):
            base_url =  settings.BASE_URL
            return f"{base_url}{obj.pdf_file.url}"
        return None    
        
        # base_url =  settings.BASE_URL
        # pdf_id = instance.pk  # Assuming the PDF ID is the primary key of the instance
        # return f"{base_url}view-pdf/{pdf_id}/"
      
    def get_notify_counter_technician(self, instance):
        if instance:
            print(instance.id)
            chatsCount = Chat.objects.filter(  Q(recipient=instance.technician.id) & Q(job__id=instance.id) & Q(is_read=0)   ).count()
            return chatsCount
    def get_notify_counter_customer(self, instance):
        if instance:
            chatsCount = Chat.objects.filter(   Q(sender=instance.technician.id) & Q(job__id=instance.id) & Q(is_read=0)   ).count()
            return chatsCount
    
    def get_status(self, instance):
        return instance.order_item.get_status_display()
        
  
    def get_job_type(self, instance):
        return instance.get_job_type_display()   
        
    def get_working_status(self, instance):
        # if instance.get_working_status_display() == "Completed Installation":
        #     return "Installed"
        return instance.get_working_status_display()
    def get_is_trade(self, instance):
        return instance.order_item.is_trade
    serial_number = serializers.SerializerMethodField()
    def get_serial_number(self, instance):
        if instance.order_item.is_trade==0:
            return instance.order_item.serial_number.serial_number
        else:
            return ' '
    product = serializers.SerializerMethodField()
    def get_product(self, obj):
        # Replace 'order_item' with the actual related name in your ForeignKey definition
        pitem = obj.order_item.product
        # Use TechnicianAssignedOrderItemSerializer to serialize the filtered items
        serializer = ProductSerializer(instance=pitem, many=False)
        return serializer.data
    is_selected_warranty = serializers.SerializerMethodField()  
    def get_is_selected_warranty(self, obj):
        if obj.service:
            return obj.service.is_selected_warranty
        return None
    # product = ProductSerializer()
    class Meta:
        model = Technician_Assigned_Order_Item
        fields = ['id','product' ,'technician_info','total_job_time','job_created_date','job_created_time','is_selected_warranty','is_signature','status','installation_date','installation_time','job_type','working_status','checklist_pdf','is_trade','created_at','notify_counter_customer','notify_counter_technician','serial_number']
        
    # def to_representation(self, instance):
    #     # Check job_status and exclude if it's 4
    #     if instance.job_status == 4:
    #         return {}

    #     # Your existing to_representation logic here
    #     data = super().to_representation(instance)
    #     return data
class TechnicianServiceAssignedOrderItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Technician_Assigned_Order_Item
        fields = '__all__'
  
class CustomerOrderItemSerializer(serializers.ModelSerializer):
    order_item_id = serializers.IntegerField(source='id')
    order_date= serializers.DateField(format='%d-%m-%Y',source='order.order_date', read_only=True)
    installation_date = DateFormattedField()
    warranty_end_date = serializers.DateField(format='%d-%m-%Y',read_only=True)
    installed_date=serializers.DateField(format='%d-%m-%Y',read_only=True)
    type = serializers.CharField(source='get_service_type_display',read_only=True)
    # technician = TechnicianAssignedOrderItemSerializer(source='order_item', many=True, read_only=True, filter={'job_status__ne': 4})
    # technician = serializers.SerializerMethodField()
    installation_time= serializers.TimeField()
    get_status=serializers.SerializerMethodField()
    # is_trade=serializers.IntegerField(source='order_item.product.is_product', read_only=True)
    serial_number = serializers.SerializerMethodField()
    def get_serial_number(self, instance):
        if instance.is_trade==0:
            return instance.serial_number.serial_number
        else:
            return ' '
    def get_get_status(self, instance):
        return instance.get_status
    job = serializers.SerializerMethodField()
    

    
    product = ProductSerializer()
    class Meta:
        model = Order_Item

        fields = ['order_item_id', 'product','order_date','installation_date','installation_time','view_by_technician','installation_complete','warranty_end_date','get_status','installed_date','job','type','serial_number']

    
    
    # def get_technician(self, obj):
    #     # Replace 'order_item' with the actual related name in your ForeignKey definition
    #     technician_items = obj.order_item.exclude(job_status=4)

    #     # Use TechnicianAssignedOrderItemSerializer to serialize the filtered items
    #     serializer = TechnicianAssignedOrderItemSerializer(instance=technician_items, many=True)

    #     return serializer.data
    

    def get_job(self, obj):
        # Replace 'order_item' with the actual related name in your ForeignKey definition
        technician_items = obj.order_item
        # Use TechnicianAssignedOrderItemSerializer to serialize the filtered items
        serializer = AssignedOrderItemDetailSerializer(instance=technician_items, many=True)
        return serializer.data


class CustomerWarrantyOrderSerializer(serializers.ModelSerializer):
    order_item_id = serializers.IntegerField(source='id')
    order_date= serializers.DateField(format='%d-%m-%Y',source='order.order_date', read_only=True)
    installation_date = DateFormattedField()
    warranty_end_date = serializers.DateField(format='%d-%m-%Y',read_only=True)
    installed_date=serializers.DateField(format='%d-%m-%Y',read_only=True)
    type = serializers.CharField(source='get_service_type_display',read_only=True)
    serial_number = serializers.SerializerMethodField()
    def get_serial_number(self, instance):
        if instance.is_trade==0:
            return instance.serial_number.serial_number
        else:
            return ' '
    product = ProductSerializer()
    class Meta:
        model = Order_Item
        fields = ['order','order_item_id','product','order_date','installation_date','view_by_technician','installation_complete','warranty_end_date','get_status','installed_date','type','serial_number']
        
class CustomerServiceOrderSerializer(serializers.ModelSerializer):
    order_item_id = serializers.IntegerField(source='id')
    order_date= serializers.DateField(format='%d-%m-%Y',source='order.order_date', read_only=True)
    installation_date = DateFormattedField()
    warranty_end_date = serializers.DateField(format='%d-%m-%Y',read_only=True)
    installed_date=serializers.DateField(format='%d-%m-%Y',read_only=True)
    type = serializers.CharField(source='get_service_type_display',read_only=True)
    serial_number = serializers.SerializerMethodField()
    def get_serial_number(self, instance):
        if instance.is_trade==0:
            return instance.serial_number.serial_number
        else:
            return ' '
    job = serializers.SerializerMethodField()
    def get_job(self, obj):
        # Replace 'order_item' with the actual related name in your ForeignKey definition
        order_id = obj.id
        technician_items = Technician_Assigned_Order_Item.objects.filter(order_item__order__id=order_id,job_type=2).exclude(job_status=4)
        # Use TechnicianAssignedOrderItemSerializer to serialize the filtered items
        serializer = AssignedOrderItemDetailSerializer(instance=technician_items, many=True)
        return serializer.data
    product = ProductSerializer()
    class Meta:
        model = Order_Item
        fields = ['order','order_item_id','product','order_date','installation_date','view_by_technician','installation_complete','warranty_end_date','get_status','installed_date','type','serial_number','job']
        
  


# class CustomerServiceOrderSerializer(serializers.ModelSerializer):
#     order_item_id = serializers.IntegerField(source='id')
#     order_date= serializers.DateField(format='%d-%m-%Y',source='order.order_date', read_only=True)
#     installation_date = DateFormattedField()
#     warranty_end_date = serializers.DateField(format='%d-%m-%Y',read_only=True)
#     installed_date=serializers.DateField(format='%d-%m-%Y',read_only=True)
#     type = serializers.CharField(source='get_service_type_display',read_only=True)
#     serial_number = serializers.SerializerMethodField()
#     def get_serial_number(self, instance):
#         if instance.order_item.is_trade==0:
#             return instance.order_item.serial_number.serial_number
#         else:
#             return ' '
#     product = ProductSerializer()
#     class Meta:
#         model = Order_Item
#         fields = ['order','order_item_id', 'product','order_date','installation_date','view_by_technician','installation_complete','warranty_end_date','get_status','installed_date','type','serial_number']













    



class HeadingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Heading
        fields = ['id', 'heading']

class SubheadingSerializer(serializers.ModelSerializer):
   
    class Meta:
        model = SubHeading
        fields = ['id', 'heading', 'subheading']








class HeadingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Heading
        fields = ['id', 'heading']

class SubheadingSerializer(serializers.ModelSerializer):
    class Meta:
        model = SubHeading
        fields = ['id', 'heading', 'subheading']

class QuestionSerializer(serializers.ModelSerializer):
    heading = HeadingSerializer()
    subheading = SubheadingSerializer()
  
    class Meta:
        model = Question
        fields = ['id', 'heading', 'subheading', 'question']

class QuestionAnsSerializer(serializers.ModelSerializer):
    question = QuestionSerializer()
    class Meta:
        model = Answer
        fields = [ 'question','answer','comment']

class AnswerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Answer
        fields = ['id', 'technician_assigned_job', 'question', 'answer','comment']
        read_only_fields = ['id', 'technician_assigned_job', 'question']
        

        
class PartsRequestSerializer(serializers.ModelSerializer):
    comment=serializers.SerializerMethodField()
    def get_comment(self, obj):
        ans=Answer.objects.get(technician_assigned_job_id=obj.technician_assigned_job_id,question_id=137)
        if ans:
            return ans.comment
        else:
            return 'null'
    class Meta:
        model = Parts_Request
        fields = ['comment','id', 'technician_assigned_job', 'question', 'parts_name', 'qty']
        

class CallDetailPostSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = CallDetail
        fields = ['id','assigned_order_item','call_time','call_duration','caller_type','phone']
        
        
        
        
        

class ActivitySerializer(serializers.ModelSerializer):
    updated_at_formatted = serializers.DateTimeField(source='updated_at',format='%b %d, %Y %I:%M %p')
    installation_date=serializers.SerializerMethodField()
    def get_installation_date(self, obj):
        if obj.installation_date:
            return obj.installation_date.strftime('%d-%m-%Y')
        return None
    installation_time=serializers.SerializerMethodField()
    def get_installation_time(self, obj):
        if obj.installation_time:
            return obj.installation_time.strftime('%H:%M')
        return None
    class Meta:
        model = Technician_Comment
        fields = ['technician_assigend_order_item','installation_date','installation_time','updated_at','updated_at_formatted','comment']
                
 
# 'activity'
# def get_activity(self, obj):
#         activities = Technician_Assigned_Order_Item.objects.all()
#         serializer = ActivitySerializer(activities, many=True)
#         return serializer.data        
        
        
        
class CallDetailSerializer(serializers.ModelSerializer):
    caller_type = serializers.CharField(source='get_caller_type_display', read_only=True)
    call_time_formatted = serializers.DateTimeField(source='call_time',format='%b %d, %Y %I:%M:%S %p')
    class Meta:
        model = CallDetail
        fields = ['id', 'assigned_order_item', 'call_time', 'call_duration', 'caller_type','call_time_formatted','phone']
        


import base64
from django.core.files.base import ContentFile

class ServiceSignatureSerializer(serializers.ModelSerializer):
    signature_text = serializers.CharField(write_only=True)
    accepted_by = serializers.CharField(write_only=True)

    class Meta:
        model = Service_Signature
        fields = ['job', 'signature_text','accepted_by','signature_text_technician']


    def create(self, validated_data):
        job = validated_data.get('job')
        signature_text = validated_data.get('signature_text')
        accepted_by = validated_data.get('accepted_by')
        signature_text_technician = validated_data.get('signature_text_technician')
    
        service_signature = Service_Signature(job=job, accepted_by=accepted_by)
    
        if signature_text_technician:
            service_signature.save_base64_signature(signature_text_technician, is_technician_signature=True)
        if signature_text:
            service_signature.save_base64_signature(signature_text, is_technician_signature=False)
    

        return service_signature
    
    
    
class TechnicianAssignedJobSerializer(serializers.ModelSerializer):
    class Meta:
        model = Technician_Assigned_Order_Item
        fields = ['is_signature']
        
        
class CustomerInvoiceSerializer(serializers.ModelSerializer):
    invoice_date= serializers.DateField(format='%d-%m-%Y')
    
    class Meta:
        model = Invoice
        fields = '__all__'
        
   
class Accepted_ImageSerializer(serializers.ModelSerializer):
    accepted_image = serializers.ImageField(required=False, allow_null=True)
    
    class Meta:
        model = Accepted_Image
        fields = ['accepted_image']
        
class CustomerAnswerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Answer
        fields = ['id', 'technician_assigned_job', 'question', 'answer']
        read_only_fields = ['id', 'technician_assigned_job', 'question']
        
        
        
# class JobTimerSerializer(serializers.ModelSerializer):
#     class Meta:
#         model = Technician_Assigned_Order_Item
#         fields = ['start_time_timer', 'stop_time_timer', 'total_time_timer'] 
        
        

class JobIntervalTimeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Job_Interval_Time
        fields = ['id', 'assigned_order_item', 'start_time_timer', 'stop_time_timer', 'total_time_timer']
        
        
        
