"""
This module defines views for mailbox and mail address handling.

"""
from __future__ import absolute_import, unicode_literals

from django.http import HttpResponseForbidden
from django.shortcuts import get_object_or_404, redirect
from django.utils.translation import ugettext as _
from django.views.generic.edit import (
    CreateView,
    UpdateView,
)
from django.contrib import messages

from gvacommon.viewmixins import StaffOrSelfLoginRequiredMixin

from hostingpackages.models import CustomerHostingPackage

from .forms import (
    CreateMailboxForm,
    ChangeMailboxPasswordForm,
)
from .models import Mailbox



class HostingPackageAndCustomerMixin(object):
    """
    Mixin for views that gets the hosting package instance from the URL
    keyword argument 'package'.

    """
    hosting_package_kwarg = 'package'
    """Keyword argument used to find the hosting package in the URL."""

    def get_hosting_package(self):
        return get_object_or_404(
            CustomerHostingPackage,
            pk=int(self.kwargs[self.hosting_package_kwarg]))

    def get_customer_object(self):
        return self.get_hosting_package().customer



class CreateMailbox(
    HostingPackageAndCustomerMixin, StaffOrSelfLoginRequiredMixin, CreateView
):
    """
    This view is used to setup new mailboxes for a customer hosting package.

    """
    model = Mailbox
    context_object_name = 'mailbox'
    template_name_suffix = '_create'
    form_class = CreateMailboxForm

    def dispatch(self, request, *args, **kwargs):
        resp = super(CreateMailbox, self).dispatch(request, *args, **kwargs)
        if not self.get_hosting_package().may_add_mailbox():
            resp = HttpResponseForbidden(
                _('You are not allowed to add more mailboxes to this'
                  ' hosting package'))
        return resp

    def get_context_data(self, **kwargs):
        context = super(CreateMailbox, self).get_context_data(**kwargs)
        context['hostingpackage'] = self.get_hosting_package()
        context['customer'] = self.get_customer_object()
        return context

    def get_form_kwargs(self):
        kwargs = super(CreateMailbox, self).get_form_kwargs()
        kwargs['hostingpackage'] = self.get_hosting_package()
        return kwargs

    def form_valid(self, form):
        mailbox = form.save()
        messages.success(
            self.request,
            _('Mailbox {mailbox} created successfully.').format(
                mailbox=mailbox.username
            )
        )
        return redirect(self.get_hosting_package())


class ChangeMailboxPassword(
    HostingPackageAndCustomerMixin, StaffOrSelfLoginRequiredMixin, UpdateView
):
    """
    This view is used to set a new password for an existing mailbox.

    """
    context_object_name = 'mailbox'
    form_class = ChangeMailboxPasswordForm
    model = Mailbox
    slug_field = 'username'
    template_name_suffix = '_setpassword'

    def get_context_data(self, **kwargs):
        context = super(ChangeMailboxPassword, self).get_context_data(**kwargs)
        context['hostingpackage'] = self.get_hosting_package()
        context['customer'] = self.get_customer_object()
        return context

    def get_form_kwargs(self):
        kwargs = super(ChangeMailboxPassword, self).get_form_kwargs()
        kwargs['hostingpackage'] = self.get_hosting_package()
        return kwargs

    def form_valid(self, form):
        mailbox = form.save()
        messages.success(
            self.request,
            _('Successfully set new password for mailbox {mailbox}.').format(
                mailbox=mailbox.username
            )
        )
        return redirect(self.get_hosting_package())