from django.db import models
from django.utils.text import slugify
from django.conf import settings
from ckeditor.fields import RichTextField
from ckeditor_uploader.fields import RichTextUploadingField

class Destination(models.Model):
    name = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True, blank=True)
    image = models.ImageField(upload_to='travel_images/destinations/')
    description = models.TextField(blank=True)
    
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        super().save(*args, **kwargs)

    def __str__(self):
        return self.name

class Trip(models.Model):
    CATEGORY_CHOICES = [
        ('international', 'International Adventure'),
        ('domestic', 'Domestic Getaway'),
        ('recommended', 'Recommended Trip'),
    ]

    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=250, unique=True, blank=True)
    destination = models.ForeignKey(Destination, on_delete=models.CASCADE, related_name='trips')
    category = models.CharField(max_length=20, choices=CATEGORY_CHOICES, default='international')
    
    # 💰 Pricing & Duration
    price_inr = models.DecimalField(max_digits=10, decimal_places=2, help_text="Starting Price in INR")
    discount_percentage = models.PositiveIntegerField(null=True, blank=True, help_text="Discount in % (e.g., 10 for 10% off)")
    duration_days = models.PositiveIntegerField(help_text="Number of Days")
    duration_nights = models.PositiveIntegerField(help_text="Number of Nights")
    
    # 🖼️ Visuals
    main_image = models.ImageField(upload_to='travel_images/trips/')
    
    # 📝 Details
    itinerary_brief = RichTextUploadingField(help_text="Short day-by-day plan")
    inclusions = models.TextField(help_text="Comma separated (e.g., Flights, Hotels, Visa)")
    exclusions = models.TextField(help_text="Comma separated (e.g., Personal Expense, Tips)")
    
    # 🎯 SEO Setup
    meta_title = models.CharField(max_length=255, blank=True)
    meta_description = models.TextField(blank=True)
    meta_keywords = models.CharField(max_length=255, blank=True, help_text="Comma separated keywords")
    
    # 📊 Status
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)

    @property
    def final_price(self):
        """Smart calculation: Agar discount hai toh kaat ke price do, warna original do"""
        if self.discount_percentage:
            discount_amount = (self.price_inr * self.discount_percentage) / 100
            return self.price_inr - discount_amount
        return self.price_inr

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        super().save(*args, **kwargs)

    def __str__(self):
        return self.title

class BookingInquiry(models.Model):
    trip = models.ForeignKey(Trip, on_delete=models.SET_NULL, null=True, related_name='inquiries')
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True)
    full_name = models.CharField(max_length=150)
    email = models.EmailField()
    phone = models.CharField(max_length=20)
    travel_date = models.DateField(null=True, blank=True)
    message = models.TextField(blank=True)
    status = models.CharField(max_length=20, choices=[('new', 'New'), ('contacted', 'Contacted'), ('converted', 'Converted')], default='new')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"Inquiry by {self.full_name} for {self.trip.title if self.trip else 'General'}"
        
class TravelBlog(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255, unique=True, blank=True)
    
    # Optional: Ise kisi specific desh se jodne ke liye
    destination = models.ForeignKey('Destination', on_delete=models.SET_NULL, null=True, blank=True, related_name='travel_blogs')
    author = models.CharField(max_length=100, default="Videsh Chalo Travel Desk")
    
    featured_image = models.ImageField(upload_to='travel_images/blogs/')
    short_summary = models.TextField(max_length=350, help_text="Blog card par dikhne wala chota text")
    content = RichTextUploadingField()
    reading_time = models.PositiveIntegerField(default=5, help_text="Reading time in minutes")
    
    # 🎯 SEO Setup
    meta_title = models.CharField(max_length=255, blank=True)
    meta_description = models.TextField(blank=True)
    meta_keywords = models.CharField(max_length=255, blank=True, help_text="Comma separated keywords")
    
    is_published = models.BooleanField(default=False)
    views_count = models.PositiveIntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "Travel Guide/Blog"
        verbose_name_plural = "Travel Guides & Blogs"
    
    # ✅ Naya function: Average Rating nikalne ke liye
    def average_rating(self):
        reviews = self.reviews.filter(is_approved=True)
        if reviews.exists():
            total = sum([r.rating for r in reviews])
            return round(total / reviews.count(), 1)
        return 0

    # ✅ Naya function: Total Review Count nikalne ke liye
    def total_reviews(self):
        return self.reviews.filter(is_approved=True).count()
    
    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        if not self.slug:
            from django.utils.text import slugify
            self.slug = slugify(self.title)
        super().save(*args, **kwargs)

    def __str__(self):
        return self.title
        
# ✅ NAYA MODEL: User Reviews ke liye
class TripReview(models.Model):
    trip = models.ForeignKey(Trip, on_delete=models.CASCADE, related_name='reviews')
    user_name = models.CharField(max_length=100)
    rating = models.PositiveIntegerField(choices=[(i, str(i)) for i in range(1, 6)], help_text="Rating 1 to 5")
    review_text = models.TextField()
    is_approved = models.BooleanField(default=False, help_text="Admin approval required to show on site")
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_at']

    def __str__(self):
        return f"{self.rating} Star by {self.user_name} for {self.trip.title}"