from django.db import models
from decimal import Decimal

class NetworkMonitoringAbstractUpdateStatus(models.Model):
    url = models.URLField(max_length=2000, unique=True)  
    class Meta:
        abstract = True  





AREA_UNIT_CHOICES = [
    ("m2",   "m²"),
    ("ha",   "hektar"),
    ("ar",   "ar"),
    ("ft2",  "ft²"),
    ("sqft", "sq ft"),
]




class NetworkMonitoringAbstractModel(models.Model):
    url = models.URLField(unique=True)

    # Główne
    estate_type = models.CharField(max_length=255, blank=True, null=True)
    offer_type  = models.CharField(max_length=20,  blank=True, null=True)

    price        = models.DecimalField(max_digits=14, decimal_places=2, blank=True, null=True, db_index=True)
    currency     = models.CharField(max_length=10,  blank=True, null=True)
    price_per_m2 = models.DecimalField(max_digits=12, decimal_places=2, blank=True, null=True)
    # Uwaga: jeśli w danych bywa tekst typu "Information from developer",
    # to zostaw dodatkowe pole na surowy tekst:
    rent         = models.DecimalField(max_digits=12, decimal_places=2, blank=True, null=True)

    title       = models.CharField(max_length=500,    blank=True, null=True)
    description = models.TextField(max_length=20000,  blank=True, null=True)
    address     = models.CharField(max_length=500,    blank=True, null=True)

    square_footage   = models.DecimalField(max_digits=8, decimal_places=2, blank=True, null=True, db_index=True)  
    area_unit  = models.CharField(max_length=8, choices=AREA_UNIT_CHOICES, blank=True, null=True, default="m2")
    # Znormalizowana powierzchnia w m² (łatwe filtry/sortowanie)
    area_m2    = models.DecimalField(max_digits=12, decimal_places=2, blank=True, null=True, db_index=True)

    rooms            = models.PositiveSmallIntegerField(blank=True, null=True)        # zwykle całkowite
    bathrooms  = models.PositiveSmallIntegerField(blank=True, null=True)

    floor      = models.SmallIntegerField(blank=True, null=True)       # może być -1 (piwnica) itd.
    floors_num = models.SmallIntegerField(blank=True, null=True)

    estate_condition   = models.CharField(max_length=255, blank=True, null=True)
    heating_type       = models.CharField(max_length=200, blank=True, null=True)
    land_area          = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)  # m² / ar
    building_type      = models.CharField(max_length=200, blank=True, null=True)
    energy_certificate = models.CharField(max_length=200, blank=True, null=True)

    market_type = models.CharField(max_length=200, blank=True, null=True)
    build_year = models.CharField(max_length=200, null=True, blank=True)    
    # build_year  = models.PositiveSmallIntegerField(blank=True, null=True, db_index=True)

    media = models.CharField(max_length=500, blank=True, null=True)

    # Bool
    elevator         = models.BooleanField(blank=True, null=True)
    electricity      = models.BooleanField(blank=True, null=True)
    water            = models.BooleanField(blank=True, null=True)
    gas              = models.BooleanField(blank=True, null=True)
    phone            = models.BooleanField(blank=True, null=True)
    internet         = models.BooleanField(blank=True, null=True)
    intercom         = models.BooleanField(blank=True, null=True)
    sewerage         = models.BooleanField(blank=True, null=True)
    equipment        = models.BooleanField(blank=True, null=True)
    garden           = models.BooleanField(blank=True, null=True)
    garage           = models.BooleanField(blank=True, null=True)
    basement         = models.BooleanField(blank=True, null=True)
    attic            = models.BooleanField(blank=True, null=True)
    terrace          = models.BooleanField(blank=True, null=True)
    seprete_kitchen  = models.BooleanField(blank=True, null=True)
    furnished        = models.BooleanField(blank=True, null=True)
    sauna            = models.BooleanField(default=False, blank=True)
    air_conditioning = models.BooleanField(default=False, blank=True)
    jacuzzi          = models.BooleanField(default=False, blank=True)

    balcony       = models.CharField(max_length=255, blank=True, null=True)
    parking_space = models.CharField(max_length=200, blank=True, null=True)

    # Dane oferty
    site_id                   = models.CharField(max_length=250, blank=True, null=True)
    land_and_mortgage_register= models.CharField(max_length=255, blank=True, null=True)
    created_at                = models.DateTimeField(auto_now_add=True, blank=True, null=True)
    ownership_form            = models.CharField(max_length=200, blank=True, null=True)
    available_from            = models.DateField(blank=True, null=True)  # jeżeli to realna data

    # Informacje dodatkowe (głównie tekst; kilka pól liczbowych poniżej)
    windows            = models.CharField(max_length=200, blank=True, null=True)
    attic_type         = models.CharField(max_length=200, blank=True, null=True)
    building_material  = models.CharField(max_length=200, blank=True, null=True)
    security           = models.CharField(max_length=500, blank=True, null=True)
    fencing            = models.CharField(max_length=200, blank=True, null=True)
    access_road        = models.CharField(max_length=200, blank=True, null=True)
    location           = models.CharField(max_length=200, blank=True, null=True)
    plot_type          = models.CharField(max_length=200, blank=True, null=True)
    dimensions         = models.CharField(max_length=200, blank=True, null=True)
    premises_location  = models.CharField(max_length=200, blank=True, null=True)
    purpose            = models.CharField(max_length=200, blank=True, null=True)
    location_info      = models.CharField(max_length=200, blank=True, null=True)
    roof               = models.CharField(max_length=200, blank=True, null=True)
    recreational_house = models.CharField(max_length=200, blank=True, null=True)
    roof_covering      = models.CharField(max_length=200, blank=True, null=True)
    construction       = models.CharField(max_length=200, blank=True, null=True)

    height       = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)  # np. 2.70 m
    office_rooms = models.PositiveSmallIntegerField(blank=True, null=True)

    social_facilities = models.CharField(max_length=200, blank=True, null=True)
    parking           = models.CharField(max_length=200, blank=True, null=True)
    ramp              = models.CharField(max_length=200, blank=True, null=True)
    floor_material    = models.CharField(max_length=200, blank=True, null=True)
    lighting          = models.CharField(max_length=200, blank=True, null=True)

    # Adres
    country        = models.CharField(max_length=50,  blank=True, null=True)
    state          = models.CharField(max_length=100, blank=True, null=True)
    province       = models.CharField(max_length=100, blank=True, null=True)
    commune        = models.CharField(max_length=100, blank=True, null=True)
    city           = models.CharField(max_length=100, blank=True, null=True, db_index=True)
    district       = models.CharField(max_length=100, blank=True, null=True)
    street         = models.CharField(max_length=100, blank=True, null=True)
    housing_estate = models.CharField(max_length=100, blank=True, null=True)
    zipcode        = models.CharField(max_length=20,  blank=True, null=True)
    neighborhood   = models.CharField(max_length=200, blank=True, null=True)

    lon = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True, db_index=True)
    lat = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True, db_index=True)

    # Obrazy
    original_image_urls = models.JSONField(blank=True, null=True)
    images = models.JSONField(blank=True, null=True)

    # Ogłoszeniodawca
    advertiser_name  = models.CharField(max_length=255, blank=True, null=True)
    advertiser_type  = models.CharField(max_length=200, blank=True, null=True)
    remote_service   = models.CharField(max_length=255, blank=True, null=True)
    advertiser_phone = models.CharField(max_length=50,  blank=True, null=True)

    # Liczniki / status
    processed_without_image = models.BooleanField(default=False)
    incomplete_data         = models.BooleanField(default=False)
    has_data                = models.BooleanField(default=False)
    
    check_active            = models.BooleanField(default=False)
    check_active_from_image = models.BooleanField(default=False)
    check_active_date       = models.DateField(blank=True, null=True)
    
    is_active               = models.BooleanField(default=True)
    inactive_date           = models.DateTimeField(blank=True, null=True)
    
    isSendToMainServer      = models.BooleanField(default=False)
    isArchived              = models.BooleanField(default=False)
    archived_date           = models.DateField(blank=True, null=True)
    listing_date            = models.DateField(blank=True, null=True)
    # Comma-separated list of field names that were filled from description scraper
    description_scraped_variables = models.CharField(max_length=500, blank=True, null=True)
    
    
    class Meta:
        abstract = True
        

    def _unit_factor_to_m2(self) -> Decimal:
        if not self.area_unit:
            return Decimal("1")
        mapping = {
            "m2": Decimal("1"),
            "ha": Decimal("10000"),
            "ar": Decimal("100"),
            "ft2": Decimal("0.092903"),
            "sqft": Decimal("0.092903"),
        }
        return mapping.get(self.area_unit, Decimal("1"))

    def save(self, *args, **kwargs):
        if self.square_footage is not None:
            sf = self.square_footage if isinstance(self.square_footage, Decimal) else Decimal(str(self.square_footage))
            self.area_m2 = (sf * self._unit_factor_to_m2()).quantize(Decimal("0.01"))
        super().save(*args, **kwargs)
            

    def __str__(self):
        return self.title or getattr(self, "name", None) or f"Ad {self.pk}"

















# class NetworkMonitoringAbstractModel(models.Model):
#     url = models.URLField(max_length=2000, unique=True)    
        
#     estate_type = models.CharField(max_length=255, blank=True, null=True)
#     offer_type = models.CharField(max_length=20, null=True, blank=True)
#     # Informacje główne
#     price = models.CharField(max_length=200, null=True, blank=True)
#     currency = models.CharField(max_length=200, blank=True, null=True)
#     price_per_m2 = models.CharField(max_length=200, null=True, blank=True)
#     rent = models.CharField(max_length=255, blank=True, null=True)
    
#     title = models.CharField(max_length=500, null=True, blank=True)
#     description = models.TextField(max_length=20000, null=True, blank=True)
#     address = models.CharField(max_length=500, null=True, blank=True)
    
#     square_footage = models.CharField(max_length=200, null=True, blank=True)
#     rooms = models.CharField(max_length=200, null=True, blank=True)
#     bathrooms = models.CharField(max_length=200, null=True, blank=True)
    
#     floor = models.CharField(max_length=200, null=True, blank=True)
#     floors_num = models.CharField(max_length=200, null=True, blank=True)      
    
#     estate_condition = models.CharField(max_length=255, null=True, blank=True)
#     heating_type = models.CharField(max_length=200, null=True, blank=True)
#     # Dla domów
#     land_area = models.CharField(max_length=200, null=True, blank=True)
#     building_type = models.CharField(max_length=200, null=True, blank=True)  
#     energy_certificate = models.CharField(max_length=200, null=True, blank=True)
#     # tabela Informacje dodatkowe
#     market_type = models.CharField(max_length=200, null=True, blank=True)
#     build_year = models.CharField(max_length=200, null=True, blank=True)    

    
#     media = models.CharField(max_length=500, null=True, blank=True)
    
# # class BoolFields(models.Model):
#     elevator = models.BooleanField(null=True, blank=True)
#     electricity = models.BooleanField(null=True, blank=True)
#     water = models.BooleanField(null=True, blank=True)
#     gas = models.BooleanField(null=True, blank=True)
#     phone = models.BooleanField(null=True, blank=True)
#     internet = models.BooleanField(null=True, blank=True)
#     sewerage = models.BooleanField(null=True, blank=True)
#     equipment = models.BooleanField(null=True, blank=True)
#     garden = models.BooleanField(null=True, blank=True)
#     garage = models.BooleanField(null=True, blank=True)
#     basement = models.BooleanField(null=True, blank=True)
#     attic = models.BooleanField(null=True, blank=True)
#     terrace = models.BooleanField(null=True, blank=True)
#     seprete_kitchen = models.BooleanField(null=True, blank=True)
#     furnished = models.BooleanField(null=True, blank=True)
    
#     balcony = models.CharField(max_length=255, null=True, blank=True)
#     parking_space = models.CharField(max_length=200, null=True, blank=True)
    
    
    
# # class OfferData(models.Model):
#     site_id = models.CharField(max_length=250, blank=True)  
#     # inne
#     land_and_mortgage_register = models.CharField(max_length=255, blank=True, null=True)
#     created_at = models.DateTimeField(auto_now_add=True, blank=True, null=True)
#     ownership_form = models.CharField(max_length=200, null=True, blank=True)
#     available_from = models.CharField(max_length=200, null=True, blank=True)
       

# # class AddtionalInfo(models.Model):
#     windows = models.CharField(max_length=200, null=True, blank=True)    
#     attic_type = models.CharField(max_length=200, null=True, blank=True)  # Poddasze
#     building_material = models.CharField(max_length=200, null=True, blank=True)   
#     security = models.CharField(max_length=500, null=True, blank=True)
#     # Dla działek
#     fencing = models.CharField(max_length=200, null=True, blank=True)
#     access_road = models.CharField(max_length=200, null=True, blank=True)
#     location = models.CharField(null=True, blank=True)
#     plot_type = models.CharField(max_length=200, null=True, blank=True)
#     dimensions = models.CharField(max_length=200, null=True, blank=True)
#     # Dla lokali użytkowych
#     premises_location = models.CharField(max_length=200, null=True, blank=True)
#     purpose = models.CharField(max_length=200, null=True, blank=True)
#     # Dla domów
#     location_info = models.CharField(max_length=200, null=True, blank=True)  # Położenie
#     roof = models.CharField(max_length=200, null=True, blank=True)
#     recreational_house = models.CharField(max_length=200, null=True, blank=True)
#     roof_covering = models.CharField(max_length=200, null=True, blank=True)
#     # Dla hal i magazynów
#     construction = models.CharField(max_length=200, null=True, blank=True)
#     height = models.CharField(max_length=200, null=True, blank=True)
#     office_rooms = models.CharField(max_length=200, null=True, blank=True)
#     social_facilities = models.CharField(max_length=200, null=True, blank=True)
#     parking = models.CharField(max_length=200, null=True, blank=True)
#     ramp = models.CharField(max_length=200, null=True, blank=True)
#     floor_material = models.CharField(max_length=200, null=True, blank=True)  # Posadzka
#     # Dla garaży
#     lighting = models.CharField(max_length=200, null=True, blank=True)
    
    
# # class OfferDetailAdrress(models.Model):
#     country = models.CharField(max_length=50, null=True, blank=True)            #kraj 
#     state = models.CharField(max_length=100, null=True, blank=True)             #województwo
#     province = models.CharField(max_length=100, null=True, blank=True)          #powiat
#     commune = models.CharField(max_length=100, null=True, blank=True)           #gmina
    
#     city = models.CharField(max_length=100, null=True, blank=True)              #miasto
#     district = models.CharField(max_length=100, null=True, blank=True)          #dzielnica
#     street = models.CharField(max_length=100, null=True, blank=True)            #ulica
    
#     housing_estate = models.CharField(max_length=100, null=True, blank=True)    #osiedle
#     zipcode = models.CharField(max_length=255, blank=True, null=True)           #kod pocztowy 
    
#     neighborhood = models.CharField(max_length=200, null=True, blank=True)      # Okolica
    
#     lon = models.CharField(null=True, blank=True)
#     lat = models.CharField(null=True, blank=True)
    
    
    
# # class OfferImages(models.Model):
#     original_image_urls = models.JSONField(null=True, blank=True)

# # class Offerer(models.Model):
#     # Advertiser info
#     advertiser_name = models.CharField(max_length=255, null=True, blank=True)
#     advertiser_type = models.CharField(max_length=200, null=True, blank=True)
#     remote_service = models.CharField(max_length=255, null=True, blank=True)
    
# # class OffererPhone(models.Model):
#     advertiser_phone = models.CharField(max_length=200, null=True, blank=True)
    
# # class ListingCounter(models.Model):  
#     view_count = models.CharField(max_length=255, blank=True, null=True)   
    
# # class SpaceDataManagment(models.Model):
#     isActive = models.BooleanField(default=True)
#     inactive_date = models.DateTimeField(null=True, blank=True)
#     isSendToMainServer = models.BooleanField(default=False)
#     isArchived = models.BooleanField(default=False)
#     listing_date = models.DateField(null=True, blank=True)
    
#     view_count = models.CharField(max_length=255, blank=True, null=True)    
#     isMerged = models.BooleanField(default=False)  # Domyślnie False
#     DOWNLOAD_CHOICES = [
#         ("pc", "PC"),
#         ("hously.space", "Hously Server"),
#         ('server', 'Serwvr')
#     ]

#     DownloadManagment = models.CharField(
#         max_length=50,
#         choices=DOWNLOAD_CHOICES,
#         blank=True,
#         null=True
#     )
#     worker_number = models.PositiveIntegerField(null=True, blank=True)

    
    
    
#     class Meta:
#         abstract = True

    
#     def save(self, *args, **kwargs):
#         super().save(*args, **kwargs)
    
#     def __str__(self):
#         return str(getattr(self, "title", None) or getattr(self, "name", None) or f"Ad {self.pk}")
    
    