import re
import hashlib
import os
from django.core.exceptions import ValidationError
from django import forms
from django.shortcuts import render
from django.http import HttpResponse
from warpauth.ldap_connector import LDAPConnector
from warpauth.models import LdapUser, ActivationToken, LdapGroup
from warpauth.util import *
from django.utils.translation import ugettext as _
from django.core.exceptions import ObjectDoesNotExist
from warpzone.settings import INSTANCE_NAME
from django.shortcuts import redirect

def send_token(token):
    email_content = _("https://infra.warpzone.ms/account/registration/activate/%(token)s") % {'token': token.token }
    ret = send_email(token.email, _("Your registration for WarpInfra"), email_content )
    return ret


def register(request):
    page_context['success'] = False
    if "INTERN" in INSTANCE_NAME:
        return redirect('http://infra.warpzone.ms/account/registration/')

    if request.method == "POST":
        username = request.POST['username']
        password = request.POST['password']
        password2 = request.POST['password2']
        email = request.POST['email']

        f = forms.EmailField()
        try:
            f.clean(email)
        except ValidationError as e:
            page_context["error"] = _("err_invalid_email_format")

        page_context["error"] = ""

        if username == "" or email == "" or password == "" or password2 == "":
            page_context['error'] = _("err_fill_all_fields")
        elif not re.search(r'^\w+$', username):
            page_context['error'] = _("err_invalid_username")
        elif password != password2:
            page_context['error'] = _("err_passwords_not_matching")
        elif not page_context["error"]:
            u = LdapUser.objects.filter(uid=username)
            if u.count() == 0:
                user = LdapUser()
                user.uid = username
                user.first_name = "None"
                user.last_name = "None"
                user.cn = username
                user.email = email
                user.uidNumber = "513"
                user.gidNumber = "100"
                user.homeDirectory = "/dev/null"
                user.save()
                ldap_connector = LDAPConnector()
                ldap_connector.change_user_password(user.build_dn(), None, request.POST["password"], True)
                token = ActivationToken()
                token.user = username
                token.email = email
                token.token = hashlib.sha1(os.urandom(128)).hexdigest()
                token.save()
                ret = send_token(token)
                if not ret:
                    page_context["error"] = _("err_sending_mail") #Error while sending the email. Please contact the administrator.
                else:
                    page_context['success'] = True
            else:
                page_context['error'] = _("err_username_not_available")

    return HttpResponse(render(request, 'warpauth/register/register.html', page_context))


def activate(request, token=None):
    if "INTERN" in INSTANCE_NAME:
        return redirect('http://infra.warpzone.ms/account/registration/')
    try:
        activation_token = ActivationToken.objects.get(token=token)
        group = LdapGroup.objects.filter(name="active").get()
        group.members.append("uid="+str(activation_token.user)+",ou=users,dc=warpzone,dc=ms")
        group.save()
        activation_token.delete()
    except ObjectDoesNotExist:
        page_context["error"] = _("err_token_invalid")

    return HttpResponse(render(request, 'warpauth/register/activate.html', page_context))

def resend_token(request):
    if "INTERN" in INSTANCE_NAME:
        return redirect('http://infra.warpzone.ms/account/registration/')
    if request.method == "POST":
        try:
            token = ActivationToken.objects.get(user=request.POST["username"])
            if token.email == request.POST["email"]:
                ret = send_token(token)
                if not ret:
                    page_context["error"] = _("err_processing_request")
                page_context["success"] = True
        except ObjectDoesNotExist:
            page_context["error"] = _("err_processing_request")
            
    return HttpResponse(render(request, 'warpauth/register/resend_token.html', page_context))