from djongo import models
from jsonfield import JSONField
from djongo.models import ObjectIdField

# MongoDB Collections
    
class Offices(models.Model):
    """
    Model representing an office in the REMax portal.
    Attributes:
        id (ObjectIdField): The unique identifier for the office.
        office_id (IntegerField): The office ID.
        name (CharField): The name of the office.
        email (EmailField): The email address of the office.
        address (CharField): The address of the office.
        street_number (CharField): The street number of the office.
        complement (CharField): Additional address information.
        postal_code (CharField): The postal code of the office.
        website (URLField): The website URL of the office.
        logo (URLField): The logo URL of the office.
        telephone (CharField): The telephone number of the office.
        lat (FloatField): The latitude coordinate of the office.
        lng (FloatField): The longitude coordinate of the office.
        total_properties (IntegerField): The total number of properties managed by the office.
        creci (CharField): The CRECI (Real Estate Registration) number of the office.
        neighborhood (CharField): The neighborhood where the office is located.
        region_name (CharField): The region name where the office is located.
        city (CharField): The city where the office is located.
        state (CharField): The state where the office is located.
        state_abbreviation (CharField): The abbreviation of the state.
        country (CharField): The country where the office is located.
        country_abbreviation (CharField): The abbreviation of the country.
        complements_info (JSONField): Additional information about the office in JSON format.
    Meta:
        db_table (str): The name of the database table.
        verbose_name (str): The human-readable name of the model.
        verbose_name_plural (str): The human-readable plural name of the model.
        app_label (str): The name of the app this model belongs to.
        managed (bool): Whether the model is managed by Django.
    Methods:
        __str__(): Returns a string representation of the office.
        __repr__(): Returns a string representation of the office.
        create(*args, **kwargs): Creates a new office record in the MongoDB database.
        save(*args, **kwargs): Saves the office record to the MongoDB database.
        delete(*args, **kwargs): Deletes the office record from the MongoDB database.
    """
    id = models.ObjectIdField(editable=False, primary_key=True, default=None, unique=True, db_column='_id')
    office_id = models.IntegerField(null=False, default=None, unique=True)
    name = models.CharField(max_length=100, null=True, default=None)
    email = models.EmailField(max_length=100, null=True, default=None)
    address = models.CharField(max_length=255, null=True, default=None)
    street_number = models.CharField(max_length=255, null=True, default=None)
    complement = models.CharField(max_length=255, null=True, default=None)
    postal_code = models.CharField(max_length=20, null=True, default=None)
    website = models.URLField(max_length=100, null=True, default=None)
    logo = models.URLField(max_length=100, null=True, default=None)
    telephone = models.CharField(max_length=50, null=True, default=None)
    lat = models.FloatField(null=True, default=None)
    lng = models.FloatField(null=True, default=None)
    total_properties = models.IntegerField(null=False, default=0)
    creci = models.CharField(max_length=20, null=True, default=None)
    neighborhood = models.CharField(max_length=100, null=True, default=None)
    region_name = models.CharField(max_length=100, null=True, default=None)
    city = models.CharField(max_length=100, null=True, default=None)
    state = models.CharField(max_length=100, null=True, default=None)
    state_abbreviation = models.CharField(max_length=10, null=True, default=None)
    country = models.CharField(max_length=100, null=True, default=None)
    country_abbreviation = models.CharField(max_length=10, null=True, default=None)
    complements_info = JSONField(null=True, default=None, db_column='complements_info')
    
    #distance = models.CharField(max_length=20, null=True, default=None)
    #distance = models.DecimalField(null=True, max_digits=20, decimal_places=10, default=None)
    #distance = models.FloatField(null=True, default=None)

    objects = models.DjongoManager()

    class Meta:
            db_table = 'v1_offices'
            verbose_name = 'Office'
            verbose_name_plural = 'Offices'
            app_label = "v1"
            managed = False
    
    def __str__(self) -> str:
        return f"{self.name} "
    
    def __repr__(self):
        return self.__str__()
    
    def create(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().create(*args, **kwargs)

    def save(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().delete(*args, **kwargs)


class Agents(models.Model):
    id = models.ObjectIdField(editable=False, primary_key=True, default=None, unique=True, db_column='_id')
    agent_id = models.IntegerField(null=False, default=None, unique=True)
    name = models.CharField(max_length=100, null=True, default=None)
    email = models.EmailField(max_length=100, null=True, default=None)
    telephone = models.CharField(max_length=50, null=True, default=None)
    creci = models.CharField(max_length=20, null=True, default=None)
    website = models.URLField(max_length=100, null=True, default=None)
    region_id = models.IntegerField(null=True, default=None)
    profile_picture = models.CharField(max_length=255, null=True, default=None)
    total_properties = models.IntegerField(null=False, default=0)
    address = models.CharField(max_length=255, null=True, default=None)
    street_number = models.CharField(max_length=255, null=True, default=None)
    complement = models.CharField(max_length=255, null=True, default=None)
    postal_code = models.CharField(max_length=20, null=True, default=None)
    neighborhood = models.CharField(max_length=100, null=True, default=None)
    region_name = models.CharField(max_length=100, null=True, default=None)
    city = models.CharField(max_length=100, null=True, default=None)
    state = models.CharField(max_length=100, null=True, default=None)
    state_abbreviation = models.CharField(max_length=10, null=True, default=None)
    country = models.CharField(max_length=100, null=True, default=None)
    country_abbreviation = models.CharField(max_length=10, null=True, default=None)
    lng = models.FloatField(null=True, default=None)
    lat = models.FloatField(null=True, default=None)
    complements_info = JSONField(null=True, default=None, db_column='complements_info')
    
    #distance = models.CharField(max_length=20, null=True, default=None)
    #distance = models.DecimalField(null=True, max_digits=20, decimal_places=10, default=None)
    #distance = models.FloatField(null=True, default=None)
    office = models.ForeignKey(Offices, on_delete=models.DO_NOTHING, to_field='office_id', db_column='office_id', default=None)
    
    objects = models.DjongoManager()

    class Meta:
            db_table = 'v1_agents'
            verbose_name = 'Agent'
            verbose_name_plural = 'Agents'
            app_label = "v1"
            managed = False
    
    def __str__(self) -> str:
        return f"{self.name} "
    
    def __repr__(self):
        return self.__str__()
    
    def create(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().create(*args, **kwargs)

    def save(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().delete(*args, **kwargs)

        


class Location(models.Model):
    id = models.ObjectIdField(editable=False, primary_key=True, default=None, unique=True, db_column='_id')
    property_location_id = models.IntegerField(null=False, default=None, unique=True)
    display_address = models.CharField(max_length=20, null=True, default=None)
    country = models.CharField(max_length=100, null=True, default=None)
    country_abbreviation = models.CharField(max_length=10, null=True, default=None)
    state = models.CharField(max_length=100, null=True, default=None)
    city = models.CharField(max_length=100, null=True, default=None)
    zone = models.CharField(max_length=100, null=True, default=None)
    neighborhood = models.CharField(max_length=100, null=True, default=None)
    complement = models.CharField(max_length=255, null=True, default=None)
    address = models.CharField(max_length=255, null=True, default=None)
    street_number = models.CharField(max_length=255, null=True, default=None)
    postal_code = models.CharField(max_length=20, null=True, default=None)
    #lat = models.CharField(max_length=20, null=True, default=None)
    #lng = models.CharField(max_length=20, null=True, default=None)
    lat = models.FloatField(null=True, default=None)
    lng = models.FloatField(null=True, default=None)
    
    objects = models.DjongoManager()

    class Meta:
            db_table = 'v1_properties_location'
            verbose_name = 'Location'
            verbose_name_plural = 'Locations'
            app_label = "v1"
            managed = False
    
    def __str__(self) -> str:
        return f"Neighborhood: {self.neighborhood}, City: {self.city}, State: {self.state}"
    
    def __repr__(self):
        return self.__str__()
    
    def create(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().create(*args, **kwargs)

    def save(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().delete(*args, **kwargs)

        
class Features(models.Model):
    id = models.ObjectIdField(editable=False, default=None, unique=True, db_column='_id')
    feature_id = models.IntegerField(null=False, default=None, unique=True)
    feature_name_en = models.CharField(max_length=100, null=True, default=None)
    feature_name_pt = models.CharField(max_length=100, null=True, default=None)
    
    objects = models.DjongoManager()

    class Meta:
            db_table = 'v1_features'
            verbose_name = 'Feature'
            verbose_name_plural = 'Features'
            app_label = "v1"
            managed = False
    
    def __str__(self) -> str:
        return f"{self.feature_name_en}, {self.feature_name_pt} "
    
    def __repr__(self):
        return self.__str__()
    
    def create(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().create(*args, **kwargs)

    def save(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().delete(*args, **kwargs)
        


class Usages(models.Model):
    id = models.ObjectIdField(editable=False, default=None, unique=True, db_column='_id')
    usage_id = models.IntegerField(null=False, default=None, unique=True)
    usage_name_en = models.CharField(max_length=100, null=True, default=None)
    usage_name_pt = models.CharField(max_length=100, null=True, default=None)
    
    objects = models.DjongoManager()

    class Meta:
            db_table = 'v1_usages'
            verbose_name = 'Usage'
            verbose_name_plural = 'Usages'
            app_label = "v1"
            managed = False
    
    def __str__(self) -> str:
        return f"{self.usage_name_en}, {self.usage_name_pt} "
    
    def __repr__(self):
        return self.__str__()
    
    def create(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().create(*args, **kwargs)

    def save(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().delete(*args, **kwargs)

class Types(models.Model):
    id = models.ObjectIdField(editable=False, primary_key=True, default=None, unique=True, db_column='_id')
    type_id = models.IntegerField(null=False, unique=True)
    type_name_en = models.CharField(max_length=100, null=True, default=None)
    type_name_pt = models.CharField(max_length=100, null=True, default=None)
    usage = models.ForeignKey(Usages, on_delete=models.DO_NOTHING, default=None, related_name='types')
    
    objects = models.DjongoManager()

    class Meta:
            db_table = 'v1_types'
            verbose_name = 'Type'
            verbose_name_plural = 'Types'
            app_label = "v1"
            managed = False
    
    def __str__(self) -> str:
        return f"{self.type_name_en}, {self.type_name_pt} "
    
    def __repr__(self):
        return self.__str__()
    
    def create(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().create(*args, **kwargs)

    def save(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().delete(*args, **kwargs)
        
        

class Properties(models.Model):
    id = models.ObjectIdField(editable=False, primary_key=True, default=None, unique=True, db_column='_id')
    property_id = models.IntegerField(null=False, default=None, unique=True)
    listing_id = models.CharField(max_length=100, null=False, default=None)
    title = models.CharField(max_length=255, null=True, default=None)
    transaction_type = models.CharField(max_length=50, null=True, default=None)
    detail_view_url = models.URLField(max_length=100, null=True, default=None)
    description = models.TextField(null=True, blank=True, default=None)
    list_price = models.DecimalField(null=True, max_digits=10, decimal_places=2)
    list_price_currency = models.CharField(max_length=5, null=True, default=None)
    rental_price = models.DecimalField(null=True, max_digits=10, decimal_places=2)
    rental_price_currency = models.CharField(max_length=5, null=True, default=None)
    rental_price_period = models.CharField(max_length=50, null=True, default=None)
    property_administration_fee = models.DecimalField(null=True, max_digits=10, decimal_places=2)
    property_administration_fee_period = models.CharField(max_length=30, null=True, default=None)
    yearly_tax = models.DecimalField(null=True, max_digits=10, decimal_places=2)
    yearly_tax_currency = models.CharField(max_length=5, null=True, default=None)
    living_area = models.IntegerField(null=True, default=None)
    living_area_unit = models.CharField(max_length=30, null=True, default=None)
    year_built = models.IntegerField(null=True, default=None)
    bedrooms = models.IntegerField(null=True, default=None)
    bathrooms = models.IntegerField(null=True, default=None)
    garage = models.IntegerField(null=True, default=None)
    garage_type = models.CharField(max_length=30, null=True, default=None)
    unit_floor = models.IntegerField(null=True, default=None)
    unit_number = models.CharField(max_length=30, null=True, default=None)
    publish_date = models.DateTimeField(null=True, default=None)
    sync_date = models.DateTimeField(null=True, default=None)
    region_id = models.IntegerField(null=True, default=None)
    usage = models.ForeignKey(Usages, on_delete=models.DO_NOTHING, default=None)
    type = models.ForeignKey(Types, on_delete=models.DO_NOTHING, default=None)
    office = models.ForeignKey(Offices, on_delete=models.DO_NOTHING, default=None)
    agent = models.ForeignKey(Agents, on_delete=models.DO_NOTHING, default=None)
    location = models.ForeignKey(Location, on_delete=models.DO_NOTHING, default=None)

    objects = models.DjongoManager()

    class Meta:
            db_table = 'v1_properties'
            verbose_name = 'Property'
            verbose_name_plural = 'Properties'
            app_label = "v1"
            managed = False
    
    def __str__(self) -> str:
        return f"{self.title}"
    
    def __repr__(self):
        return self.__str__()
    
    def create(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().create(*args, **kwargs)

    def save(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().delete(*args, **kwargs)


class PropertiesFeatures(models.Model):
    id = models.ObjectIdField(editable=False, default=None, unique=True, db_column='_id')
    property_feature_id = models.IntegerField(null=False, default=None, unique=True)
    feature = models.ForeignKey(Features, on_delete=models.DO_NOTHING, default=None, related_name='properties')
    property = models.ForeignKey(Properties, on_delete=models.DO_NOTHING, default=None, related_name='features')

    objects = models.DjongoManager()

    class Meta:
            db_table = 'v1_properties_features'
            verbose_name = 'Property Feature'
            verbose_name_plural = 'Properties Features'
            app_label = "v1"
            managed = False
    
    def __str__(self) -> str:
        return f"{self.property_feature_id} "
    
    def __repr__(self):
        return self.__str__()
    
    def create(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().create(*args, **kwargs)

    def save(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().delete(*args, **kwargs)
        



class PropertiesMedia(models.Model):
    id = models.ObjectIdField(editable=False, default=None, unique=True, db_column='_id')
    property_media_id = models.IntegerField(null=False, default=None, unique=True)
    type = models.CharField(max_length=20, null=True, default=None)
    main = models.IntegerField(null=True,default=None)
    url = models.URLField(max_length=255, null=True, default=None)
    property = models.ForeignKey(Properties, on_delete=models.DO_NOTHING, default=None, related_name='medias')
    
    objects = models.DjongoManager()
    
    class Meta:
            db_table = 'v1_properties_media'
            verbose_name = 'Property Media'
            verbose_name_plural = 'Properties Media'
            app_label = "v1"
            managed = False
    
    def __str__(self) -> str:
        return f"{self.url} "
    
    def __repr__(self):
        return self.__str__()
    
    def create(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().create(*args, **kwargs)

    def save(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().delete(*args, **kwargs)



class Medias(models.Model):
    id = models.ObjectIdField(editable=False, default=None, unique=True, db_column='_id')
    property_media_id = models.IntegerField(null=False, default=None, unique=True)
    type = models.CharField(max_length=20, null=True, default=None)
    main = models.IntegerField(null=True,default=None)
    url = models.URLField(max_length=255, null=True, default=None)

    objects = models.DjongoManager()
    
    class Meta:
            db_table = 'v1_medias'
            verbose_name = 'Media'
            verbose_name_plural = 'Medias'
            app_label = "v1"
            managed = False
    
    def __str__(self) -> str:
        return f"{self.url} "
    
    def __repr__(self):
        return self.__str__()
    
    def create(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().create(*args, **kwargs)

    def save(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().delete(*args, **kwargs)
        
        
### Dynamic Models directly from MongoDB


# from mongoengine import DynamicDocument, connect, fields
# from django.conf import settings

# class PropertiesComplete(DynamicDocument):

#     meta = {
#         'collection': 'v1_properties_complete',
#         'strict': False,  # Allow to save fields not defined in the model
#         'indexes': [
#             'property_id',
#         ],
#         'create': False,
#         'db_alias': 'mongodb-alias',
#     }

#     @classmethod
#     def connect_to_mongodb(cls):
#         mongo_settings = settings.DATABASES['mongodb']
#         try:
#             connect(
#                 alias='mongodb-alias',
#                 db=mongo_settings['NAME'],
#                 host=mongo_settings['CLIENT']['host'],
#                 port=mongo_settings['CLIENT']['port'],
#                 username=mongo_settings['CLIENT']['username'],
#                 password=mongo_settings['CLIENT']['password'],
#                 authentication_source=mongo_settings['CLIENT']['authSource'],
#                 authentication_mechanism=mongo_settings['CLIENT']['authMechanism'],
#             )
#             print("Connected to MongoDB successfully.")
#         except Exception as e:
#             print(f"Error connecting to MongoDB: {e}")


# class OldPropertiesNested(models.Model):
#     id = models.ObjectIdField(editable=False, default=None, unique=True, db_column='_id')
#     property_id = models.PositiveIntegerField(null=False, default=None, unique=True)
#     listing_id = models.CharField(max_length=100, null=False, default=None)
#     title = models.CharField(max_length=255, null=True, default=None)
#     transaction_type = models.CharField(max_length=50, null=True, default=None)
#     detail_view_url = models.URLField(max_length=100, null=True, default=None)
#     description = models.TextField(null=True, blank=True, default=None)
#     list_price = models.DecimalField(null=True, max_digits=10, decimal_places=2)
#     list_price_currency = models.CharField(max_length=5, null=True, default=None)
#     rental_price = models.DecimalField(null=True, max_digits=10, decimal_places=2)
#     rental_price_currency = models.CharField(max_length=5, null=True, default=None)
#     rental_price_period = models.CharField(max_length=50, null=True, default=None)
#     property_administration_fee = models.DecimalField(null=True, max_digits=10, decimal_places=2)
#     property_administration_fee_period = models.CharField(max_length=30, null=True, default=None)
#     yearly_tax = models.DecimalField(null=True, max_digits=10, decimal_places=2)
#     yearly_tax_currency = models.CharField(max_length=5, null=True, default=None)
#     living_area = models.IntegerField(null=True, default=None)
#     living_area_unit = models.CharField(max_length=30, null=True, default=None)
#     year_built = models.IntegerField(null=True, default=None)
#     bedrooms = models.IntegerField(null=True, default=None)
#     bathrooms = models.IntegerField(null=True, default=None)
#     garage = models.IntegerField(null=True, default=None)
#     garage_type = models.CharField(max_length=30, null=True, default=None)
#     unit_floor = models.IntegerField(null=True, default=None)
#     unit_number = models.CharField(max_length=30, null=True, default=None)
#     publish_date = models.DateTimeField(null=True, default=None)
#     sync_date = models.DateTimeField(null=True, default=None)
#     #region_id = models.IntegerField(null=True, default=None)
#     usage = JSONField(null=True, default=None, db_column='usage')
#     type = JSONField(null=True, default=None, db_column='type')
#     office = JSONField(null=True, default=None, db_column='office')
#     agent = JSONField(null=True, default=None, db_column='agent')
#     location = JSONField(null=True, default=None, db_column='location')
#     medias = JSONField(null=True, default=None, db_column='medias')
#     features = JSONField(null=True, default=None,db_column='features')
#     transfer_date = models.DateTimeField(null=True, default=None)
    
#     objects = models.DjongoManager()


#     class Meta:
#             db_table = 'v1_properties_nested'
#             verbose_name = 'Property Nested'
#             verbose_name_plural = 'Properties Nested'
#             app_label = "v1"
#             managed = False
#             ordering = ['-property_id']
    
#     def __str__(self) -> str:
#         return f"{self.property_id} "
    
#     def __repr__(self):
#         return self.__str__()






###########################################################
class PropertiesNested(models.Model):
    id = models.ObjectIdField(editable=False, default=None, unique=True, db_column='_id')
    property_id = models.PositiveIntegerField(null=False, default=None, unique=True)
    listing_id = models.CharField(max_length=100, null=False, default=None)
    #title = models.CharField(max_length=255, null=True, default=None)
    transaction_type = models.CharField(max_length=50, null=True, default=None)
    detail_view_url = models.URLField(max_length=100, null=True, default=None)
    #description = models.TextField(null=True, blank=True, default=None)
    list_price = models.DecimalField(null=True, max_digits=10, decimal_places=2)
    list_price_currency = models.CharField(max_length=5, null=True, default=None)
    rental_price = models.DecimalField(null=True, max_digits=10, decimal_places=2)
    rental_price_currency = models.CharField(max_length=5, null=True, default=None)
    #rental_price_period = models.CharField(max_length=50, null=True, default=None)
    #property_administration_fee = models.DecimalField(null=True, max_digits=10, decimal_places=2)
    #property_administration_fee_period = models.CharField(max_length=30, null=True, default=None)

    yearly_tax = models.DecimalField(null=True, max_digits=10, decimal_places=2)
    yearly_tax_currency = models.CharField(max_length=5, null=True, default=None)
    living_area = models.DecimalField(null=True, default=None, max_digits=10, decimal_places=2)
    living_area_unit = models.CharField(max_length=30, null=True, default=None)
    year_built = models.IntegerField(null=True, default=None)
    bedrooms = models.IntegerField(null=True, default=None)
    bathrooms = models.IntegerField(null=True, default=None)
    garage = models.IntegerField(null=True, default=None)
    garage_type = models.CharField(max_length=30, null=True, default=None)
    unit_floor = models.IntegerField(null=True, default=None)
    unit_number = models.CharField(max_length=30, null=True, default=None)
    publish_date = models.DateTimeField(null=True, default=None)
    sync_date = models.DateTimeField(null=True, default=None)
    #region_id = models.IntegerField(null=True, default=None)
    
    #JSON Fields
    property_administration_fee_period = JSONField(null=True, default=None, db_column='property_administration_fee_period')
    rental_price_period = JSONField(null=True, default=None, db_column='rental_price_period')
    usage = JSONField(null=True, default=None, db_column='usage')
    type = JSONField(null=True, default=None, db_column='type')
    office = JSONField(null=True, default=None, db_column='office')
    agent = JSONField(null=True, default=None, db_column='agent')
    location = JSONField(null=True, default=None, db_column='location')
    medias = JSONField(null=True, default=None, db_column='medias')
    features = JSONField(null=True, default=None,db_column='features')
    descriptions = JSONField(null=True, default=None, db_column='descriptions')
    transfer_date = models.DateTimeField(null=True, default=None)
    
    # New fields
    number_units_building = models.IntegerField(null=True, default=None)
    availability_date = models.DateTimeField(null=True, default=None)
    commercial_residential = models.CharField(max_length=50, null=True, default=None)
    total_area = models.DecimalField(null=True, max_digits=10, decimal_places=2)
    show_hide_flag = models.BooleanField(null=True, default=None)
    show_address_on_web = models.BooleanField(null=True, default=None)
    is_public_available = models.BooleanField(null=True, default=None)
    number_of_toilet_rooms = models.IntegerField(null=True, default=None)
    total_num_of_rooms = models.IntegerField(null=True, default=None)
    hide_price_public = models.BooleanField(null=True, default=None)
    youtube_url = models.URLField(max_length=255, null=True, default=None)
    tour_virtual_url = models.URLField(max_length=255, null=True, default=None)
    market_status = JSONField(null=True, default=None, db_column='market_status')
    listing_status = JSONField(null=True, default=None, db_column='listing_status')
    floor_level = JSONField(null=True, default=None, db_column='floor_level')
    lat = models.FloatField(null=True, default=None)
    lng = models.FloatField(null=True, default=None)
    
    
                #   # new fields
                # "number_units_building": 1,
                # "availability_date": 1,
                # "commercial_residential": 1,
                # "total_area": 1,
                # "show_hide_flag": 1,
                # "show_address_on_web": 1,
                # "is_public_available": 1,
                # "number_of_toilet_rooms": 1,
                # "total_num_of_rooms": 1,
                # "hide_price_public": 1,
                # "youtube_url": 1,
                # "tour_virtual_url": 1,
                # "market_status": {
                #     "market_id": "$market_status.market_id",
                #     "market_name_en": "$market_status.market_name_en",
                #     "market_name_pt": "$market_status.market_name_pt"
                # },
                # "listing_status": {
                #     "listing_id": "$listing_status.listing_id",
                #     "listing_name_en": "$listing_status.listing_name_en",
                #     "listing_name_pt": "$listing_status.listing_name_pt"
                # },
                # "floor_level": {
                #     "floor_id": "$floor_level.floor_id",
                #     "floor_name_en": "$floor_level.floor_name_en",
                #     "floor_name_pt": "$floor_level.floor_name_pt"
                # },
    
    objects = models.DjongoManager()


    class Meta:
            db_table = 'v1_properties_nested'
            verbose_name = 'Property Nested'
            verbose_name_plural = 'Properties Nested'
            app_label = "v1"
            managed = False
            ordering = ['-property_id']
    
    def __str__(self) -> str:
        return f"{self.property_id} "
    
    def __repr__(self):
        return self.__str__()
    


class Neighborhood(models.Model):
    id = models.ObjectIdField(editable=False, primary_key=True, default=None, unique=True, db_column='_id')
    neighborhood_id = models.IntegerField(null=False, default=None, unique=True)
    neighborhood_name = models.CharField(max_length=100, null=True, default=None)
    city_id = models.IntegerField(null=False, default=None)
    city_name = models.CharField(max_length=100, null=True, default=None)
    state_id = models.IntegerField(null=False, default=None)
    country_id = models.IntegerField(null=False, default=None)
    country_abbreviation = models.CharField(max_length=10, null=True, default=None)
    country_name = models.CharField(max_length=100, null=True, default=None)
    state_abbreviation = models.CharField(max_length=10, null=True, default=None)
    state_name = models.CharField(max_length=100, null=True, default=None)
    
    objects = models.DjongoManager()

    class Meta:
            db_table = 'v1_neighborhoods'
            verbose_name = 'Neighborhood'
            verbose_name_plural = 'Neighborhoods'
            app_label = "v1"
            managed = False
    
    def __str__(self) -> str:
        return f"{self.neighborhood_name}, {self.city_name}, {self.state_name}, {self.country_name}"
    
    def __repr__(self):
        return self.__str__()
    
    def create(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().create(*args, **kwargs)

    def save(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().delete(*args, **kwargs)
        


class City(models.Model):
    id = models.ObjectIdField(editable=False, primary_key=True, default=None, unique=True, db_column='_id')
    city_id = models.IntegerField(null=False, default=None, unique=True)
    city_name = models.CharField(max_length=100, null=True, default=None)
    state_id = models.IntegerField(null=False, default=None)
    country_id = models.IntegerField(null=False, default=None)
    country_abbreviation = models.CharField(max_length=10, null=True, default=None)
    country_name = models.CharField(max_length=100, null=True, default=None)
    state_abbreviation = models.CharField(max_length=10, null=True, default=None)
    state_name = models.CharField(max_length=100, null=True, default=None)
    neighborhoods = models.JSONField(null=True,  db_column='neighborhoods', default=[])
    
    objects = models.DjongoManager()

    class Meta:
            db_table = 'v1_cities'
            verbose_name = 'City'
            verbose_name_plural = 'Cities'
            app_label = "v1"
            managed = False
    
    def __str__(self) -> str:
        return f"{self.city_name}, {self.state_name}, {self.country_name}"
    
    def __repr__(self):
        return self.__str__()
    
    def create(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().create(*args, **kwargs)

    def save(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().delete(*args, **kwargs)


class State(models.Model):
    """
    Model representing a state.
    Attributes:
        id (ObjectIdField): The unique identifier of the state.
        state_id (IntegerField): The unique identifier of the state.
        country_id (IntegerField): The unique identifier of the country.
        country_abbreviation (CharField): The abbreviation of the country.
        country_name (CharField): The name of the country.
        state_abbreviation (CharField): The abbreviation of the state.
        state_name (CharField): The name of the state.
        cities (JSONField): The list of cities in the state.
    """
    id = models.ObjectIdField(editable=False, primary_key=True, default=None, unique=True, db_column='_id')
    state_id = models.IntegerField(null=False, default=None, unique=True)
    country_id = models.IntegerField(null=False, default=None)
    country_abbreviation = models.CharField(max_length=10, null=True, default=None)
    country_name = models.CharField(max_length=100, null=True, default=None)
    state_abbreviation = models.CharField(max_length=10, null=True, default=None)
    state_name = models.CharField(max_length=100, null=True, default=None)
    cities = models.JSONField(null=True, db_column='cities', default=[])
    
    objects = models.DjongoManager()

    class Meta:
            db_table = 'v1_states'
            verbose_name = 'State'
            verbose_name_plural = 'States'
            app_label = "v1"
            managed = False
    
    def __str__(self) -> str:
        return f"{self.state_name}, {self.country_name}"
    
    def __repr__(self):
        return self.__str__()
    
    def create(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().create(*args, **kwargs)

    def save(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self._state.using = 'mongodb'
        super().delete(*args, **kwargs)
        


        

