from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.core.paginator import Paginator
from .models import Topic, Comment
from django.db.models import Q


@login_required
def topic_list(request):
    query = request.GET.get('q', '')
    topics = Topic.objects.all()

    if query:
        topics = topics.filter(
            Q(title__icontains=query) | Q(content__icontains=query) | Q(author__email__icontains=query)
        )

    paginator = Paginator(topics, 10)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    return render(request, 'forum/list.html', {'topics': page_obj, 'query': query})


@login_required
def topic_detail(request, topic_id):
    topic = get_object_or_404(Topic, id=topic_id)
    comments = topic.comments.all()

    if request.method == 'POST':
        if topic.is_closed:
            messages.error(request, 'Эта тема закрыта для комментариев')
            return redirect('topic_detail', topic_id=topic.id)

        content = request.POST.get('content', '').strip()
        if content:
            Comment.objects.create(topic=topic, author=request.user, content=content)
            messages.success(request, 'Комментарий добавлен')
        return redirect('topic_detail', topic_id=topic.id)

    return render(request, 'forum/detail.html', {'topic': topic, 'comments': comments})


@login_required
def topic_create(request):
    if request.method == 'POST':
        title = request.POST.get('title', '').strip()
        content = request.POST.get('content', '').strip()

        if not title or not content:
            messages.error(request, 'Заполните все поля')
            return redirect('topic_create')

        topic = Topic.objects.create(title=title, content=content, author=request.user)
        messages.success(request, 'Тема создана')
        return redirect('topic_detail', topic_id=topic.id)

    return render(request, 'forum/create.html')


@login_required
def topic_edit(request, topic_id):
    topic = get_object_or_404(Topic, id=topic_id)

    if topic.author != request.user and not request.user.is_staff:
        messages.error(request, 'Вы не можете редактировать эту тему')
        return redirect('topic_detail', topic_id=topic.id)

    if request.method == 'POST':
        topic.title = request.POST.get('title', '').strip()
        topic.content = request.POST.get('content', '').strip()
        topic.save()
        messages.success(request, 'Тема обновлена')
        return redirect('topic_detail', topic_id=topic.id)

    return render(request, 'forum/edit.html', {'topic': topic})


@login_required
def topic_delete(request, topic_id):
    topic = get_object_or_404(Topic, id=topic_id)

    if topic.author != request.user and not request.user.is_staff:
        messages.error(request, 'Вы не можете удалить эту тему')
        return redirect('topic_detail', topic_id=topic.id)

    if request.method == 'POST':
        topic.delete()
        messages.success(request, 'Тема удалена')
        return redirect('forum_list')

    return render(request, 'forum/delete_confirm.html', {'topic': topic})


@login_required
def comment_edit(request, comment_id):
    comment = get_object_or_404(Comment, id=comment_id)

    if comment.author != request.user and not request.user.is_staff:
        messages.error(request, 'Вы не можете редактировать этот комментарий')
        return redirect('topic_detail', topic_id=comment.topic.id)

    if request.method == 'POST':
        comment.content = request.POST.get('content', '').strip()
        comment.save()
        messages.success(request, 'Комментарий обновлён')
        return redirect('topic_detail', topic_id=comment.topic.id)

    return render(request, 'forum/comment_edit.html', {'comment': comment})


@login_required
def comment_delete(request, comment_id):
    comment = get_object_or_404(Comment, id=comment_id)

    if comment.author != request.user and not request.user.is_staff:
        messages.error(request, 'Вы не можете удалить этот комментарий')
        return redirect('topic_detail', topic_id=comment.topic.id)

    if request.method == 'POST':
        comment.delete()
        messages.success(request, 'Комментарий удалён')
        return redirect('topic_detail', topic_id=comment.topic.id)

    return render(request, 'forum/comment_delete.html', {'comment': comment})


@login_required
def pin_topic(request, topic_id):
    if request.user.role not in ['teacher', 'academic_staff', 'admin']:
        messages.error(request, 'У вас нет прав на это действие')
        return redirect('topic_detail', topic_id=topic_id)

    topic = get_object_or_404(Topic, id=topic_id)
    topic.is_pinned = not topic.is_pinned
    topic.save()

    messages.success(request, f'Тема {"закреплена" if topic.is_pinned else "откреплена"}')
    return redirect('topic_detail', topic_id=topic.id)


@login_required
def close_topic(request, topic_id):
    if request.user.role not in ['teacher', 'academic_staff', 'admin']:
        messages.error(request, 'У вас нет прав на это действие')
        return redirect('topic_detail', topic_id=topic_id)

    topic = get_object_or_404(Topic, id=topic_id)
    topic.is_closed = not topic.is_closed
    topic.save()

    messages.success(request, f'Тема {"закрыта" if topic.is_closed else "открыта"}')
    return redirect('topic_detail', topic_id=topic.id)