#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import datetime
from django.shortcuts import render_to_response
from django.views.decorators.csrf import csrf_protect
from django.core.exceptions import ObjectDoesNotExist
from django.utils.hashcompat import md5_constructor
from django.http import HttpResponseRedirect
from django.conf import settings
from main.forms import AuthForm
from main.models import MyUser, Log, MySession
from main.utils import addressInNetwork, wificmd


def login(request):
    ip = request.META['REMOTE_ADDR']
        
    # Если IP-адрес не из wifi-сети, выводим информационное сообщение
    if not addressInNetwork(ip, settings.WIFI_NETWORK):
        return render_to_response('info.html', {})
    
    # Проверяем, если для текущего адреса доступ уже открыт, выводим информационное сообщение
    try:
        curSession = MySession.objects.get(ip=ip, online=True)
        endSession = curSession.start + datetime.timedelta(seconds=settings.SESSION_TIME)
        return render_to_response('pass.html', { 'endSession': endSession })        
    except ObjectDoesNotExist:
        pass
    
    context = {}
    context['AuthFaild'] = False    
    if request.method == 'POST':
        username = request.POST['username']
        context['form'] = AuthForm(request.POST)
        #Проверка пароля
        if context['form'].is_valid():
            # если указанный пользователь существует
            try:
                Log.objects.create(msg='Получаем информацию о пользователе', type='debug')
                user = MyUser.objects.get(userName=username)
                # Если акаунт не просрочек - проверяем пароль
                Log.objects.create(msg='Проверяем срок действия акаунта и валидность', type='debug')
                if ( user.expire >= datetime.date.today() ) and ( user.active ):
                    Log.objects.create(msg='Проверяем пароль', type='debug')
                    password = user.password 
                    salt = password.split('$')[0]
                    hash = password.split('$')[1]
                    rawPassword = request.POST['password']
                    curHash = md5_constructor( md5_constructor(salt).hexdigest() + md5_constructor(rawPassword).hexdigest() ).hexdigest()
                    
                    # Если авторизация пройдена - проверяем, нет ли активных сессий
                    if hash == curHash:
                        try:
                            Log.objects.create(msg='Проверяем активные сессии', type='debug')                        
                            session = MySession.objects.get(user__userName=username, online=True)
                            Log.objects.create(msg='Есть активная сессия. Закрываем.', type='debug')      
                            #os.system("{0} {1} {2}".format(settings.FW_SCRIPT, 'delete', ip))
                            wificmd('delete', ip)
                            session.online = False
                            session.end = datetime.datetime.now()
                            session.save()                            
                        except ObjectDoesNotExist:
                            pass
                        
                        Log.objects.create(msg='Открываем доступ', type='debug')
                        #os.system("{0} {1} {2}".format(settings.FW_SCRIPT, 'add', ip))
                        wificmd('add', ip)
                        MySession.objects.create(user=MyUser.objects.get(userName=username), ip=ip, online=True)
                        
                    else:
                        Log.objects.create(msg='Пароль неверный', type='debug')
                        context['AuthFaild'] = True
                        
                else:
                    Log.objects.create(msg='Акаунт просрочен или не активен', type='debug')                    
                    context['AuthFaild'] = True
            except ObjectDoesNotExist:
                Log.objects.create(msg='Пользователь не найден', type='debug')                
                context['AuthFaild'] = True
                
            # Логи
            if context['AuthFaild']:
                message = u'Ошибка авторизации с адреса: {0}, логин: {1}'.format(ip, username)
                Log.objects.create(msg=message, type='sec')
            else:
                message = u'Успешная авторизации с адреса: {0}, с логином: {1}'.format(ip, username)
                Log.objects.create(msg=message, type='sec')
                endSession = datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_TIME)
                return render_to_response('pass.html', { 'endSession': endSession })
    else:
        context['form'] = AuthForm
    
    return render_to_response('home.html', context)

def redirect_404(request):
    return HttpResponseRedirect('/')
