# -*- coding: utf-8 -*-

from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse
from django.http.response import (
    HttpResponse,
    HttpResponseForbidden,
    HttpResponseRedirect,
)
from django.shortcuts import Http404, get_object_or_404
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods

from junction.conferences.models import Conference

from . import permissions
from .forms import ProposalCommentForm
from .models import Proposal, ProposalComment
from .services import send_mail_for_new_comment, user_action_for_spam


@login_required
@require_http_methods(["POST"])
def create_proposal_comment(request, conference_slug, proposal_slug):
    conference = get_object_or_404(Conference, slug=conference_slug)
    proposal = get_object_or_404(Proposal, slug=proposal_slug, conference=conference)
    form = ProposalCommentForm(request.POST)

    if request.user.is_active is False:
        raise PermissionDenied()

    if form.is_valid():
        comment = form.cleaned_data["comment"]
        private = form.cleaned_data["private"]
        reviewer = form.cleaned_data["reviewer"]

        has_perm = permissions.is_proposal_author_or_proposal_section_reviewer(
            user=request.user, conference=conference, proposal=proposal
        )

        if private and not has_perm:
            raise Http404()

        proposal_comment = ProposalComment.objects.create(
            proposal=proposal,
            comment=comment,
            private=private,
            reviewer=reviewer,
            commenter=request.user,
        )
        host = "{}://{}".format(settings.SITE_PROTOCOL, request.META.get("HTTP_HOST"))

        if settings.USE_ASYNC_FOR_EMAIL:
            send_mail_for_new_comment.delay(proposal_comment.id, host)
        else:
            send_mail_for_new_comment(proposal_comment.id, host)

    redirect_url = reverse("proposal-detail", args=[conference.slug, proposal.slug])

    if private:
        redirect_url += "#js-reviewers"
    elif reviewer:
        redirect_url += "#js-only-reviewers"
    else:
        redirect_url += "#js-comments"

    return HttpResponseRedirect(redirect_url)


@login_required
@csrf_exempt
@require_http_methods(["POST"])
def mark_comment_as_spam(request, conference_slug, proposal_slug, proposal_comment_id):
    if not request.is_ajax() or request.user.is_active is False:
        return HttpResponseForbidden()

    conference = get_object_or_404(Conference, slug=conference_slug)
    proposal = get_object_or_404(Proposal, slug=proposal_slug, conference=conference)
    proposal_comment = get_object_or_404(
        ProposalComment, proposal=proposal, id=proposal_comment_id
    )

    if proposal_comment.is_spam:
        return HttpResponse("Already marked as spam")

    proposal_comment.is_spam = True
    proposal_comment.marked_as_spam_by = request.user
    proposal_comment.save()

    user_action_for_spam(
        proposal_comment.commenter, getattr(settings, "USER_SPAM_THRESHOLD", 2)
    )

    return HttpResponse("Marked as spam")


@login_required
@csrf_exempt
@require_http_methods(["POST"])
def unmark_comment_as_spam(
    request, conference_slug, proposal_slug, proposal_comment_id
):
    if not request.is_ajax() or request.user.is_active is False:
        return HttpResponseForbidden()

    conference = get_object_or_404(Conference, slug=conference_slug)
    proposal = get_object_or_404(Proposal, slug=proposal_slug, conference=conference)
    proposal_comment = get_object_or_404(
        ProposalComment, proposal=proposal, id=proposal_comment_id
    )

    if proposal_comment.is_spam and proposal_comment.marked_as_spam_by == request.user:
        proposal_comment.is_spam = False
        proposal_comment.marked_as_spam_by = None
        proposal_comment.save()

        user_action_for_spam(
            proposal_comment.commenter, getattr(settings, "USER_SPAM_THRESHOLD", 2)
        )

        return HttpResponse("Unmarked as spam")

    return HttpResponseForbidden()