from django.db import models
from quotation.models import Order_Item
from authentication.models import User
from product.models import Product
from quotation.models import Technician_Assigned_Order_Item
import base64
from django.core.files.base import ContentFile
from django.db.models.signals import post_save
from django.dispatch import receiver
from customer.models import Customer

class BaseModel(models.Model):
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='%(class)s_created', null=True, blank=True)
    updated_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='%(class)s_updated', null=True, blank=True)
    deleted_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='%(class)s_deleted', null=True, blank=True )

    created_at = models.DateTimeField(auto_now_add=True,null=True)
    updated_at = models.DateTimeField(auto_now=True,null=True)
    deleted_at = models.DateTimeField(auto_now=True,null=True)

    class Meta:
        abstract = True
        
    

class Service(BaseModel):
    order_item=models.ForeignKey(Order_Item, on_delete=models.CASCADE, related_name='orders_items',null=True)
    comment=models.CharField(max_length=50,null=True)
    title = models.CharField(max_length=255,null=True)
    is_selected_warranty = models.IntegerField(default=0)
    description = models.TextField(null=True)
    service_completed = models.BooleanField(default=False)
   
    
    
    
class Service_Request_image(BaseModel):
    service=models.ForeignKey(Service, on_delete=models.CASCADE, related_name='service_request')
    service_request_image = models.ImageField(upload_to='service/service_request_images/')
    service_request_video = models.FileField(upload_to='service/service_request_videos/',null=True) 

class Heading(BaseModel):
    heading= models.CharField(max_length=255)

    def __str__(self):
        return self.heading
    
  

class SubHeading(BaseModel):
    subheading = models.CharField(max_length=255)
    heading = models.ForeignKey(Heading, on_delete=models.CASCADE,null=True, blank=True )

    def __str__(self):
        return self.subheading



class Checklist(BaseModel):
    INSTALLATION = 1
    SERVICE = 2
    Signature =3
    STATUS_CHOICES = (
        (INSTALLATION, 'Installation'),
        (SERVICE, 'Service'),
        (Signature,'Signature')

    )
    checklist_name = models.CharField(max_length=255)
    type = models.PositiveSmallIntegerField(choices=STATUS_CHOICES)
    is_part=models.BooleanField(default=False)
    def __str__(self):
        return self.checklist_name
        
    def get_type(self):
        """
        Returns a human-readable representation of the type.
        """
        type_mapping = dict(self.STATUS_CHOICES)
        return type_mapping.get(self.type, 'Unknown Type')
        
        

        super().save(*args, **kwargs)
    @property
    def question(self):
        q = Question.objects.filter(checklist=self).first()
        return q
        
class Question(BaseModel):
    checklist= models.ForeignKey(Checklist, on_delete=models.CASCADE ,  null=True, blank=True )
    question = models.TextField(null=True, blank=True)
    heading = models.ForeignKey(Heading, on_delete=models.CASCADE,null=True, blank=True)
    subheading = models.ForeignKey(SubHeading, on_delete=models.CASCADE ,  null=True, blank=True )
    product=models.ManyToManyField(Product)
    
    def __str__(self):
        return self.question


FALSE = 0
TRUE = 1
WARRENTY=2

ANSWER_CHOICES = [
  (FALSE, 'false'),
  (TRUE, 'true'),
  
    
]




class  Answer(models.Model):
    technician_assigned_job = models.ForeignKey(Technician_Assigned_Order_Item, related_name='question_answer', on_delete=models.CASCADE)
    question = models.ForeignKey(Question, related_name='questions', on_delete=models.CASCADE)
    answer =  models.PositiveSmallIntegerField(choices=ANSWER_CHOICES ,null=True,blank=True)
    comment=models.CharField(max_length=255,null=True,blank=True)
    is_active = models.BooleanField(default=True)
    is_parts=models.BooleanField(default=False)
    is_warrenty=models.BooleanField(default=False)
    is_signature=models.BooleanField(default=False)
    is_installation=models.BooleanField(default=False)
    pdf_file = models.FileField(upload_to='service/quote_pdfs/', blank=True, null=True)
    def __str__(self):
        return f"Answer for {self.question} assigned to {self.technician_assigned_job}"
        
        
class Parts_Request(BaseModel):
    technician_assigned_job = models.ForeignKey(Technician_Assigned_Order_Item, on_delete=models.CASCADE)
    question = models.ForeignKey(Question, related_name='parts_questions', on_delete=models.CASCADE)
    parts_name = models.CharField(max_length=255)
    qty = models.PositiveIntegerField()
    status =  models.IntegerField(default=4)
    def __str__(self):
        return f"Parts for {self.technician_assigned_job}"
        
class Chat(BaseModel):
    job= models.ForeignKey(Technician_Assigned_Order_Item,related_name='chat_set', on_delete=models.CASCADE)
    sender = models.ForeignKey(User, related_name='sender', on_delete=models.CASCADE)
    recipient = models.ForeignKey(User, related_name='recipient', on_delete=models.CASCADE)
    content = models.TextField()
    is_read =  models.IntegerField(default=0)
    timestamp = models.DateTimeField(auto_now_add=True)        
    is_visible = models.BooleanField(default=True)   
    def __str__(self):
        return f"{self.job}"
        
    @property
    def get_sender(self):
        if self.sender.role.filter(id=3).exists():
            return f"{self.sender.userinfo.first_name.capitalize()} {self.sender.userinfo.last_name.capitalize()}"
        if self.sender.role.filter(id=4).exists():
            customer = Customer.objects.get(email=self.sender.email)
            return f"{customer}"
        else:
            return None
    @property
    def get_recipient(self):
        if self.recipient.role.filter(id=3).exists():
            return f"{self.recipient.userinfo.first_name.capitalize()} {self.recipient.userinfo.last_name.capitalize()}"
        if self.recipient.role.filter(id=4).exists():
            customer = Customer.objects.get(email=self.recipient.email)
            return f"{customer}"
        else:
            return None
        
    
class ChatImage(BaseModel):
    chat = models.ForeignKey(Chat, related_name='chat_images', on_delete=models.CASCADE)
    chat_image = models.ImageField(upload_to='chat_images/')
    
    
class Service_Signature(models.Model):
    job = models.ForeignKey(Technician_Assigned_Order_Item,related_name='service_signature', on_delete=models.CASCADE)

    signature=models.ImageField(upload_to='service/signature_customer/')
    signature_technician=models.ImageField(upload_to='service/signature_technician/')
    signature_text= models.TextField(blank=True, null=True)
    signature_text_technician= models.TextField(blank=True, null=True)
    accepted_by = models.CharField(max_length=255)
    
    
    def save_base64_signature(self, base64_text, is_technician_signature=False):
        try:
            # Convert base64 text to image and save
            signature_data = base64.b64decode(base64_text)
            if is_technician_signature:
                self.signature_technician.save(f'signature_technician_{self.job.id}.png', ContentFile(signature_data))
            else:
                self.signature.save(f'signature_customer_{self.job.id}.png', ContentFile(signature_data))

        except Exception as e:
            # Handle exceptions accordingly
            print(f"Error saving base64 signature: {e}")

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

class Accepted_Image(BaseModel):
    service_signature=models.ForeignKey(Service_Signature, on_delete=models.CASCADE, related_name='signature_after_image')
    accepted_image = models.ImageField(upload_to='service/accepted_images/',null=True)
   
    

