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 django.template.loader import render_to_string
from .models import Video, Comment, Like
from .forms import VideoUploadForm, CommentForm
from .ajax_utils import ajax_response, is_ajax_request


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,
        'title': 'Home - YouTube Clone',
        'request': request,
    }
    
    if is_ajax_request(request):
        return ajax_response('videos/home_partial.html', context)
    
    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,
        'title': f'{video.title} - YouTube Clone',
        'request': request,
    }
    
    if is_ajax_request(request):
        return ajax_response('videos/video_detail_partial.html', context)
    
    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()
            
            if is_ajax_request(request):
                return ajax_response(
                    success=True,
                    message='Video uploaded successfully!',
                    redirect_url=f'/video/{video.id}/'
                )
            
            messages.success(request, 'Your video has been uploaded successfully!')
            return redirect('videos:video_detail', video_id=video.id)
        else:
            if is_ajax_request(request):
                return ajax_response(
                    success=False,
                    message='Error uploading video',
                    context={'errors': form.errors}
                )
    else:
        form = VideoUploadForm()
    
    context = {
        'form': form,
        'title': 'Upload Video - YouTube Clone',
        'request': request,
    }
    
    if is_ajax_request(request):
        return ajax_response('videos/upload_partial.html', context)
    
    return render(request, 'videos/upload.html', context)


@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()
        
        if is_ajax_request(request):
            # Return updated comments HTML
            comments = video.comments.all().order_by('-created_date')
            context = {
                'comments': comments,
                'request': request,
            }
            return JsonResponse({
                'success': True,
                'message': 'Comment posted successfully!',
                'comments_html': render_to_string('videos/comments_partial.html', context, request=request)
            })
        
        return redirect('videos:video_detail', video_id=video_id)
    
    if is_ajax_request(request):
        return JsonResponse({
            'success': False,
            'message': 'Error posting comment',
            'errors': form.errors
        })
    
    return redirect('videos:video_detail', video_id=video_id)


def load_comments(request, video_id):
    """Load comments via AJAX"""
    video = get_object_or_404(Video, id=video_id)
    comments = video.comments.all().order_by('-created_date')
    
    context = {
        'comments': comments,
        'request': request,
    }
    
    return JsonResponse({
        'success': True,
        'comments_html': render_to_string('videos/comments_partial.html', context, request=request)
    })


@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,
        'title': f'Search Results for "{query}" - YouTube Clone',
        'request': request,
    }
    
    if is_ajax_request(request):
        return ajax_response('videos/search_partial.html', context)
    
    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,
        'title': f'{category_name} Videos - YouTube Clone',
        'request': request,
    }
    
    if is_ajax_request(request):
        return ajax_response('videos/category_partial.html', context)
    
    return render(request, 'videos/category.html', context)


@login_required
def my_videos(request):
    videos = Video.objects.filter(uploader=request.user).order_by('-upload_date')
    
    context = {
        'videos': videos,
        'title': 'My Videos - YouTube Clone',
        'request': request,
    }
    
    if is_ajax_request(request):
        return ajax_response('videos/my_videos_partial.html', context)
    
    return render(request, 'videos/my_videos.html', context)
