from django.contrib import messages
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, redirect, render

from .forms import ParticipantForm, RegistrationForm
from .models import Option, Participant, Quiz, Result


def login_view(request):
    if request.user.is_authenticated:
        return redirect("dashboard")
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        if username and "@" in username:
            user_obj = Participant.objects.filter(email=username).first()
            if user_obj:
                username = user_obj.username
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect("dashboard")
        messages.error(request, "Invalid username/email or password")
    return render(request, "login.html")


def register_view(request):
    if request.user.is_authenticated:
        return redirect("dashboard")
    if request.method == "POST":
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.name = user.username
            user.save()
            login(request, user)
            return redirect("profile")
    else:
        form = RegistrationForm()
    return render(request, "register.html", {"form": form})


def logout_view(request):
    logout(request)
    return redirect("login")


@login_required
def dashboard(request):
    quizzes = Quiz.objects.all()
    results = Result.objects.filter(participant=request.user)
    return render(request, "dashboard.html", {"quizzes": quizzes, "results": results})


@login_required
def profile(request):
    if request.method == "POST":
        form = ParticipantForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            return redirect("dashboard")
    else:
        form = ParticipantForm(instance=request.user)
    return render(request, "profile.html", {"form": form})


@login_required
def take_quiz(request, quiz_id):
    quiz = get_object_or_404(Quiz, id=quiz_id)
    questions = quiz.questions.order_by("?")
    question_items = []
    for question in questions:
        question_items.append({"question": question, "options": question.options.order_by("?")})
    if request.method == "POST":
        score = 0
        total = quiz.questions.count()
        for question in quiz.questions.all():
            option_id = request.POST.get(str(question.id))
            if option_id and Option.objects.filter(id=option_id, question=question, is_correct=True).exists():
                score += 1
        result = Result.objects.create(participant=request.user, quiz=quiz, score=score, total=total)
        return redirect("result", result_id=result.id)
    return render(request, "take-quiz.html", {"quiz": quiz, "question_items": question_items})


@login_required
def result_view(request, result_id):
    result = get_object_or_404(Result, id=result_id, participant=request.user)
    higher_scores = Result.objects.filter(quiz=result.quiz, score__gt=result.score).count()
    position = higher_scores + 1
    return render(request, "result.html", {"result": result, "position": position})