from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.db.models import Q, Count
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from .models import Video, Comment, Like
from .forms import VideoUploadForm, CommentForm


def home(request):
    videos = Video.objects.all().order_by('-upload_date')
    categories = Video.CATEGORY_CHOICES
    
    # Get videos by category
    category_videos = {}
    for category_id, category_name in categories:
        category_videos[category_id] = Video.objects.filter(
            category=category_id
        ).order_by('-upload_date')[:6]
    
    context = {
        'videos': videos[:12],  # Show latest 12 videos
        'category_videos': category_videos,
        'categories': categories,
    }
    return render(request, 'videos/home.html', context)


def video_detail(request, video_id):
    video = get_object_or_404(Video, id=video_id)
    
    # Increment view count
    video.views += 1
    video.save()
    
    # Check if user has liked this video
    user_has_liked = False
    if request.user.is_authenticated:
        user_has_liked = Like.objects.filter(video=video, user=request.user).exists()
    
    # Get comments
    comments = video.comments.all().order_by('-created_date')
    
    # Get related videos (same category)
    related_videos = Video.objects.filter(
        category=video.category
    ).exclude(id=video.id).order_by('-upload_date')[:5]
    
    comment_form = CommentForm()
    
    context = {
        'video': video,
        'comments': comments,
        'related_videos': related_videos,
        'user_has_liked': user_has_liked,
        'comment_form': comment_form,
    }
    return render(request, 'videos/video_detail.html', context)


@login_required
def upload_video(request):
    if request.method == 'POST':
        form = VideoUploadForm(request.POST, request.FILES)
        if form.is_valid():
            video = form.save(commit=False)
            video.uploader = request.user
            video.save()
            messages.success(request, 'Your video has been uploaded successfully!')
            return redirect('videos:video_detail', video_id=video.id)
    else:
        form = VideoUploadForm()
    
    return render(request, 'videos/upload.html', {'form': form})


@login_required
@require_POST
def add_comment(request, video_id):
    video = get_object_or_404(Video, id=video_id)
    form = CommentForm(request.POST)
    
    if form.is_valid():
        comment = form.save(commit=False)
        comment.video = video
        comment.user = request.user
        comment.save()
        return redirect('videos:video_detail', video_id=video_id)
    
    return redirect('videos:video_detail', video_id=video_id)


@login_required
@require_POST
def toggle_like(request, video_id):
    video = get_object_or_404(Video, id=video_id)
    like, created = Like.objects.get_or_create(video=video, user=request.user)
    
    if not created:
        # User already liked, so unlike
        like.delete()
        video.likes -= 1
        liked = False
    else:
        # User liked the video
        video.likes += 1
        liked = True
    
    video.save()
    
    return JsonResponse({
        'liked': liked,
        'likes_count': video.likes
    })


def search(request):
    query = request.GET.get('q', '')
    videos = []
    
    if query:
        videos = Video.objects.filter(
            Q(title__icontains=query) |
            Q(description__icontains=query) |
            Q(tags__icontains=query) |
            Q(uploader__username__icontains=query)
        ).order_by('-upload_date')
    
    context = {
        'query': query,
        'videos': videos,
    }
    return render(request, 'videos/search.html', context)


def category_videos(request, category):
    videos = Video.objects.filter(category=category).order_by('-upload_date')
    category_name = dict(Video.CATEGORY_CHOICES).get(category, category.title())
    
    context = {
        'videos': videos,
        'category_name': category_name,
        'category': category,
    }
    return render(request, 'videos/category.html', context)


@login_required
def my_videos(request):
    videos = Video.objects.filter(uploader=request.user).order_by('-upload_date')
    return render(request, 'videos/my_videos.html', {'videos': videos})
