from django.newforms import Form, ValidationError
from django.newforms import EmailField, CharField
from django.contrib.auth.models import User
from django.core.cache import cache
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth import REDIRECT_FIELD_NAME
from models import UserProfile
from django.conf import settings
from datetime import datetime
from pycon.core import safe_ascii_encode
import sha

class AdminCreateUserForm(Form):
    login = CharField(label=_('username'))
    first = CharField(label=_('first name'))
    last  = CharField(label=_('last name'))
    email = EmailField(label=_('e-mail'))

    def clean_login(self):
        login = self.cleaned_data['login']
        if User.objects.filter(username=login).count():
            raise ValidationError, "Login already exists."
        return login

    def save(self, request):
        if not self.is_valid():
            raise ValidationError, "Unknown Error"
        login = self.cleaned_data['login']
        first = self.cleaned_data['first']
        last  = self.cleaned_data['last']
        email = self.cleaned_data['email']
        return create_new_user_and_send_email(request,
            login, email, first, last)

def create_new_user_and_send_email(request, username, email,
                                   first=u'', last=u''):
    password = User.objects.make_random_password()
    user = User.objects.create_user(username, email, password)
    user.first_name = first
    user.last_name = last
    user.is_active = False
    user.save()
    code = sha.sha(datetime.now().ctime())
    code.update(safe_ascii_encode(username))
    code.update(safe_ascii_encode(first))
    code.update(safe_ascii_encode(last))
    code.update(safe_ascii_encode(email))
    haveMatch = True
    while haveMatch:
        codetext = code.hexdigest().upper()
        try:
            UserProfile.objects.get(code=codetext)
            code.update('collision')
        except UserProfile.DoesNotExist:
            haveMatch=False
    profile = UserProfile(user=user)
    profile.code = codetext
    profile.save()
    extra_context = {}
    extra_context['REDIRECT_FIELD_NAME'] = REDIRECT_FIELD_NAME
    extra_context['redirect_to']=settings.PROFILE_URL + 'password/'
    extra_context['mailto']=user
    extra_context['code']=codetext
    extra_context['password'] = password
    from django.template import loader, RequestContext
    from pycon.core.mail import send_mail
    message = loader.render_to_string('email/new_account_activate.txt',
        extra_context, context_instance=RequestContext(request))
    sent = send_mail(settings.CONFERENCE_NAME + ' Account Activation',
                          message, settings.USERMGR_FROM_EMAIL,
                         [user.email],
                         replyto_email=settings.USERMGR_REPLYTO_EMAIL)
    return user
