from django.db import models


class Category(models.Model):
    name = models.CharField(max_length=80, unique=True)
    slug = models.SlugField(unique=True)
    description = models.TextField(blank=True)
    icon = models.CharField(max_length=16, blank=True)
    image_url = models.URLField(blank=True)
    image = models.ImageField(upload_to='homepage/categories/', blank=True)
    link_url = models.CharField(max_length=255, blank=True)
    active = models.BooleanField(default=True)
    sort_order = models.PositiveIntegerField(default=0)

    class Meta:
        ordering = ['name']
        verbose_name_plural = 'categories'

    def __str__(self):
        return self.name


class Deal(models.Model):
    category = models.ForeignKey(Category, related_name='deals', on_delete=models.CASCADE)
    title = models.CharField(max_length=160)
    slug = models.SlugField(unique=True)
    clinic = models.CharField(max_length=160)
    city = models.CharField(max_length=100)
    description = models.TextField(blank=True)
    image_url = models.URLField()
    image = models.ImageField(upload_to='homepage/deals/', blank=True)
    link_url = models.CharField(max_length=255, blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    original_price = models.DecimalField(max_digits=10, decimal_places=2)
    rating = models.DecimalField(max_digits=2, decimal_places=1, default=4.5)
    review_count = models.PositiveIntegerField(default=0)
    featured = models.BooleanField(default=False)
    active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-featured', '-created_at']

    @property
    def discount_percent(self):
        if not self.original_price:
            return 0
        return round((1 - self.price / self.original_price) * 100)

    def __str__(self):
        return self.title


class Booking(models.Model):
    deal = models.ForeignKey(Deal, related_name='bookings', on_delete=models.PROTECT)
    name = models.CharField(max_length=120)
    email = models.EmailField()
    phone = models.CharField(max_length=30)
    preferred_date = models.DateField()
    notes = models.TextField(blank=True)
    status = models.CharField(max_length=20, default='pending', choices=[('pending', 'Pending'), ('confirmed', 'Confirmed'), ('cancelled', 'Cancelled')])
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_at']

    def __str__(self):
        return f'{self.name} – {self.deal.title}'


class SupportRequest(models.Model):
    name = models.CharField(max_length=120)
    email = models.EmailField()
    message = models.TextField()
    resolved = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_at']


class SiteSettings(models.Model):
    site_name = models.CharField(max_length=100, default='ASNDeals')
    tagline = models.CharField(max_length=180, default='Better care, fairer prices')
    hero_badge = models.CharField(max_length=180, default="India's trusted wellness marketplace")
    hero_title = models.CharField(max_length=180, default='Feel better. Look brighter. Pay less.')
    hero_description = models.TextField(default='Verified dental, beauty, skin care and Ayurveda offers from trusted clinics across Kerala.')
    support_email = models.EmailField(default='support@asndeals.com')
    support_phone = models.CharField(max_length=30, blank=True)
    footer_text = models.CharField(max_length=255, default='Better care, fairer prices.')
    logo = models.ImageField(upload_to='homepage/', blank=True)
    logo_url = models.CharField(max_length=500, blank=True, default='assets/img/asndeals_logo.png')
    location_text = models.CharField(max_length=100, default='Kerala, India')
    featured_heading = models.CharField(max_length=180, default='Featured Deals')
    offer_heading = models.CharField(max_length=180, default='Special Offer!')
    offer_text = models.CharField(max_length=255, default='Extra 10% OFF on your first booking')
    offer_code = models.CharField(max_length=80, default='ASNNEW10')
    offer_button_label = models.CharField(max_length=80, default='Book Now & Save')
    offer_button_url = models.CharField(max_length=255, default='client_register.html')
    offer_image = models.ImageField(upload_to='homepage/', blank=True)
    footer_description = models.TextField(default='Trusted health and wellness deals from verified clinics across Kerala.')

    class Meta:
        verbose_name_plural = 'site settings'

    def __str__(self):
        return self.site_name


class TrustBenefit(models.Model):
    icon = models.CharField(max_length=30, blank=True)
    title = models.CharField(max_length=120)
    description = models.CharField(max_length=255, blank=True)
    image = models.ImageField(upload_to='homepage/benefits/', blank=True)
    image_url = models.CharField(max_length=500, blank=True)
    sort_order = models.PositiveIntegerField(default=0)
    active = models.BooleanField(default=True)

    class Meta:
        ordering = ('sort_order', 'id')

    def __str__(self):
        return self.title


class WebsiteImage(models.Model):
    page_path = models.CharField(max_length=255, blank=True, help_text='HTML filename, for example asnjewels.html. Leave blank to replace the image site-wide.')
    label = models.CharField(max_length=160, blank=True)
    original_path = models.CharField(max_length=700, help_text='Current image path or URL used by the website.')
    replacement_image = models.ImageField(upload_to='cms/site-images/', blank=True)
    replacement_url = models.CharField(max_length=700, blank=True, help_text='Optional external image URL used when no image is uploaded.')
    active = models.BooleanField(default=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('page_path', 'label', 'original_path')
        constraints = [models.UniqueConstraint(fields=('page_path', 'original_path'), name='unique_cms_image_per_page')]
        verbose_name = 'website image'
        verbose_name_plural = 'website images'

    def __str__(self):
        return f'{self.page_path or "All pages"}: {self.label or self.original_path}'


class AyurvedaVendorListing(models.Model):
    CATEGORY_CHOICES = (('ayurveda', 'Ayurveda'), ('dental', 'Dental'), ('beauty', 'Beauty'), ('skincare', 'Skin Care'))
    TYPE_CHOICES = (('product', 'Product'), ('service', 'Service'))
    STATUS_CHOICES = (('pending', 'Pending review'), ('approved', 'Approved'), ('rejected', 'Rejected'))
    company_name = models.CharField(max_length=180)
    category = models.CharField(max_length=20, choices=CATEGORY_CHOICES, default='ayurveda')
    contact_name = models.CharField(max_length=120)
    email = models.EmailField()
    phone = models.CharField(max_length=30)
    city = models.CharField(max_length=100)
    listing_type = models.CharField(max_length=20, choices=TYPE_CHOICES, default='product')
    title = models.CharField(max_length=180)
    description = models.TextField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    original_price = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    image = models.ImageField(upload_to='ayurveda-vendors/', blank=True)
    image_url = models.CharField(max_length=500, blank=True)
    quality_rating = models.DecimalField(max_digits=2, decimal_places=1, default=0, help_text='Administrator quality score from 0 to 5.')
    review_count = models.PositiveIntegerField(default=0)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
    sponsored = models.BooleanField(default=False, help_text='Sponsored listings appear in the first row.')
    sponsorship_amount = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    sponsored_until = models.DateField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ('-sponsored', '-quality_rating', 'price', '-created_at')
        verbose_name = 'vendor marketplace listing'
        verbose_name_plural = 'vendor marketplace listings'

    @property
    def is_sponsored(self):
        from django.utils import timezone
        return self.sponsored and (not self.sponsored_until or self.sponsored_until >= timezone.localdate())

    def __str__(self):
        return f'{self.company_name} — {self.title}'


class Page(models.Model):
    title = models.CharField(max_length=180)
    slug = models.SlugField(unique=True)
    summary = models.TextField(blank=True)
    body = models.TextField(blank=True, help_text='HTML is supported for trusted administrator content.')
    featured_image = models.URLField(blank=True)
    meta_title = models.CharField(max_length=180, blank=True)
    meta_description = models.CharField(max_length=320, blank=True)
    published = models.BooleanField(default=True)
    sort_order = models.PositiveIntegerField(default=0)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['sort_order', 'title']

    def __str__(self):
        return self.title


class PageSection(models.Model):
    page = models.ForeignKey(Page, related_name='sections', on_delete=models.CASCADE)
    heading = models.CharField(max_length=180)
    subheading = models.CharField(max_length=220, blank=True)
    body = models.TextField(blank=True)
    image_url = models.URLField(blank=True)
    button_label = models.CharField(max_length=80, blank=True)
    button_url = models.CharField(max_length=255, blank=True)
    sort_order = models.PositiveIntegerField(default=0)
    active = models.BooleanField(default=True)

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

    def __str__(self):
        return f'{self.page.title}: {self.heading}'


class NavigationItem(models.Model):
    label = models.CharField(max_length=80)
    url = models.CharField(max_length=255)
    sort_order = models.PositiveIntegerField(default=0)
    active = models.BooleanField(default=True)
    open_in_new_tab = models.BooleanField(default=False)

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

    def __str__(self):
        return self.label

# Create your models here.
