from __future__ import unicode_literals
try:
    from collections import OrderedDict
except ImportError:
    OrderedDict = None

from django import forms

import account.forms
from django.utils.translation import ugettext_lazy as _


class SignupForm(account.forms.SignupForm):

    first_name = forms.CharField(label=_("First name"))
    last_name = forms.CharField(label=_("Last name"))
    email_confirm = forms.EmailField(label=_("Confirm Email"))

    def __init__(self, *args, **kwargs):
        super(SignupForm, self).__init__(*args, **kwargs)
        key_order = [
            "email",
            "email_confirm",
            "first_name",
            "last_name",
            "password",
            "password_confirm"
        ]
        self.fields = reorder_fields(self.fields, key_order)

    def clean_email_confirm(self):
        email = self.cleaned_data.get("email")
        email_confirm = self.cleaned_data["email_confirm"]
        if email:
            if email != email_confirm:
                raise forms.ValidationError(
                    _("Email address must match previously typed email address"))
        return email_confirm


def reorder_fields(fields, order):
    """Reorder form fields by order, removing items not in order.

    >>> reorder_fields(
    ...     OrderedDict([('a', 1), ('b', 2), ('c', 3)]),
    ...     ['b', 'c', 'a'])
    OrderedDict([('b', 2), ('c', 3), ('a', 1)])
    """
    for key, v in fields.items():
        if key not in order:
            del fields[key]

    if not OrderedDict or hasattr(fields, "keyOrder"):
        # fields is SortedDict
        fields.keyOrder.sort(key=lambda k: order.index(k[0]))
        return fields
    else:
        # fields is OrderedDict
        return OrderedDict(sorted(fields.items(), key=lambda k: order.index(k[0])))
