from django.db import models
from django.urls import reverse
from django.utils.text import slugify
from ckeditor_uploader.fields import RichTextUploadingField


class PropertyCategory(models.Model):
    name = models.CharField(max_length=80, unique=True)
    slug = models.SlugField(max_length=100, unique=True, blank=True)
    icon = models.CharField(max_length=50, blank=True, help_text='Bootstrap icon name e.g. "house-door"')
    order = models.PositiveIntegerField(default=0)

    class Meta:
        ordering = ['order', 'name']
        verbose_name_plural = 'Property categories'

    def __str__(self):
        return self.name

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


class Location(models.Model):
    name = models.CharField(max_length=120)
    state = models.CharField(max_length=80, default='FCT')
    slug = models.SlugField(max_length=140, unique=True, blank=True)
    is_featured = models.BooleanField(default=False)
    image = models.ImageField(upload_to='locations/', blank=True, null=True)

    class Meta:
        ordering = ['state', 'name']

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

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(f"{self.name}-{self.state}")
        super().save(*args, **kwargs)


class Property(models.Model):
    LISTING_TYPES = [
        ('sale', 'For Sale'),
    ]

    STATUS_CHOICES = [
        ('available', 'Available'),
        ('pending', 'Pending'),
        ('sold', 'Sold'),
        ('rented', 'Rented'),
        ('off_market', 'Off Market'),
    ]

    title = models.CharField(max_length=255)
    slug = models.SlugField(max_length=280, unique=True, blank=True)
    category = models.ForeignKey(PropertyCategory, on_delete=models.PROTECT, related_name='properties')
    listing_type = models.CharField(max_length=20, choices=LISTING_TYPES, default='sale')
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='available')

    # Location
    location = models.ForeignKey(Location, on_delete=models.PROTECT, related_name='properties')
    address = models.CharField(max_length=255, blank=True)
    latitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True)
    longitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True)

    # Pricing (in NGN)
    price = models.DecimalField(max_digits=14, decimal_places=2)
    price_period = models.CharField(max_length=30, blank=True, help_text='e.g. "per year" or leave blank')
    is_negotiable = models.BooleanField(default=False)

    # Specs
    bedrooms = models.PositiveSmallIntegerField(default=0)
    bathrooms = models.PositiveSmallIntegerField(default=0)
    toilets = models.PositiveSmallIntegerField(default=0)
    parking_spaces = models.PositiveSmallIntegerField(default=0)
    area_sqm = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True, help_text='Square meters')
    plot_size = models.CharField(max_length=80, blank=True, help_text='For lands, e.g. "600 sqm" or "1 plot"')
    year_built = models.PositiveIntegerField(blank=True, null=True)

    # Content
    short_description = models.CharField(max_length=300, blank=True)
    description = RichTextUploadingField()
    features = models.TextField(blank=True, help_text='One feature per line — auto-rendered as bullets')

    # Documents / titles
    title_documents = models.CharField(max_length=200, blank=True, help_text='e.g. "C of O", "Governor\'s Consent"')

    # Media
    main_image = models.ImageField(upload_to='properties/main/')
    video_url = models.URLField(blank=True, help_text='YouTube/Vimeo URL for property tour')
    floor_plan = models.ImageField(upload_to='properties/plans/', blank=True, null=True)

    # Flags
    is_featured = models.BooleanField(default=False)
    is_verified = models.BooleanField(default=False)
    is_published = models.BooleanField(default=True)
    is_flyer_image = models.BooleanField(
        default=False,
        help_text='Tick if the main image is a marketing flyer (landscape). '
                  'Displays full-width hero instead of the standard gallery layout.'
    )

    # SEO
    meta_title = models.CharField(max_length=200, blank=True)
    meta_description = models.CharField(max_length=300, blank=True)

    # Stats
    views_count = models.PositiveIntegerField(default=0)
    inquiries_count = models.PositiveIntegerField(default=0)

    # Audit
    created_by = models.ForeignKey('auth.User', on_delete=models.SET_NULL, null=True, blank=True, related_name='properties_created')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['-created_at']
        verbose_name_plural = 'Properties'
        indexes = [
            models.Index(fields=['is_published', '-created_at']),
            models.Index(fields=['listing_type', 'status']),
        ]

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        if not self.slug:
            base = slugify(self.title)[:240]
            slug = base
            i = 1
            while Property.objects.filter(slug=slug).exclude(pk=self.pk).exists():
                slug = f"{base}-{i}"
                i += 1
            self.slug = slug
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('properties:detail', kwargs={'slug': self.slug})

    @property
    def feature_list(self):
        return [f.strip() for f in self.features.splitlines() if f.strip()]

    @property
    def price_display(self):
        # Format NGN with commas
        amount = f"₦{self.price:,.0f}"
        if self.price_period:
            amount += f" {self.price_period}"
        if self.is_negotiable:
            amount += " (Negotiable)"
        return amount


class PropertyImage(models.Model):
    property = models.ForeignKey(Property, on_delete=models.CASCADE, related_name='images')
    image = models.ImageField(upload_to='properties/gallery/')
    caption = models.CharField(max_length=200, blank=True)
    order = models.PositiveIntegerField(default=0)

    class Meta:
        ordering = ['order', 'id']

    def __str__(self):
        return f"Image for {self.property.title}"


class PropertyAmenity(models.Model):
    name = models.CharField(max_length=80, unique=True)
    icon = models.CharField(max_length=50, blank=True)

    class Meta:
        ordering = ['name']
        verbose_name_plural = 'Property amenities'

    def __str__(self):
        return self.name


class PropertyAmenityLink(models.Model):
    property = models.ForeignKey(Property, on_delete=models.CASCADE, related_name='amenities')
    amenity = models.ForeignKey(PropertyAmenity, on_delete=models.CASCADE)

    class Meta:
        unique_together = ('property', 'amenity')
