from django.db import models
from django.contrib.auth import get_user_model
from categories.models import Category
from images.models import Image
from videos.models import Video

User = get_user_model()

class PostImage(models.Model):
    post = models.ForeignKey('Post', on_delete=models.CASCADE)
    image = models.ForeignKey(Image, on_delete=models.CASCADE)
    order = models.PositiveIntegerField(default=0)

    class Meta:
        ordering = ['order']
        unique_together = [('post', 'image'), ('post', 'order')]

class PostVideo(models.Model):
    post = models.ForeignKey('Post', on_delete=models.CASCADE)
    video = models.ForeignKey(Video, on_delete=models.CASCADE)
    order = models.PositiveIntegerField(default=0)

    class Meta:
        ordering = ['order']
        unique_together = [('post', 'video'), ('post', 'order')]

class Post(models.Model):
    AUDIENCE_CHOICES = [
        ('PUBLIC', 'Public'),
        ('FOLLOWERS', 'Followers Only'),
        ('CLOSE_FRIENDS', 'Close Friends Only'),
        ('ONLY_ME', 'Only Me'),
    ]

    content = models.TextField(blank=True, default='')
    audience = models.CharField(max_length=20, choices=AUDIENCE_CHOICES, default='PUBLIC')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    is_updated = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)  # Soft delete
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True, related_name='posts')
    group = models.ForeignKey(
        'usergroups.Group',
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        related_name='group_posts'
    )  # Null = personal post, Set = group post
    images = models.ManyToManyField(Image, blank=True, related_name='posts', through=PostImage)
    videos = models.ManyToManyField(Video, blank=True, related_name='posts', through=PostVideo)
    shared_count = models.PositiveIntegerField(default=0)

    # Interaction settings
    allow_likes = models.BooleanField(default=True)
    allow_comments = models.BooleanField(default=True)
    allow_sharing = models.BooleanField(default=True)

    # Display settings
    show_comments = models.BooleanField(default=True)
    show_likes_count = models.BooleanField(default=True)
    show_shares_count = models.BooleanField(default=True)
    allow_saving = models.BooleanField(default=True)

    class Meta:
        verbose_name = "Post"
        verbose_name_plural = "Posts"
        ordering = ['-created_at']
        indexes = [
            models.Index(fields=['created_at']),
            models.Index(fields=['is_active', 'created_at']),
            models.Index(fields=['category_id', 'created_at']),
            models.Index(fields=['created_by_id', 'created_at']),
        ]

    def get_abs_title(self):
        if self.content:
            if len(self.content.strip()) > 30:
                return f"{self.content.strip()[:30]}..."
            else:
                return self.content.strip()
        return "No Content"

    def __str__(self):
        return f"{self.get_abs_title()} (by {self.created_by})"