from django.db import models
from codesofy.master_details import DensityUnit, ProductType,Brand, TemperatureUnit 
from constants.general_const import ActiveStatus
from core.models import Language
from cropmanagement.models import Crop
from usermanagement.models import UserProfile
from django.utils.timezone import now
from django.core.validators import FileExtensionValidator

class Product(models.Model):
    code = models.CharField(max_length=256, unique=True)
    name = models.CharField(max_length=256)
    brand = models.CharField(max_length=50,choices=Brand.choices(), default=Brand.WILE.value)
    type = models.CharField(max_length=50,choices=ProductType.choices(), default=ProductType.GRAIN.value)
    is_manual_integration = models.BooleanField(default=False)
    is_QR_integration = models.BooleanField(default=False)
    is_bluetooth_integration = models.BooleanField(default=False)
    is_manual_result_reading = models.BooleanField(default=False)
    is_qr_result_reading = models.BooleanField(default=False)
    is_bluetooth_result_reading = models.BooleanField(default=False)
    image = models.ImageField(
        upload_to='product_images',  
        null=True, blank=True,
        validators=[FileExtensionValidator(['png'])],
    )
    description = models.TextField(max_length=256,null=True, blank=True)
    status = models.CharField(max_length=50,choices=ActiveStatus.choices(), default=ActiveStatus.ACTIVE.value)
    created_At = models.DateTimeField(auto_now_add=True)   
    updated_At = models.DateTimeField(auto_now=True)  
    created_user = models.ForeignKey(UserProfile, on_delete=models.RESTRICT, null=True, default=None, related_name="products_created")
    updated_user = models.ForeignKey(UserProfile, on_delete=models.RESTRICT, null=True, default=None, related_name="products_updated")
    model_id = models.CharField(max_length=256, null=True, blank=True)
    catelog_link = models.URLField(max_length=256, null=True, blank=True)
    default_temperature = models.CharField(max_length=50,choices=TemperatureUnit.choices(), default=TemperatureUnit.FAHRENHEIT.value)
    default_density = models.CharField(max_length=50, choices=DensityUnit.choices(), default=DensityUnit.KG_PER_HL.value)
    available_for_device_pairing = models.BooleanField(null=True, blank=True)
    
    def __str__(self):
        return self.name
    
class ProductHistory(models.Model):
    
    product = models.ForeignKey(
        Product,
        on_delete=models.SET_NULL,
        null=True,            
        blank=True,           
        related_name="history",
    )
    version     = models.PositiveIntegerField()
    snapshot    = models.JSONField()               
    diff        = models.JSONField(null=True, blank=True)
    changed_at  = models.DateTimeField(default=now)
    changed_by  = models.ForeignKey(UserProfile, null=True, blank=True, on_delete=models.SET_NULL)
    change_notes = models.TextField(blank=True, default="")

    class Meta:
        unique_together = ("product", "version")
        ordering = ["-version"]
        
class CatelogTranslation(models.Model):
    language = models.ForeignKey(Language, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    catelog_link = models.URLField(max_length=256)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = models.ForeignKey(UserProfile, null=True, blank=True, on_delete=models.SET_NULL,related_name="translation_created")
    updated_by = models.ForeignKey(UserProfile, null=True, blank=True, on_delete=models.SET_NULL,related_name="translation_updated")
    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=["language", "product"],
                name="uniq_catalog_translation_per_language_product",
            )
        ]
    def __str__(self):
        return f"{self.product} - {self.language}"
    
class ProductCropMapping(models.Model):
    product = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        related_name="products_product_crop_mappings",
    )
    crop = models.ForeignKey(
        Crop,
        on_delete=models.CASCADE,
        related_name="products_crop_product_mappings",
    )

    scale_order_number = models.CharField(max_length=10)
    universal_moisture_threshold = models.DecimalField(
        max_digits=3, decimal_places=1, null=True, blank=True
    )

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    created_user = models.ForeignKey(
        UserProfile,
        on_delete=models.PROTECT,
        null=True,
        blank=True,
        related_name="products_created_product_crop_mappings",
    )
    updated_user = models.ForeignKey(
        UserProfile,
        on_delete=models.PROTECT,
        null=True,
        blank=True,
        related_name="products_updated_product_crop_mappings",
    )

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=["product", "crop"],
                name="products_unique_product_crop_pair",
            )
        ]

    def __str__(self):
        return f"{self.product.name} ↔ {self.crop.name}"