
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,ActivityLog
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,ProductSpecificationPDF, ProductManualPDF
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
# from .models import UserInfo

class UserInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserInfo
        fields = ['first_name', 'last_name']  # Add other fields you want to include
  
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 )
    # meeting_time = serializers.TimeField(
    #     input_formats=["%H:%M", "%H:%M:%S"],
    #     required=False
    # )
    # assigned_to = serializers.PrimaryKeyRelatedField(
    #     queryset=User.objects.all(),  # replace with your custom User model if needed
    #     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()
    userinfo = UserInfoSerializer(read_only=True)
    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'first_name', 'last_name','userinfo']
class CustomerInfoSerializer(serializers.ModelSerializer):
    user = UserSerializer( many=False,read_only=True)
    user_is_active = serializers.BooleanField(source='user.is_active', read_only=True)
    user_app_access = serializers.IntegerField(source='user.app_access', read_only=True)
    user_isprimary = serializers.IntegerField(source='user.isprimary', read_only=True)
    user_is_sent_creadentials	 = serializers.IntegerField(source='user.is_sent_creadentials', read_only=True)
    user_is_communication = serializers.IntegerField(source='user.is_communication', read_only=True)
    class Meta:
        model = Customer_Info
        fields = ['id','company_name', 'first_name',  'last_name', 'email', 'phone1',  'position', 'is_primary',  'created_at', 'updated_at', 'created_by', 'updated_by', 'user','user_is_active','user_app_access','user_isprimary','user_is_sent_creadentials','user_is_communication']        
class CustomerSerializer(serializers.ModelSerializer):
    # role = RoleSerializer()
    user = UserSerializer( many=False,read_only=True)
    user_is_active = serializers.BooleanField(source='user.is_active', read_only=True)
    user_app_access = serializers.IntegerField(source='user.app_access', read_only=True)
    user_isprimary = serializers.IntegerField(source='user.isprimary', read_only=True)
    user_is_sent_creadentials	 = serializers.IntegerField(source='user.is_sent_creadentials', read_only=True)
    user_is_communication = serializers.IntegerField(source='user.is_communication', read_only=True)
    customerinfo = CustomerInfoSerializer(source='contact_information',  # use related_name
        many=True,                     # because it's a list
        read_only=True)
    class Meta:
        model = Customer
        fields = ['id', 'is_individual','company_name','street','city','post_code','state','country','salutation','abn','phone1','is_primary','primary_mail', 'email', 'first_name', 'last_name','is_active','user_is_active','user_app_access','user_isprimary','user_is_sent_creadentials','user_is_communication','user','customerinfo']
       
class LeadNoteCreateSerializer(serializers.ModelSerializer):
    created_by_firstname = serializers.SerializerMethodField()
    created_by_lastname = serializers.SerializerMethodField()
    created_by_username = serializers.CharField(source='created_by.username', read_only=True)
    # created_by = UserInfoSerializer(read_only=True)
    user = UserSerializer( many=False,read_only=True)
    # created_by = UserInfoSerializer(read_only=True)
    class Meta:
        model = Leadnote
        fields = '__all__'
        
    def get_created_by_firstname(self, obj):
        return obj.created_by.userinfo.first_name if obj.created_by else ""

    def get_created_by_lastname(self, obj):
        return obj.created_by.userinfo.last_name if obj.created_by else ""
        
class LeadNoteSerializer(serializers.ModelSerializer):
    created_by_name = serializers.CharField(source='created_by.firstname', read_only=True)
    created_at = serializers.SerializerMethodField()
    
    

    class Meta:
        model = Leadnote
        fields = ['id', 'note', 'created_at', 'created_by', 'created_by_name','reminder_date','meeting_time']
    def get_created_at(self, obj):
        # Format: d-m-Y H:M:S
        return obj.created_at.strftime("%d-%m-%Y %I:%M %p") if obj.created_at else None
class LeadSerializer(serializers.ModelSerializer):
    assigned_to_id = serializers.PrimaryKeyRelatedField(
        source='assigned_to', queryset=User.objects.all(), write_only=True
    )
    assigned_to_firstname = serializers.SerializerMethodField()
    assigned_to_lastname = serializers.SerializerMethodField()
    assigned_to_username = serializers.CharField(source='assigned_to.username', read_only=True)
    # assigned_to_fname = serializers.CharField(source='assigned_to.first_name', read_only=True)
    
    products = serializers.ListField(
        child=serializers.IntegerField(), required=False, allow_empty=True
    )
    
    last_note = serializers.SerializerMethodField()  

    class Meta:
        model = Lead
        fields = '__all__'
        
    def get_last_note(self, obj):
        last_note = obj.notes.filter(deleted_at__isnull=True).order_by('-created_at').first()
        return LeadNoteSerializer(last_note).data if last_note else None
    
    def get_assigned_to_firstname(self, obj):
        return obj.assigned_to.userinfo.first_name if obj.assigned_to else ""

    def get_assigned_to_lastname(self, obj):
        return obj.assigned_to.userinfo.last_name if obj.assigned_to else ""
    def normalize_url(self, url):
        if url and not url.startswith(('http://', 'https://')):
            return 'https://' + url
        return url

    def validate_facebook(self, value):
        return self.normalize_url(value)

    def validate_instagram(self, value):
        return self.normalize_url(value)

    def validate_linkedin(self, value):
        return self.normalize_url(value)
        
    product_pdf = serializers.SerializerMethodField()

    def get_product_pdf(self, obj):
    
        product_ids = obj.products or []
    
        if not isinstance(product_ids, list) or not product_ids:
            return {}
    
        # Convert to int (important)
        product_ids = [int(pid) for pid in product_ids]
    
        # Fetch products
        products = Product.objects.filter(id__in=product_ids)
    
        # Create map: {id: name}
        product_map = {p.id: p.product_name for p in products}
    
        # Fetch PDFs
        spec_pdfs = ProductSpecificationPDF.objects.filter(
            product_id__in=product_ids
        ).values_list('product_id', 'file')
    
        manual_pdfs = ProductManualPDF.objects.filter(
            product_id__in=product_ids
        ).values_list('product_id', 'file')
    
        # Initialize dictionary with product names
        product_pdf = {
            product_map.get(pid, f"Product {pid}"): {
                "specification_pdfs": [],
                "manual_pdfs": []
            }
            for pid in product_ids
            if pid in product_map
        }
    
        # Add spec PDFs
        for pid, file in spec_pdfs:
            if file and pid in product_map:
                product_name = product_map[pid]
                product_pdf[product_name]["specification_pdfs"].append(str(file))
    
        # Add manual PDFs
        for pid, file in manual_pdfs:
            if file and pid in product_map:
                product_name = product_map[pid]
                product_pdf[product_name]["manual_pdfs"].append(str(file))
    
        return product_pdf
    
class LeadSerializerWithoutPagination(serializers.ModelSerializer):
    class Meta:
        model = Lead
        fields = ['id', 'is_individual', 'company_name', 'last_name','first_name'] #'__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_end_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_end_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()
    installation_end_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()
        if instance.order_item.is_trade==1:
            if instance.order_item.get_status_display() == 'Installed':
                return 'Received'
            else:
                return instance.order_item.get_status_display()
        else:
            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_end_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)
    unread_chat_count=serializers.SerializerMethodField()
    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()
    installation_end_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()
    chat_count = serializers.SerializerMethodField()
    technician_data = UserInfoSerializer(source='technician.userinfo', read_only=True)
    secondary_technician_data = serializers.SerializerMethodField()
    notify_counter_customer = serializers.SerializerMethodField()
    work_order_pdf=serializers.SerializerMethodField()
    my_job_interval_time = serializers.SerializerMethodField()
    def get_chat_count(self, instance):
        if instance:
            chatsCount = Chat.objects.filter(Q(job__id=instance.id)).count()
            return chatsCount
        else:
            return 0
    requested_customer_sign=serializers.SerializerMethodField()
    def get_secondary_technician_data(self, obj):
        if obj.secondary_technician is not None:
            return UserInfoSerializer(obj.secondary_technician.userinfo).data
        return None
    def get_requested_customer_sign(self, instance):
        sign=  instance.customer_signature_required
        if sign:
            return 1
        else:
            return 0
    def get_unread_chat_count(self, instance):
        user = self.context.get('user')
        if instance:
            chatsCount =instance.get_chat_unread_count(user)
            return chatsCount
        else:
            return 0
    def get_work_order_pdf(self, instance):
        file = instance.work_order_pdf
        if file and hasattr(file, "url"):
            return file.url   # returns http://.../media/.../file.pdf
        return None
    serial_number = serializers.SerializerMethodField()
    def get_serial_number(self, obj):
        if obj.order_item.is_trade==0:
            if obj.order_item.serial_number:
                return obj.order_item.serial_number.serial_number
            else:
                return ' '
            
        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()
        if instance.order_item.is_trade == 1:
            if instance.order_item.get_status_display() == 'Installed':
                return 'Received'
            else:
                return instance.order_item.get_status_display()
        else:
            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:
            if instance.secondary_technician:
                chatsCount = Chat.objects.filter((Q(recipient=instance.technician.id) | Q(recipient=instance.secondary_technician.id)) & Q(job__id=instance.id) & Q(is_read=0)).count()
            else:
                chatsCount = Chat.objects.filter(Q(recipient=instance.technician.id)  & Q(job__id=instance.id) & Q(is_read=0)).count()
            return chatsCount
    # def get_secondary_technician_data(self, instance):
    #     if instance:
    #         if instance.secondary_technician:
    #             print(instance.id)
    #             chatsCount = instance.technician
    #             return chatsCount
    #         else:
    #             return None
            
    def get_notify_counter_customer(self, instance):
        if instance:
            if instance.secondary_technician:
                chatsCount = Chat.objects.filter(   (Q(sender=instance.technician.id) | Q(sender=instance.secondary_technician.id)) & Q(job__id=instance.id) & Q(is_read=0)   ).count()
            else:
                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
    
    def get_my_job_interval_time(self, obj):
        user = self.context.get('user')
    
        jobs = obj.technician_jobs_interval.filter(technician=user)
    
        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)
    
        return f"{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}"    
        
    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','technician_data','start_stop_job','secondary_technician','secondary_technician_data','requested_customer_sign','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_end_date','installation_time','job_status','total_job_time','work_order_pdf','status','comment','view_by_technician','installation_complete','customer','country','state','street','city','phone1','postcode','email','service','type','total_job_interval_time','my_job_interval_time','checklist_pdf','created_at','job_complete_datetime','notify_counter_customer','notify_counter_technician','chat_count','serial_number','unread_chat_count']
        



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):
    product_pdf = serializers.SerializerMethodField()

    def get_product_pdf(self, obj):   # 👈 method name must match field name
        spec_files = ProductSpecificationPDF.objects.filter(product=obj)
        manual_files = ProductManualPDF.objects.filter(product=obj)
    
        spec_list = [
            pdf.file.url for pdf in spec_files
            if pdf.file
        ]
    
        manual_list = [
            pdf.file.url for pdf in manual_files
            if pdf.file
        ]
    
        return {
            "specification_pdfs": spec_list or None,
            "manual_pdfs": manual_list or None,
        }
    class Meta:
        model = Product
        fields = ['id', 'product_name', 'sku', 'product_type', 'product_pdf']
        
# 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.SerializerMethodField()
    job = serializers.SerializerMethodField()

    class Meta:
        model = Order
        fields = ['order_id', 'order_date', 'order_status', 'total_price', 'job']

    def get_total_price(self, obj):
        if obj and getattr(obj, 'invoice', None):
            return obj.invoice.total
        return None

    def get_job(self, obj):
        if not obj or not obj.id:
            return []

        technician_items = Technician_Assigned_Order_Item.objects.filter(
            order_item__order=obj,
            job_type=1
        )

        safe_data = []
        for item in technician_items:
            try:
                safe_data.append(
                    AssignedOrderItemDetailSerializer(item).data
                )
            except Exception:
                # skip broken rows silently
                continue

        return safe_data

    def get_order_status(self, obj):
        if not obj:
            return None

        try:
            order_items = obj.orderset.order_by('-updated_at')
        except Exception:
            return None

        for order_item in order_items:
            try:
                status = order_item.get_status
                if status:
                    return "Parts Arrived" if status == "Arrived" else status
            except Exception:
                continue

        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=[1,3, 4]).exists():
            if user.role.filter(id__in=[1,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
#     requested_customer_sign=serializers.SerializerMethodField()
#     def get_requested_customer_sign(self, instance):
#         sign=  instance.customer_signature_required
#         if sign:
#             return 1
#         else:
#             return 0
#     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(recipient=instance.secondary_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(sender=instance.secondary_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','requested_customer_sign','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 AssignedOrderItemDetailSerializer(serializers.ModelSerializer):
    technician_info = serializers.SerializerMethodField()
    total_job_time = serializers.SerializerMethodField()
    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()
    job_created_date = serializers.SerializerMethodField()
    job_created_time = serializers.SerializerMethodField()
    requested_customer_sign = serializers.SerializerMethodField()
    serial_number = serializers.SerializerMethodField()
    product = serializers.SerializerMethodField()
    is_selected_warranty = serializers.SerializerMethodField()
    spec_pdfs = serializers.SerializerMethodField()
    manual_pdfs = serializers.SerializerMethodField()

    class Meta:
        model = Technician_Assigned_Order_Item
        fields = [
            'id','product','technician_info','total_job_time',
            'requested_customer_sign','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','spec_pdfs','manual_pdfs'
        ]

    # ---------- SAFE METHODS ----------
    def get_spec_pdfs(self, obj):
        status = obj.order_item.get_status_display()#self.get_get_status(obj)
        allowed_statuses = ["Installed", "Service Requested", "Parts Requested", "Service Completed"]
        if status not in allowed_statuses:
            return None
    
        if not obj or not obj.order_item.product:
            return None
    
        pdfs = obj.order_item.product.specification_pdfs.filter(deleted_at__isnull=True)
    
        result = [
            {
                "id": pdf.id,
                "file": pdf.file.url if pdf.file else None
            }
            for pdf in pdfs
        ]
    
        return result or None

    def get_manual_pdfs(self, obj):
        status = obj.order_item.get_status_display() #self.get_get_status(obj)
        allowed_statuses = ["Installed", "Service Requested", "Parts Requested", "Service Completed"]
        
        print(allowed_statuses)
        if status not in allowed_statuses:
            return None
    
        if not obj or not obj.order_item.product:
            return None
    
        pdfs = obj.order_item.product.manual_pdfs.filter(deleted_at__isnull=True)
    
        result = [
            {
                "id": pdf.id,
                "file": pdf.file.url if pdf.file else None
            }
            for pdf in pdfs
        ]
    
        return result or None
    def get_technician_info(self, obj):
        if obj.technician and hasattr(obj.technician, 'userinfo'):
            return UserInfoSerializer(obj.technician.userinfo).data
        return None

    def get_total_job_time(self, obj):
        try:
            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
            )
        except Exception:
            return '00:00:00'

        hours, remainder = divmod(total_job_seconds, 3600)
        minutes, seconds = divmod(remainder, 60)
        return f"{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}"

    def get_installation_date(self, obj):
        return obj.installation_date.strftime('%d-%m-%Y') if obj.installation_date else None

    def get_job_created_date(self, obj):
        return obj.created_at.strftime('%d-%m-%Y') if obj.created_at else None

    def get_job_created_time(self, obj):
        return obj.created_at.strftime('%H:%M:%S') if obj.created_at else None

    def get_requested_customer_sign(self, obj):
        return 1 if obj.customer_signature_required else 0

    def get_checklist_pdf(self, obj):
        if obj.pdf_file and hasattr(obj.pdf_file, 'url'):
            return f"{settings.BASE_URL}{obj.pdf_file.url}"
        return None

    def get_notify_counter_technician(self, obj):
        tech_ids = []
        if obj.technician:
            tech_ids.append(obj.technician.id)
        if obj.secondary_technician:
            tech_ids.append(obj.secondary_technician.id)

        return Chat.objects.filter(
            recipient__in=tech_ids,
            job=obj,
            is_read=0
        ).count()

    def get_notify_counter_customer(self, obj):
        tech_ids = []
        if obj.technician:
            tech_ids.append(obj.technician.id)
        if obj.secondary_technician:
            tech_ids.append(obj.secondary_technician.id)

        return Chat.objects.filter(
            sender__in=tech_ids,
            job=obj,
            is_read=0
        ).count()

    def get_status(self, obj):
        if obj.order_item:
            return obj.order_item.get_status_display()
        return None

    def get_job_type(self, obj):
        return obj.get_job_type_display() if obj else None

    def get_working_status(self, obj):
        return obj.get_working_status_display() if obj else None

    def get_is_trade(self, obj):
        return obj.order_item.is_trade if obj.order_item else None

    def get_serial_number(self, obj):
        if obj.order_item and obj.order_item.is_trade == 0:
            if obj.order_item.serial_number:
                return obj.order_item.serial_number.serial_number
        return None

    def get_product(self, obj):
        if obj.order_item and obj.order_item.product:
            return ProductSerializer(obj.order_item.product).data
        return None

    def get_is_selected_warranty(self, obj):
        return obj.service.is_selected_warranty if obj.service else None

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:
#             if instance.serial_number:
#                 return instance.serial_number.serial_number
#             else:
#                 return ' '
#         else:
#             return ' '
#     def get_get_status(self, instance):
#         # if instance.get_status=="Arrived":
#         #     return "Parts Arrived"
#         # else:
#         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 CustomerOrderItemSerializer(serializers.ModelSerializer):
    order_item_id = serializers.IntegerField(source='id')
    order_date = serializers.SerializerMethodField()
    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)
    installation_time = serializers.TimeField()
    get_status = serializers.SerializerMethodField()
    serial_number = serializers.SerializerMethodField()
    job = serializers.SerializerMethodField()
    product = serializers.SerializerMethodField()
    spec_pdfs = serializers.SerializerMethodField()
    manual_pdfs = serializers.SerializerMethodField()
    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',
            'spec_pdfs',
            'manual_pdfs',
        ]

    # ---------- SAFE METHODS ----------

    def get_order_date(self, obj):
        if obj and obj.order:
            return obj.order.order_date
        return None

    def get_product(self, obj):
        if obj and obj.product:
            return ProductSerializer(obj.product).data
        return None

    def get_serial_number(self, obj):
        if obj and obj.is_trade == 0 and obj.serial_number:
            return obj.serial_number.serial_number
        return None

    def get_get_status(self, obj):
        try:
            return obj.get_status
        except Exception:
            return None

    def get_job(self, obj):
        if not obj:
            return []
    
        technician_items = obj.order_item.all() 
        safe_data = []
        for item in technician_items:
            try:
                safe_data.append(
                    AssignedOrderItemDetailSerializer(item).data
                )
            except Exception:
                continue
    
        return safe_data

    def get_spec_pdfs(self, obj):
        status = self.get_get_status(obj)
        allowed_statuses = ["Installed", "Service Requested", "Parts Requested", "Service Completed"]
        print(status)
        print(allowed_statuses)
        if status not in allowed_statuses:
            return None
    
        if not obj or not obj.product:
            return None
    
        pdfs = obj.product.specification_pdfs.filter(deleted_at__isnull=True)
    
        result = [
            {
                "id": pdf.id,
                "file": pdf.file.url if pdf.file else None
            }
            for pdf in pdfs
        ]
    
        return result or None

    def get_manual_pdfs(self, obj):
        status = self.get_get_status(obj)
        allowed_statuses = ["Service Requested"]
        print('1111111111')
        print(status)
        print(allowed_statuses)
        if status not in allowed_statuses:
            return None
    
        if not obj or not obj.product:
            return None
    
        pdfs = obj.product.manual_pdfs.filter(deleted_at__isnull=True)
    
        result = [
            {
                "id": pdf.id,
                "file": pdf.file.url if pdf.file else None
            }
            for pdf in pdfs
        ]
    
        return result or None


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, required=False, allow_blank=True)
    accepted_by = serializers.CharField(write_only=True, required=False, allow_blank=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
        
    def create(self, validated_data):
        job = validated_data.get('job')
        signature_text = validated_data.get('signature_text', None)
        accepted_by = validated_data.get('accepted_by', None)
        signature_text_technician = validated_data.get('signature_text_technician', None)
    
        # Try to get existing signature for this job
        service_signature, created = Service_Signature.objects.get_or_create(
            job=job,
            defaults={'accepted_by': accepted_by}
        )
    
        # If updating, also update accepted_by if provided
        if not created and accepted_by:
            service_signature.accepted_by = accepted_by
            service_signature.save(update_fields=['accepted_by'])
    
        # Save technician signature if provided
        if signature_text_technician:
            service_signature.save_base64_signature(signature_text_technician, is_technician_signature=True)
    
        # Save customer signature if provided
        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']
        
class OrderItemSerializer(serializers.ModelSerializer):
    product_name = serializers.CharField(source='product.name', read_only=True)
    installed_date = serializers.DateField(format="%d-%m-%Y")
    warranty_end_date = serializers.DateField(format="%d-%m-%Y")
    class Meta:
        model = Order_Item
        fields = '__all__'        
        
class ActivityLogSerializer(serializers.ModelSerializer):
    class Meta:
        model = ActivityLog
        fields = '__all__'