from djongo import models

# MongoDB Collections
    
class Offices(models.Model):
    office_id = models.IntegerField(null=False, primary_key=True, default=None, unique=True)
    name = models.CharField(max_length=100, 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)
    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)
    state_abbreviation = models.CharField(max_length=10, 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)
    total_properties = models.IntegerField(null=False, default=0)

    def __str__(self) -> str:
        return f"{self.name} "
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        managed = False
        db_table = 'offices'
        verbose_name_plural = 'Offices'


class Agents(models.Model):
    agent_id = models.IntegerField(null=False, primary_key=True, default=None, unique=True)
    name = models.CharField(max_length=100, null=True, default=None)
    email = models.EmailField(max_length=100, null=True, default=None)
    profile_picture = models.CharField(max_length=255, null=True, default=None)
    total_properties = models.IntegerField(null=False, default=0)
    office = models.ForeignKey(Offices, on_delete=models.DO_NOTHING, default=None)

    def __str__(self) -> str:
        return f"{self.name} "
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        managed = False
        db_table = 'agents'
        verbose_name_plural = 'Agents'
        


class Location(models.Model):
    property_location_id = models.IntegerField(null=False, primary_key=True, 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)

    def __str__(self) -> str:
        return f"Neighborhood: {self.neighborhood}, City: {self.city}, State: {self.state}"
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        managed = False
        db_table = 'properties_location'
        verbose_name_plural = 'Locations'
        
class Features(models.Model):
    feature_id = models.IntegerField(null=False, primary_key=True, 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)

    


    def __str__(self) -> str:
        return f"{self.feature_name_en}, {self.feature_name_pt} "
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        managed = False
        db_table = 'features'
        verbose_name_plural = 'Features'
        


class Usages(models.Model):
    usage_id = models.IntegerField(null=False, primary_key=True, 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)

    


    def __str__(self) -> str:
        return f"{self.usage_name_en}, {self.usage_name_pt} "
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        managed = False
        db_table = 'usages'
        verbose_name_plural = 'Usages'

class Types(models.Model):
    type_id = models.IntegerField(null=False, primary_key=True, default=None, 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')

    def __str__(self) -> str:
        return f"{self.type_name_en}, {self.type_name_pt} "
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        managed = False
        db_table = 'types'
        verbose_name_plural = 'Types'
        
        

class Properties(models.Model):
    property_id = models.IntegerField(null=False, primary_key=True, 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)



    def __str__(self) -> str:
        return f"{self.title} "
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        managed = False
        db_table = 'properties'
        verbose_name_plural = 'Properties'


class PropertiesFeatures(models.Model):
    property_feature_id = models.IntegerField(null=False, primary_key=True, 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')

    
    

    def __str__(self) -> str:
        return f"{self.property_feature_id} "
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        managed = False
        db_table = 'properties_feature'
        verbose_name_plural = 'Properties Features'


class PropertiesMedia(models.Model):
    property_media_id = models.IntegerField(null=False, primary_key=True, 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')
    


    def __str__(self) -> str:
        return f"{self.url} "
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        managed = False
        db_table = 'properties_media'
        verbose_name_plural = 'Medias'
