from django.db import models
from django.utils.text import slugify
from django_ckeditor_5.fields import CKEditor5Field


class Project(models.Model):
    STATUS_CHOICES = [
        ('upcoming',  'Upcoming'),
        ('ongoing',   'Ongoing'),
        ('completed', 'Completed'),
    ]

    title       = models.CharField(max_length=200)
    slug        = models.SlugField(max_length=220, unique=True, blank=True)
    location    = models.CharField(max_length=200, help_text='e.g. Katampe Extension, Abuja')
    status      = models.CharField(max_length=20, choices=STATUS_CHOICES, default='ongoing')

    # Rich text description
    description = CKEditor5Field('Description', config_name='default', blank=True)

    # Key specs (optional)
    bedrooms_min   = models.PositiveIntegerField(blank=True, null=True, help_text='Minimum bedrooms')
    bedrooms_max   = models.PositiveIntegerField(blank=True, null=True, help_text='Maximum bedrooms')
    price_from     = models.DecimalField(max_digits=14, decimal_places=2, blank=True, null=True)
    price_to       = models.DecimalField(max_digits=14, decimal_places=2, blank=True, null=True)
    delivery_date  = models.CharField(max_length=100, blank=True, help_text='e.g. Q4 2025')
    total_units    = models.PositiveIntegerField(blank=True, null=True)

    # Media
    cover_image = models.ImageField(upload_to='projects/covers/', blank=True, null=True)
    video_url   = models.URLField(blank=True, help_text='YouTube / Vimeo embed URL')
    brochure    = models.FileField(
        upload_to='projects/brochures/', blank=True, null=True,
        help_text='Upload PDF brochure for download'
    )

    # SEO
    meta_title       = models.CharField(max_length=160, blank=True)
    meta_description = models.CharField(max_length=300, blank=True)

    # Admin control
    is_published = models.BooleanField(default=True)
    is_featured  = models.BooleanField(default=False, help_text='Show on homepage / featured section')
    order        = models.PositiveIntegerField(default=0, help_text='Lower = first')

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['order', '-created_at']
        verbose_name = 'Project'
        verbose_name_plural = 'Projects'

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        from django.urls import reverse
        return reverse('projects:detail', kwargs={'slug': self.slug})

    @property
    def bedrooms_display(self):
        if self.bedrooms_min and self.bedrooms_max:
            if self.bedrooms_min == self.bedrooms_max:
                return f'{self.bedrooms_min} Bedroom{"s" if self.bedrooms_min > 1 else ""}'
            return f'{self.bedrooms_min}–{self.bedrooms_max} Bedrooms'
        if self.bedrooms_min:
            return f'{self.bedrooms_min}+ Bedrooms'
        return ''

    @property
    def price_display(self):
        def fmt(v):
            if v >= 1_000_000_000:
                return f'₦{v/1_000_000_000:.1f}B'
            if v >= 1_000_000:
                return f'₦{v/1_000_000:.1f}M'
            return f'₦{v:,.0f}'
        if self.price_from and self.price_to:
            return f'{fmt(self.price_from)} – {fmt(self.price_to)}'
        if self.price_from:
            return f'From {fmt(self.price_from)}'
        return ''


class ProjectImage(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='images')
    image   = models.ImageField(upload_to='projects/gallery/')
    caption = models.CharField(max_length=200, blank=True)
    order   = models.PositiveIntegerField(default=0)

    class Meta:
        ordering = ['order']

    def __str__(self):
        return f'{self.project.title} — image {self.order}'


class ProjectFeature(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='features')
    icon    = models.CharField(max_length=60, blank=True, help_text='FontAwesome class e.g. fa-swimming-pool')
    label   = models.CharField(max_length=100)
    order   = models.PositiveIntegerField(default=0)

    class Meta:
        ordering = ['order']

    def __str__(self):
        return f'{self.project.title}: {self.label}'
