import os
import uuid
from bs4 import BeautifulSoup
from django.contrib.gis.db import models
from django.utils.translation import gettext_lazy as _
from django.contrib.auth import get_user_model
from developer.models import Developer, DeveloperTranslate
from development.utils import flat_bedroom_type
from geo_location.models import City, Country, District, Location, LondonArea, LondonZipState, LondonZone, PublicFacility
from main.fields import WEBPField
from main.models import Language
from django.core.files.base import ContentFile
from django.utils.text import slugify 
from PIL import Image
from io import BytesIO
from django_ckeditor_5.fields import CKEditor5Field

# Create your models here.

User = get_user_model()

def resize_by_width(image, target_width):
    """Resize image to target width while maintaining aspect ratio"""
    width, height = image.size
    ratio = target_width / width
    new_height = int(height * ratio)
    return image.resize((target_width, new_height), Image.Resampling.LANCZOS)
    

CHECK_BOOLEAN = [
    (True,_("submitted")),
    (False,_("ignored")),
]

ACTIVE_BOOLEAN = [
    (True,_("active")),
    (False,_("deactive")),
]

QUESTION_BOOLEAN = [
    (True,_("yes")),
    (False,_("no")),
]

COMPLETED_STATUS = [
    (0,_("not completed")),
    (1,_("completed")),
]

class Currency(models.Model):
    name = models.CharField(_("name"), max_length=250)
    code = models.CharField(_("code"), max_length=250)
    demonym = models.CharField(_("demonym"), max_length=250)
    major_single = models.CharField(_("major single"), max_length=250)
    major_plural = models.CharField(_("major plural"), max_length=250)
    iso_num = models.IntegerField(_("iso num"))
    symbol = models.CharField(_("symbol"), max_length=250)
    symbol_native = models.CharField(_("symbol native"), max_length=250)
    minor_single = models.CharField(_("minor single"), max_length=250)
    minor_plural = models.CharField(_("minor plural"), max_length=250)
    iso_digits = models.IntegerField(_("iso digits"), default=0)
    decimal_digits = models.IntegerField(_("decimal digits"), default=0)
    num_to_basic =  models.CharField(_("num to basic"), max_length=250)
    
    gbp_rate = models.FloatField(_("gbp rate"), default=0)
    aed_rate = models.FloatField(_("aed rate"), default=0)
    
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name} {self.code}"
    
    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
    
    class Meta:
        verbose_name = _("Currency")
        verbose_name_plural = _("Currencies")
        ordering = ["name"]

class ChangeRate(models.Model):
    from_currency = models.ForeignKey(Currency, on_delete=models.CASCADE, verbose_name=_("from currency"), related_name="from_currency")
    to_currency = models.ForeignKey(Currency, on_delete=models.CASCADE, verbose_name=_("to currency"), related_name="to_currency")
    rate = models.FloatField(_("rate"))
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.from_currency} to {self.to_currency}"
    
    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
    
    class Meta:
        verbose_name = _("Currency Change Rate")
        verbose_name_plural = _("Currency Change Rate")
        ordering = ["id"]
    
class Feature(models.Model):
    name = models.CharField(_("name"), max_length=250)
    slug = models.SlugField(_("Slug"), max_length=250, unique=True, null=True, blank=True)
    icon_text = models.TextField(_("icon"), null=True, blank=True)
    icon = models.FileField(_("icon"), upload_to="feature/icon/", null=True, blank=True)
    translated = models.BooleanField(_("translated"), default=False)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name}"
    
    def save(self, *args, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        super().save(*args, **kwargs)
    
    class Meta:
        verbose_name = _("Feature")
        verbose_name_plural = _("Features")
        ordering = ["name"]
    
class FeatureTranslate(models.Model):
    feature = models.ForeignKey(Feature, on_delete=models.CASCADE, verbose_name=_("feature"), related_name="translates")
    language = models.ForeignKey(Language, on_delete=models.CASCADE, verbose_name=_("language"), related_name="feature_translate")
    slug = models.SlugField(_("Slug"), max_length=250, null=True, blank=True)
    name = models.CharField(_("name"), max_length=250)
    description = models.TextField(_("description"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name} {self.language.code}"
    
    def save(self, *args, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        super().save(*args, **kwargs)
    
    class Meta:
        verbose_name = _("Feature Translate")
        verbose_name_plural = _("Feature Translate")
        ordering = ["name"]
        constraints = [
            models.UniqueConstraint(fields=['language', 'feature'], name='repeated_language_feature_translate'),
        ]
    
class BuildingType(models.Model):
    name = models.CharField(_("name"), max_length=250)
    slug = models.SlugField(_("Slug"), max_length=250, unique=True, null=True, blank=True)
    translated = models.BooleanField(_("translated"), default=False)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name}"
    
    def save(self, *args, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        super().save(*args, **kwargs)
    
    class Meta:
        verbose_name = _("Building Type")
        verbose_name_plural = _("Building Type")
        ordering = ["name"]
    
class BuildingTypeTranslate(models.Model):
    building_type = models.ForeignKey(BuildingType, on_delete=models.CASCADE, verbose_name=_("building type"), related_name="translates")
    language = models.ForeignKey(Language, on_delete=models.CASCADE, verbose_name=_("language"), related_name="building_type_translate")
    slug = models.SlugField(_("Slug"), max_length=250, null=True, blank=True)
    name = models.CharField(_("name"), max_length=250)
    description = models.TextField(_("description"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name} {self.language.code}"
    
    def save(self, *args, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        super().save(*args, **kwargs)
    
    class Meta:
        verbose_name = _("Building Type Translate")
        verbose_name_plural = _("Building Type Translate")
        ordering = ["name"]
        constraints = [
            models.UniqueConstraint(fields=['language', 'building_type'], name='repeated_language_building_type_translate'),
        ]
    
class PaymentOption(models.Model):
    name = models.CharField(_("name"), max_length=250)
    slug = models.SlugField(_("Slug"), max_length=250, unique=True, null=True, blank=True)
    translated = models.BooleanField(_("translated"), default=False)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name}"
    
    def save(self, *args, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        super().save(*args, **kwargs)
    
    class Meta:
        verbose_name = _("Payment Option")
        verbose_name_plural = _("Payment Option")
        ordering = ["name"]
    
class PaymentOptionTranslate(models.Model):
    payment_option = models.ForeignKey(PaymentOption, on_delete=models.CASCADE, verbose_name=_("payment option"), related_name="translates")
    language = models.ForeignKey(Language, on_delete=models.CASCADE, verbose_name=_("language"), related_name="payment_option_translate")
    slug = models.SlugField(_("Slug"), max_length=250, null=True, blank=True)
    name = models.CharField(_("name"), max_length=250)
    description = models.TextField(_("description"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name} {self.language.code}"
    
    def save(self, *args, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        super().save(*args, **kwargs)
    
    class Meta:
        verbose_name = _("Payment Option Translate")
        verbose_name_plural = _("Payment Option Translate")
        ordering = ["name"]
        constraints = [
            models.UniqueConstraint(fields=['language', 'payment_option'], name='repeated_language_payment_option_translate'),
        ]
    
class RankElement(models.Model):
    name = models.CharField(_("name"), max_length=250)
    slug = models.SlugField(_("Slug"), max_length=250, unique=True, null=True, blank=True)
    icon_text = models.TextField(_("icon"), null=True, blank=True)
    icon = models.FileField(_("icon"), upload_to="rank/icon/", null=True, blank=True)
    translated = models.BooleanField(_("translated"), default=False)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)

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

    def save(self, *args, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        super().save(*args, **kwargs)

    class Meta:
        verbose_name = _("Rank Element")
        verbose_name_plural = _("Rank Element")
        ordering = ["name"]
        
class RankElementTranslate(models.Model):
    rank_element = models.ForeignKey(RankElement, on_delete=models.CASCADE, verbose_name=_("rank element"), related_name="translates")
    language = models.ForeignKey(Language, on_delete=models.CASCADE, verbose_name=_("language"), related_name="rank_element_translate")
    slug = models.SlugField(_("Slug"), max_length=250, null=True, blank=True)
    name = models.CharField(_("name"), max_length=250)
    description = models.TextField(_("description"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)

    def __str__(self):
        return f"{self.name} {self.language.code}"

    def save(self, *args, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        super().save(*args, **kwargs)
    
    class Meta:
        verbose_name = _("Rank Element Translate")
        verbose_name_plural = _("Rank Element Translate")
        ordering = ["name"]
        constraints = [
            models.UniqueConstraint(fields=['language', 'rank_element'], name='repeated_language_rank_element_translate'),
        ]
        
class ONHStation(models.Model):
    name = models.CharField(_("name"), max_length=250, db_index=True)
    slug = models.SlugField(_("Slug"), max_length=250, db_index=True, null=True, blank=True)
    code = models.CharField(_("code"), max_length=10, null=True, blank=True)
    type = models.CharField(_("type"), max_length=11, null=True, blank=True)
    country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name=_("country"), related_name="onh_stations")
    city = models.ForeignKey(City, on_delete=models.CASCADE, verbose_name=_("city"), related_name="onh_stations")
    icon = models.CharField(_("icon"), max_length=250, db_index=True, null=True, blank=True)
    json = models.JSONField(_("json"), null=True, blank=True)
    is_check = models.BooleanField(_("check"), default=False)
    last_check = models.FloatField(_("last check"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name}"

    def save(self, *args, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        super().save(*args, **kwargs)
        
    class Meta:
        verbose_name = _("One New Homes Station")
        verbose_name_plural = _("One New Homes Station")
        ordering = ["name"]
        indexes = [
            models.Index(fields=['slug', 'name', "icon"])
        ]
        
class MetroLine(models.Model):
    name = models.CharField(_("name"), max_length=250, db_index=True)
    slug = models.SlugField(_("Slug"), max_length=250, db_index=True, null=True, blank=True)
    code = models.CharField(_("code"), max_length=10, null=True, blank=True)
    country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name=_("country"), related_name="metro_lines")
    city = models.ForeignKey(City, on_delete=models.CASCADE, verbose_name=_("city"), related_name="metro_lines")
    json = models.JSONField(_("json"), null=True, blank=True)
    stations = models.ManyToManyField(ONHStation, verbose_name=_("stations"), related_name="metro_lines")
    is_check = models.BooleanField(_("check"), default=False)
    last_check = models.FloatField(_("last check"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name}"
    
    def save(self, *args, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        super().save(*args, **kwargs)

    class Meta:
        verbose_name = _("Metro Line")
        verbose_name_plural = _("Metro Line")
        ordering = ["name"]
        indexes = [
            models.Index(fields=['slug', 'name', "code"])
        ]
        
class ONHDistrict(models.Model):
    name = models.CharField(_("name"), max_length=250, db_index=True)
    slug = models.SlugField(_("Slug"), max_length=250, db_index=True, null=True, blank=True)
    code = models.CharField(_("code"), max_length=10, null=True, blank=True)
    country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name=_("country"), related_name="onh_districts")
    city = models.ForeignKey(City, on_delete=models.CASCADE, verbose_name=_("city"), related_name="onh_districts")
    json = models.JSONField(_("json"), null=True, blank=True)
    is_check = models.BooleanField(_("check"), default=False)
    last_check = models.FloatField(_("last check"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name}"

    def save(self, *args, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        super().save(*args, **kwargs)
        
    class Meta:
        verbose_name = _("One New Homes District")
        verbose_name_plural = _("One New Homes District")
        ordering = ["name"]
        indexes = [
            models.Index(fields=['slug', 'name'])
        ]
        
class ONHPostcode(models.Model):
    name = models.CharField(_("name"), max_length=250, db_index=True)
    slug = models.SlugField(_("Slug"), max_length=250, db_index=True, null=True, blank=True)
    code = models.CharField(_("code"), max_length=10, null=True, blank=True)
    country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name=_("country"), related_name="onh_postcodes")
    city = models.ForeignKey(City, on_delete=models.CASCADE, verbose_name=_("city"), related_name="onh_postcodes")
    json = models.JSONField(_("json"), null=True, blank=True)
    is_check = models.BooleanField(_("check"), default=False)
    last_check = models.FloatField(_("last check"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name}"

    def save(self, *args, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        super().save(*args, **kwargs)
        
    class Meta:
        verbose_name = _("One New Homes Postcode")
        verbose_name_plural = _("One New Homes Postcode")
        ordering = ["name"]
        indexes = [
            models.Index(fields=['slug', 'name'])
        ]

class ONHArea(models.Model):
    name = models.CharField(_("name"), max_length=250, db_index=True)
    slug = models.SlugField(_("Slug"), max_length=250, db_index=True, null=True, blank=True)
    code = models.CharField(_("code"), max_length=10, null=True, blank=True)
    country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name=_("country"), related_name="onh_area")
    city = models.ForeignKey(City, on_delete=models.CASCADE, verbose_name=_("city"), related_name="onh_area")
    json = models.JSONField(_("json"), null=True, blank=True)
    is_check = models.BooleanField(_("check"), default=False)
    last_check = models.FloatField(_("last check"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name}"

    def save(self, *args, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        super().save(*args, **kwargs)
        
    class Meta:
        verbose_name = _("One New Homes Area")
        verbose_name_plural = _("One New Homes Area")
        ordering = ["name"]
        indexes = [
            models.Index(fields=['slug', 'name'])
        ]

class ONHZone(models.Model):
    name = models.CharField(_("name"), max_length=250, db_index=True)
    slug = models.SlugField(_("Slug"), max_length=250, db_index=True, null=True, blank=True)
    code = models.CharField(_("code"), max_length=10, null=True, blank=True)
    country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name=_("country"), related_name="onh_zone")
    city = models.ForeignKey(City, on_delete=models.CASCADE, verbose_name=_("city"), related_name="onh_zone")
    json = models.JSONField(_("json"), null=True, blank=True)
    is_check = models.BooleanField(_("check"), default=False)
    last_check = models.FloatField(_("last check"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name}"

    def save(self, *args, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        super().save(*args, **kwargs)
        
    class Meta:
        verbose_name = _("One New Homes Zone")
        verbose_name_plural = _("One New Homes Zone")
        ordering = ["name"]
        indexes = [
            models.Index(fields=['slug', 'name'])
        ]


def image_development_folder(instance, filename):
    return f'development/{instance.slug}.webp'

def image_mobile_development_folder(instance, filename):
    return f'development/{instance.slug}-mobile.webp'

class Development(models.Model):
    reference_id = models.CharField(_("Reference ID"), max_length=150, db_index=True, null=True, blank=True)
    title = models.CharField(_("Title"), max_length=150, db_index=True, null=True, blank=True)
    slug = models.SlugField(_("Slug"), max_length=250, db_index=True, unique=True, null=True, blank=True)
    
    developer = models.ForeignKey(Developer, on_delete=models.CASCADE, verbose_name=_("developer"), related_name="developments", null=True, blank=True)
    
    base_price = models.IntegerField(_("Base Price"), default=0)
    is_active = models.BooleanField(_("active"), default=False, choices=QUESTION_BOOLEAN)
    address = models.CharField(_("Address"), max_length=250, null=True, blank=True)
    location = models.ForeignKey(Location, on_delete=models.CASCADE, verbose_name=_("location"), related_name="developments", null=True, blank=True)
    coordinates = models.PointField(_("coordinates"), srid=4326, null=True, blank=True)
    geo_json = models.JSONField(_("Geo JSON"), null=True, blank=True)
    last_create = models.FloatField(_("geo json lat create"), default=0)
    country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name=_("country"), related_name="developments", null=True, blank=True)
    city = models.ForeignKey(City, on_delete=models.CASCADE, verbose_name=_("city"), related_name="developments", null=True, blank=True)
    district = models.ForeignKey(District, on_delete=models.CASCADE, verbose_name=_("district"), related_name="developments", null=True, blank=True)
    position_area = models.ForeignKey(LondonArea, on_delete=models.CASCADE, verbose_name=_("position area"), related_name="developments", null=True, blank=True)
    postcode = models.ForeignKey(LondonZipState, on_delete=models.CASCADE, verbose_name=_("position area"), related_name="developments", null=True, blank=True)
    zone = models.ForeignKey(LondonZone, on_delete=models.CASCADE, verbose_name=_("zone"), related_name="developments", null=True, blank=True)
    stations = models.ManyToManyField(PublicFacility, verbose_name=_("stations"), related_name="station_developments", blank=True)
    area = models.FloatField(_("Area"), default=0)
    min_area = models.FloatField(_("Min Area"), default=0)
    max_area = models.FloatField(_("Max Area"), default=0)
    floor = models.CharField(_("Floor"), default="0")
    min_floor = models.IntegerField(_("min Floor"), default=0)
    max_floor = models.IntegerField(_("max Floor"), default=0)
    flat = models.CharField(_("Flat"), default="0")
    min_flat = models.IntegerField(_("Flat"), default=0)
    max_flat = models.IntegerField(_("Flat"), default=0)
    
    order = models.IntegerField(_("Order"), default=0)
    is_published = models.BooleanField(_("Published"), default=False, choices=QUESTION_BOOLEAN)
    is_featured = models.BooleanField(_("Featured"), default=False, choices=QUESTION_BOOLEAN)
    is_highlighted = models.BooleanField(_("Highlighted"), default=False, choices=QUESTION_BOOLEAN)
    is_checked = models.BooleanField(_("Checked"), default=False, choices=QUESTION_BOOLEAN)
    is_checked_by_admin = models.BooleanField(_("Checked By Admin"), default=False, choices=QUESTION_BOOLEAN)
    is_deleted = models.BooleanField(_("Deleted"), default=False, choices=QUESTION_BOOLEAN)
    translated = models.BooleanField(_("translated"), default=False, choices=QUESTION_BOOLEAN)
    
    default_currency = models.ForeignKey(Currency, on_delete=models.CASCADE, verbose_name=_("Default Currency"), related_name="developments", null=True, blank=True)
    building_type = models.ManyToManyField(BuildingType, verbose_name=_("Building Type"), related_name="developments", blank=True)
    payment_option = models.ManyToManyField(PaymentOption, verbose_name=_("Payment Option"), related_name="developments", blank=True)
    completed_date = models.CharField(_("Completed date"), max_length=255, null=True, blank=True)
    completed_at = models.DateField(_("Completed At"), null=True, blank=True)
    completed_status = models.IntegerField(_("Completed Status"), choices=COMPLETED_STATUS, default=0)
    is_ready_to_move = models.BooleanField(_("Ready To Move"), choices=QUESTION_BOOLEAN, default=False)
    is_sold_out = models.BooleanField(_("Sold Out"), choices=QUESTION_BOOLEAN, default=False)
    panorama_check = models.BooleanField(_("Panorama Check"), default=False, choices=QUESTION_BOOLEAN)
    
    places = models.JSONField(_("Places"), null=True, blank=True)
        
    image = WEBPField(_("Image"), upload_to=image_development_folder, blank=True, null=True)
    image_mobile = WEBPField(_("Image Mobile"), upload_to=image_mobile_development_folder, blank=True, null=True)
    
    onh_station = models.ManyToManyField(ONHStation, verbose_name=_("Station"), related_name="developments", blank=True)
    metro_lines = models.ManyToManyField(MetroLine, verbose_name=_("Metro Line"), related_name="developments",blank=True)
    onh_district = models.ManyToManyField(ONHDistrict, verbose_name=_("District"), related_name="developments", blank=True)
    onh_postcode = models.ManyToManyField(ONHPostcode, verbose_name=_("Postcode"), related_name="developments", blank=True)
    onh_area = models.ManyToManyField(ONHArea, verbose_name=_("Area"), related_name="developments", blank=True)
    onh_zone = models.ManyToManyField(ONHZone, verbose_name=_("Zone"), related_name="developments", blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
   

    
    def save(self, *args, **kwargs):
        if self.title: self.slug = slugify(self.title, allow_unicode=True)
        if self.country is None and self.location is not None:
            self.country = self.location.country
        if self.city is None and self.location is not None:
            self.city = self.location.city
        if self.completed_status == 0:
            self.is_ready_to_move = False
        else: self.is_ready_to_move = True
        if (self.reference_id is None or self.reference_id == "" or self.reference_id == "ENT-None") and self.id is not None:
            self.reference_id = f"ENT-{self.id}"
        if self.pk:
            old_instance = Development.objects.get(pk=self.pk)
            try:
                try: img = self.attachments.filter(type=0, category=0).first().image
                except: img = self.attachments.filter(type=0).first().image
                if img:
                    if old_instance.image:
                        if os.path.exists(old_instance.image.path):
                            os.remove(old_instance.image.path)
                    
                    pil_image = Image.open(img)
                    
                    # Desktop version
                    output_desktop = BytesIO()
                    desktop_image = resize_by_width(pil_image, 600)
                    desktop_image.save(output_desktop, format='WEBP', quality=85)
                    self.image = ContentFile(output_desktop.getvalue(), name=img.name)
            except Exception as e:
                print(f"Image processing error: {e}")
            try: 
                try: img = self.attachments.filter(type=0, category=0).last().image
                except: img = self.attachments.filter(type=0).last().image
                if img:
                    if old_instance.image_mobile:
                        if os.path.exists(old_instance.image_mobile.path):
                            os.remove(old_instance.image_mobile.path)
                    pil_image = Image.open(img)
                    
                    # Desktop version
                    output_mobile = BytesIO()
                    mobile_image = resize_by_width(pil_image, 460)
                    mobile_image.save(output_mobile, format='WEBP', quality=85)
                    
                    self.image_mobile = ContentFile(output_mobile.getvalue(), name=img.name)

            except Exception as e:
                print(f"Image mobile processing error: {e}")
        if self.attachments.filter(type=0).count() == 0:
            self.is_published = False
            self.is_active = False
        else:
            self.is_published = True
            self.is_active = True
        if not self.country.coordinates.contains(self.location.coordinates):
            self.is_published = False
            self.is_active = False
        try: 
            self.area = self.flats.filter(area__gt=0).aggregate(models.Max('area'))['area__max']
            if self.area is None: self.area = 0
        except: pass
        
        try: 
            self.min_area = self.flats.filter(area__gt=0).aggregate(models.Min('area'))['area__min']
            if self.min_area is None: self.min_area = 0
        except: pass
        
        try: 
            self.max_area = self.flats.filter(area__gt=0).aggregate(models.Max('area'))['area__max']
            if self.max_area is None: self.max_area = 0
        except: pass
        self.base_price = self.flats.filter(base_price__gt=0).aggregate(models.Min('base_price'))['base_price__min'] or 0
        try: super().save(*args, **kwargs)
        except Exception as e: 
            print(e)
    
    def __str__(self):
        return f"{self.title}"
    
    class Meta:
        verbose_name = _("Development")
        verbose_name_plural = _("Developments")
        ordering = ["is_sold_out", "order", "-id", 'title']
        indexes = [
            models.Index(fields=['country', 'is_active', 'is_deleted']),
            models.Index(fields=['city', 'is_active', 'is_deleted']),
            models.Index(fields=['is_featured', 'is_active', 'is_deleted']),
        ]
        
class DevelopmentTranslate(models.Model):
    language = models.ForeignKey(Language, verbose_name=_("Language"), related_name="development_translate", on_delete=models.CASCADE)
    development = models.ForeignKey(Development, verbose_name=_("Development"), related_name="translates", on_delete=models.CASCADE)
    title = models.CharField(_("Title"), max_length=150, null=True, blank=True)
    slug = models.SlugField(_("Slug"), max_length=250, null=True, blank=True)
    geo_json = models.JSONField(_("Geo JSON"), null=True, blank=True)
    last_create = models.FloatField(_("geo json lat create"), default=0)
    summary = models.TextField(_("Summary"), null=True, blank=True)
    description = models.TextField(_("Description"), null=True, blank=True)
    keywords = models.TextField(_("Keywords"), null=True, blank=True)
    features_description = models.TextField(_("Features Description"), null=True, blank=True)
    address = models.CharField(_("Address"), max_length=250, null=True, blank=True)
    neighborhood = models.TextField(_("Neighborhood"), null=True, blank=True)
    developer = models.ForeignKey(DeveloperTranslate, verbose_name=_("Developer"), related_name="development_translate", on_delete=models.CASCADE, null=True, blank=True)
    is_paraphrase = models.BooleanField(_("is paraphrase"), default=False)
    paraphrase_error = models.BooleanField(_("Paraphrase error"), default=False, choices=QUESTION_BOOLEAN)
    error = models.TextField(_("Error"), null=True, blank=True)
    last_paraphrase = models.FloatField(_("last paraphrase"), null=True, blank=True)
    is_summarize = models.BooleanField(_("is summarize"), default=False)
    summarize_has_error = models.BooleanField(_("summarize has error?"), default=False, choices=QUESTION_BOOLEAN)
    summarize_error = models.TextField(_("summarize error"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.title}"
    
    def save(self, *args, **kwargs):
        self.title = self.development.title
        if self.development.title:
            self.slug = slugify(self.development.title, allow_unicode=True)
        
        if not self.summary and self.description:
            try: self.summary = BeautifulSoup(self.description, 'html.parser').get_text()[:500]
            except: pass
        if not self.developer:
            try: 
                developer = self.development.developer.translates.all().filter(language=self.language).first()
                self.developer = developer
            except: pass
        try: super().save(*args, **kwargs)
        except Exception as e: print(f"error on save {self.id} development translate",e)
    
    class Meta:
        verbose_name = _("Development Translate")
        verbose_name_plural = _("Development Translate")
        ordering = ["id"]
        constraints = [
            models.UniqueConstraint(fields=['language', 'development'], name='repeated_language_development_translate'),
        ]
    
    
class KeyFeature(models.Model):
    development = models.ForeignKey(Development, verbose_name=_("Development"), related_name="key_features", on_delete=models.CASCADE)
    feature = models.ForeignKey(Feature, verbose_name=_("Feature"), related_name="development_features", on_delete=models.CASCADE)
    value = models.CharField(_("Value"), max_length=150, null=True, blank=True)
    num = models.FloatField(_("Num"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.development.title} {self.feature.name}"
    
    class Meta:
        verbose_name = _("Development Key Feature")
        verbose_name_plural = _("Development Key Features")
        ordering = ['feature', "id"]
        constraints = [
            models.UniqueConstraint(fields=['feature', 'development'], name='repeated_feature_development_key_feature'),
        ]
    
class AutoScoreRank(models.Model):
    development = models.ForeignKey(Development, verbose_name=_("Development"), related_name="auto_scores", on_delete=models.CASCADE)
    element = models.ForeignKey(RankElement, verbose_name=_("rank element"), related_name="development_auto_scores", on_delete=models.CASCADE)
    rank = models.FloatField(_("Rank"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)

    def __str__(self):
        return f"{self.development.title} {self.element.name}"

    class Meta:
        verbose_name = _("Development Auto Score")
        verbose_name_plural = _("Development Auto Scores")
        ordering = ['element', "id"]
    
class DevelopmentOffer(models.Model):
    development = models.ForeignKey(Development, verbose_name=_("Development"), related_name="offers", on_delete=models.CASCADE)
    text = models.TextField(_("Text"), max_length=150)
    translated = models.BooleanField(_("translated"), default=False)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)

    def __str__(self):
        return f"{self.development.title}"

    class Meta:
        verbose_name = _("Development Offer")
        verbose_name_plural = _("Development Offers")
        ordering = ["id"]
        
class DevelopmentOfferTranslate(models.Model):
    language = models.ForeignKey(Language, verbose_name=_("Language"), related_name="development_offer_translate", on_delete=models.CASCADE)
    development_offer = models.ForeignKey(DevelopmentOffer, verbose_name=_("Development Offer"), related_name="translates", on_delete=models.CASCADE)
    text = models.TextField(_("Text"), max_length=150)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)

    def __str__(self):
        return f"{self.development_offer.development.title}"
    
    class Meta:
        verbose_name = _("Development Offer Translate")
        verbose_name_plural = _("Development Offer Translate")
        ordering = ["id"]
        constraints = [
            models.UniqueConstraint(fields=['language', 'development_offer'], name='repeated_language_development_offer_translate'),
        ]
        

class PaymentPlan(models.Model):
    development = models.ForeignKey(Development, verbose_name=_("Development"), related_name="payment_plan", on_delete=models.CASCADE)
    title = models.CharField(_("title"), max_length=250)
    percent = models.FloatField(_("Percent"), default=0)
    slug = models.SlugField(_("Slug"), max_length=250, null=True, blank=True)
    translated = models.BooleanField(_("translated"), default=False)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.title}"
    
    def save(self, *args, **kwargs):
        if self.title: self.slug = slugify(self.title, allow_unicode=True)
        super().save(*args, **kwargs)
    
    class Meta:
        verbose_name = _("Payment Plan")
        verbose_name_plural = _("Payment Plan")
        ordering = ["id"]
        constraints = [
            models.UniqueConstraint(fields=['development', 'slug'], name='repeated_slug_development_payment_plan'),
        ]    
    
class PaymentPlanTranslate(models.Model):
    payment_plan = models.ForeignKey(PaymentPlan, on_delete=models.CASCADE, verbose_name=_("payment plan"), related_name="translates")
    language = models.ForeignKey(Language, on_delete=models.CASCADE, verbose_name=_("language"), related_name="payment_plan_translate")
    slug = models.SlugField(_("Slug"), max_length=250, null=True, blank=True)
    title = models.CharField(_("title"), max_length=250)
    description = models.TextField(_("description"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.title} {self.language.code}"
    
    def save(self, *args, **kwargs):
        if self.title: self.slug = slugify(self.title, allow_unicode=True)
        super().save(*args, **kwargs)
    
    class Meta:
        verbose_name = _("Payment Plan Translate")
        verbose_name_plural = _("Payment Plan Translate")
        ordering = ["id"]
        constraints = [
            models.UniqueConstraint(fields=['language', 'payment_plan'], name='repeated_language_payment_plan_translate'),
        ]    
    

class DevelopmentPublicFacility(models.Model):
    development = models.ForeignKey(Development, verbose_name=_("Development"), related_name="public_facilities", on_delete=models.CASCADE)
    public_facility = models.ForeignKey(PublicFacility, on_delete=models.CASCADE, verbose_name=_("Public Facilities"), related_name="developments")
    distance = models.FloatField(_("distance"), null=True, blank=True)
    duration = models.FloatField(_("duration"), null=True, blank=True)
    rank = models.PositiveSmallIntegerField(_("Rank"), default=10)
    
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.development.title} {self.public_facility.name}"
    
    class Meta:
        verbose_name = _("Development Public Facility")
        verbose_name_plural = _("Development Public Facilities")
        ordering = ["distance", "duration", "rank", "id"]
        constraints = [
            models.UniqueConstraint(fields=['public_facility', 'development'], name='repeated_public_facility_development'),
        ]
    
    
class Flat(models.Model):
    development = models.ForeignKey(Development, verbose_name=_("Development"), related_name="flats", on_delete=models.CASCADE)
    bedrooms_num = models.IntegerField(_("Bedrooms Number"), default=0, db_index=True)
    bathrooms_num = models.IntegerField(_("Bathrooms Number"), default=0)
    
    is_active = models.BooleanField(_("active"), default=False, choices=ACTIVE_BOOLEAN)
    is_published = models.BooleanField(_("Published"), default=False, choices=QUESTION_BOOLEAN)
    is_featured = models.BooleanField(_("Featured"), default=False, choices=QUESTION_BOOLEAN)
    is_checked = models.BooleanField(_("Checked"), default=False, choices=QUESTION_BOOLEAN)
    is_sold_out = models.BooleanField(_("Sold Out"), default=False, choices=QUESTION_BOOLEAN)
    area = models.FloatField(_("Area"), default=0, db_index=True)
    price_per_meter = models.FloatField(_("Price Per Meter"), default=0, db_index=True)
    base_price = models.FloatField(_("Base Price"), default=0, db_index=True)

    order = models.IntegerField(_("Order"), default=0)
    
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def save(self, *args, **kwargs):
        if self.base_price == 0:
            self.base_price = self.price_per_meter * self.area
        return super().save(*args, **kwargs)
    
    def __str__(self):
        return f"{self.development.title} : {self.bedrooms_num} : {self.bathrooms_num}"
    
    class Meta:
        verbose_name = _("Development Flat")
        verbose_name_plural = _("Development Flats")
        ordering = ["bedrooms_num", "-order", "id"]
    
class FlatTranslate(models.Model):
    language = models.ForeignKey(Language, verbose_name=_("Language"), related_name="flat_translate", on_delete=models.CASCADE)
    flat = models.ForeignKey(Flat, verbose_name=_("Flat"), related_name="translates", on_delete=models.CASCADE)
    description = models.TextField(_("Description"), null=True, blank=True)
    name = models.CharField(_("Name"), max_length=150, null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.flat.development.title}-{self.language.code}"
    
    def save(self, *args, **kwargs):
        self.name = flat_bedroom_type(self.flat.bedrooms_num, lang=self.language.code)
        super().save(*args, **kwargs)
    
    class Meta:
        verbose_name = _("Development Flat Translate")
        verbose_name_plural = _("Development Flats Translate")
        ordering = ["flat", "id"]
        constraints = [
            models.UniqueConstraint(fields=['language', 'flat'], name='repeated_language_flat_translate'),
        ]
    
    
PRICE_EVENT = [
    (0, _("Price Change")),
    (1, _("Ownership Change")),
    (2, _("Renovation")),
    (3, _("Other")),
]
    
    
class FlatPriceHistory(models.Model):
    flat = models.ForeignKey(Flat, verbose_name=_("Flat"), related_name="price_history", on_delete=models.CASCADE)
    event = models.SmallIntegerField(_("Event"), choices=PRICE_EVENT, default=0)
    price = models.FloatField(_("Price"), default=0)
    time = models.FloatField(_('time'), null=True, blank=True)
    
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.flat.development.title}"
    
    class Meta:
        verbose_name = _("Development Flat Price")
        verbose_name_plural = _("Development Flat Prices")
        ordering = ["time", "id"]
        
class DevelopmentReview(models.Model):
    development = models.ForeignKey(Development, verbose_name=_("Development"), related_name="reviews", on_delete=models.CASCADE)
    flat = models.ForeignKey(Flat, verbose_name=_("Flat"), related_name="reviews", on_delete=models.CASCADE, null=True, blank=True)
    user = models.ForeignKey(User, on_delete=models.SET_NULL, verbose_name=_("user"), related_name="development_reviews", null=True, blank=True)
    
    review = models.TextField(_("Review"), null=True, blank=True)
    rate = models.IntegerField(_("Rate"), default=10)

    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)

    def __str__(self):
        return f"{self.development.title}"

    class Meta:
        verbose_name = _("Development Review")
        verbose_name_plural = _("Development Reviews")
        ordering = ["id"]


ATTACHMENT_CATEGORY = [
    (0, _("Public")),
    (1, _("Exterior")),
    (2, _("Interior")),
    (3, _("Amenities")),
    (4, _("Floor Plans")),
    (5, _("Site Plans")),
    (6, _("Flat Plans")),
    (7, _("Street View")),
]

ATTACHMENT_TYPE = [
    (0, _("Image")),
    (1, _("Video")),
    (2, _("Audio")),
    (3, _("Document")),
    (4, _("Video URL")),
    (5, _("Audio URL")),
    (6, _("Document URL")),
]

def image_development_attach_folder(instance, filename):
    try: file_name = ''.join(filename.split('.')[:-1])
    except: file_name = uuid.uuid4().hex
    return f'development/{instance.development.slug}/attachments/{file_name}.webp'

def file_development_attach_folder(instance, filename):
    
    return f'development/{instance.development.slug}/attachments/{filename}'
        
class Attachment(models.Model):
    development = models.ForeignKey(Development, verbose_name=_("Development"), related_name="attachments", on_delete=models.CASCADE)
    file = models.FileField(_("File"), upload_to=file_development_attach_folder, null=True, blank=True)
    image = WEBPField(_("Image"), upload_to=image_development_attach_folder, null=True, blank=True)
    file_name = models.CharField(_("Image Name"), max_length=255, null=True, blank=True)
    link = models.URLField(_("Link"), null=True, blank=True)
    title = models.CharField(_("Title"), max_length=255)
    alt = models.CharField(_("Alt"), max_length=255, null=True, blank=True)
    type = models.SmallIntegerField(_("File Type"), choices=ATTACHMENT_TYPE, default=0)
    category = models.SmallIntegerField(_("Category"), choices=ATTACHMENT_CATEGORY, default=0)

    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def save(self, *args, **kwargs):
        if self.file_name is None:
            n = " ".join(os.path.basename(self.file.name).split(".")[:-1])
            self.file_name = slugify(n, allow_unicode=True)
        title = f"{self.development.title}-{self.get_category_display()} {self.get_type_display()}"
        self.title = title
        self.alt = f"{title}#{uuid.uuid4().hex[:5]}"
        super().save(*args, **kwargs)

    def __str__(self):
        return f"{self.development.title}"

    class Meta:
        verbose_name = _("Development Attachment")
        verbose_name_plural = _("Development Attachments")
        ordering = ["id"]
        constraints = [
            models.UniqueConstraint(fields=['development', 'file_name', "category"], name='repeated_file_name_development_attachment'),
        ]

class FaqCategory(models.Model):
    title = models.CharField(_("Title"), max_length=250)
    order = models.IntegerField(_("Order"), default=0)
    
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def save(self, *args, **kwargs):
        if self.order == 0:
            self.order = FaqCategory.objects.count() + 1
        return super().save(*args, **kwargs)

    def __str__(self):
        return f"{self.title}"
    
    class Meta:
        verbose_name = _("Development FAQ Category")
        verbose_name_plural = _("Development FAQ Categories")
        ordering = ["order", "-id"]
        
class FaqCategoryTranslate(models.Model):
    language = models.ForeignKey(Language, verbose_name=_("Language"), related_name="faq_category_translate", on_delete=models.CASCADE)
    category = models.ForeignKey(FaqCategory, verbose_name=_("Flat"), related_name="translates", on_delete=models.CASCADE)
    title = models.CharField(_("Title"), max_length=250)
    
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)

    def __str__(self):
        return f"{self.title}"
    
    class Meta:
        verbose_name = _("Development FAQ Category Translate")
        verbose_name_plural = _("Development FAQ Category Translates")
        ordering = ["category","-id"] 
        constraints = [
            models.UniqueConstraint(fields=["language", "category"], name='repeated_development_faq_category_language_translate'),
        ]
        
        
class FaqFormula(models.Model):
    Language = models.ForeignKey(Language, verbose_name=_("Language"), related_name="faq_formula", on_delete=models.CASCADE)
    category = models.ForeignKey(FaqCategory, verbose_name=_("Category"), related_name="formula", on_delete=models.CASCADE)
    question = models.TextField(_("Question"))
    answer = models.TextField(_("Answer"))
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    def __str__(self):
        return f"{self.question}"

    class Meta:
        verbose_name = _("Development FAQ Formula")
        verbose_name_plural = _("Development FAQ Formulas")
        ordering = ["id"]
        
        
class Faq(models.Model):
    development = models.ForeignKey(Development, verbose_name=_("Development"), related_name="faqs", on_delete=models.CASCADE)
    category = models.ForeignKey(FaqCategory, verbose_name=_("Category"), related_name="faqs", on_delete=models.CASCADE)
    question = models.TextField(_("Question"))
    is_active = models.BooleanField(_("active"), default=True)
    is_translated = models.BooleanField(_("translated"), default=False)

    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)

    def __str__(self):
        return f"{self.question}"

    class Meta:
        verbose_name = _("Development FAQ")
        verbose_name_plural = _("Development FAQs")
        ordering = ["-id"]
        constraints = [
            models.UniqueConstraint(fields=["development", "question", "category"], name='repeated_development_faq_question'),
        ]
        
class FaqTranslate(models.Model):
    faq = models.ForeignKey(Faq, on_delete=models.CASCADE, related_name="translates")
    language = models.ForeignKey(Language, on_delete=models.CASCADE, related_name="development_faq_translations")
    question = models.TextField(_("Question"))
    answer = models.TextField(_("Answer"))
    created_time = models.FloatField(_("created time"), default=0)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.question}"
    
    class Meta:
        verbose_name = _("Development FAQ Translation")
        verbose_name_plural = _("Development FAQ Translations")
        ordering = ["-id"]
        constraints = [
            models.UniqueConstraint(fields=["faq", "language"], name='repeated_development_faq_language_translate'),
        ]
        

class FilterSeoText(models.Model):    
    country = models.ForeignKey(Country, verbose_name=_("Country"), related_name="development_filter_seo_text", on_delete=models.CASCADE)
    city = models.ForeignKey(City, verbose_name=_("City"), related_name="development_filter_seo_text", on_delete=models.CASCADE, null=True, blank=True)
    
    first_filter = models.CharField(_("First Filter"), max_length=250, null=True, blank=True)
    first_filter_prefix = models.CharField(_("First Filter Prefix"), max_length=250, default="in")
    first_filter_type = models.CharField(_("First Filter Type"), max_length=250, null=True, blank=True)
    second_filter = models.CharField(_("Second Filter"), max_length=250, null=True, blank=True)
    second_filter_prefix = models.CharField(_("Second Filter Prefix"), max_length=250, default="with")
    second_filter_type = models.CharField(_("Second Filter Type"), max_length=250, null=True, blank=True)
    
    text = models.TextField(_("Text"), null=True, blank=True)
    check_for_text = models.BooleanField(_("Check For Text"), default=False)
    get_text_error = models.BooleanField(_("Get Text Error"), default=False)
    get_text_error_message = models.TextField(_("Get Text Error Message"), null=True, blank=True)
    is_paraphrase = models.BooleanField(_("Paraphrase"), default=False)
        
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)

    def __str__(self):
        return f"""{self.country.code} {self.city.name if self.city else ""} {self.first_filter if self.first_filter else ""} {self.first_filter_type if self.first_filter else ""} {self.second_filter if self.second_filter else ""} {self.second_filter_type if self.second_filter else ""}"""
    
    class Meta:
        verbose_name = _("Development Filter Seo Text")
        verbose_name_plural = _("Development Filter Seo Texts")
        ordering = ["id"]
        unique_together = ["country", "city", "first_filter", "first_filter_type", "second_filter", "second_filter_type"]
        
class FilterSeoTextTranslate(models.Model):
    language = models.ForeignKey(Language, on_delete=models.CASCADE, verbose_name=_("Language"), related_name="development_filter_seo_text_translate")
    filter_seo_text = models.ForeignKey(FilterSeoText, on_delete=models.CASCADE, verbose_name=_("Filter Seo Text"), related_name="translates")
    text = models.TextField(_("Text"), null=True, blank=True)

    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"""{self.language.code} {self.filter_seo_text.country.code} {self.filter_seo_text.city.name if self.filter_seo_text.city else ""}"""

    class Meta:
        verbose_name = _("Development Filter Seo Text Translation")
        verbose_name_plural = _("Development Filter Seo Text Translations")
        ordering = ["id"]
        unique_together = ["language", "filter_seo_text"]

class DevelopmentFilterList(models.Model):
    language = models.ForeignKey(Language, on_delete=models.CASCADE, verbose_name=_("language"), related_name="development_filter_list")
    
    country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name=_("country"), related_name="development_filter_list")
    city = models.ForeignKey(City, on_delete=models.CASCADE, verbose_name=_("city"), related_name="development_filter_list", null=True, blank=True)
    featured = models.BooleanField(_("featured"), default=None, null=True, blank=True)
    available = models.BooleanField(_("available"), default=None, null=True, blank=True)
    ready_to_move = models.BooleanField(_("ready to move"), default=None, null=True, blank=True)
    search = models.CharField(_("search"), max_length=255, null=True, blank=True)
    stations = models.ManyToManyField(ONHStation, verbose_name=_("stations"), related_name="development_filter_list", blank=True)
    districts = models.ManyToManyField(ONHDistrict, verbose_name=_("districts"), related_name="development_filter_list", blank=True)
    postcodes = models.ManyToManyField(ONHPostcode, verbose_name=_("postcodes"), related_name="development_filter_list", blank=True)
    features = models.ManyToManyField(Feature, verbose_name=_("features"), related_name="development_filter_list", blank=True)
    area = models.ManyToManyField(LondonArea, verbose_name=_("areas"), related_name="development_filter_list", blank=True)
    zone = models.ManyToManyField(LondonZone, verbose_name=_("zones"), related_name="development_filter_list", blank=True)
    bedroom = models.JSONField(_("bedrooms"), null=True, blank=True)
    payment_options = models.ManyToManyField(PaymentOption, verbose_name=_("payment options"), related_name="development_filter_list", blank=True)
    complete_year = models.JSONField(_("complete year"), null=True, blank=True)
    min_price = models.IntegerField(_("min price"), null=True, blank=True)
    max_price = models.IntegerField(_("max price"), null=True, blank=True)
    
    query = models.TextField(_("query"), null=True, blank=True)
    
    development_translate = models.ManyToManyField(DevelopmentTranslate, verbose_name=_("development translate"), related_name="development_filter_list", blank=True)
    
    title = models.CharField(_("title"), max_length=255, null=True, blank=True)
    description = models.TextField(_("description"), null=True, blank=True)
    image = models.CharField(_("image"), max_length=255, null=True, blank=True)
    keywords = models.CharField(_("keywords"), max_length=255, null=True, blank=True)
    canonical_url = models.CharField(_("canonical url"), max_length=255, null=True, blank=True)
    
    seo_text = models.TextField(_("seo text"), null=True, blank=True)
    seo_text_generated = models.BooleanField(_("seo text generated"), default=False)
    seo_text_generated_at = models.FloatField(_("seo text generated at"), null=True, blank=True)
    
    
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def save(self, *args, **kwargs):
        return super().save(*args, **kwargs)
    
    def __str__(self):
        return f"{self.title}"
    
    class Meta:
        verbose_name = _("Filter List")
        verbose_name_plural = _("Filter List")
        ordering = ["title", "id"]
        
        
class DevelopmentDetail(models.Model):
    development = models.OneToOneField(Development, on_delete=models.CASCADE, verbose_name=_("development"), related_name="development_detail")
    description = models.TextField(_("description"), null=True, blank=True)
    summary = models.TextField(_("summary"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def save(self, *args, **kwargs):
        return super().save(*args, **kwargs)
    
    def __str__(self):
        return f"{self.development.title}"
    
    class Meta:
        verbose_name = _("Development Detail")
        verbose_name_plural = _("Development Details")
        ordering = ["development__title", "id"]
        
