# Create your views here.
from django.http import HttpResponse
from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
from store.api import StoreApi
from django.contrib.auth.decorators import login_required
from django.contrib import auth
import os
import json
import base64


def estabilish_store_user(request, user):
    try:
        details = request.user.cloud_details
        password = details.smb_password
        quota = details.disk_quota * 1024
        key_list = []
        for key in request.user.sshkey_set.all():
            key_list.append(key.key)
    except:
        return HttpResponse('Can not acces to django database!', status=404)
        # Create user
    if not StoreApi.createuser(user, password, key_list, str(quota)):
        return HttpResponse('User does not exist on store!'
                            'And could not create!')


@login_required
def index(request):
    user = request.user.username
    if StoreApi.userexist(user) is not True:
        estabilish_store_user(request, user)
    # UpdateAuthorizationInfo
    try:
        try:
            details = request.user.cloud_details
            password = details.smb_password
            key_list = []
            for key in request.user.sshkey_set.all():
                key_list.append(key.key)
        except:
            return HttpResponse('Can not acces to django database!',
                                status=404)
        if not StoreApi.updateauthorizationinfo(user, password, key_list):
            return HttpResponse('Can not update authorization information!')
    except:
        pass
    # Download handler
    try:
        dl = request.POST['dl']
        return redirect(StoreApi.requestdownload(user, dl))
    except:
        pass
    # Upload handler
    try:
        ul = request.POST['ul']
        url = StoreApi.requestupload(user, ul)
        return render_to_response('store/upload.html',
                                  RequestContext(request, {'URL': url}))
    except:
        pass
    # Remove handler
    try:
        rm = request.POST['rm']
        StoreApi.requestremove(user, rm)
    except:
        pass
    # Remove handler
    try:
        path = request.POST['path']
        new = request.POST['new']
        StoreApi.requestnewfolder(user, path + '/' + new)
    except:
        pass
    # Simple file list
    path = '/'
    try:
        path = request.POST['path']
    except:
        pass
    # Normalize path (Need double dirname /folder/ -> /folder -> /
    backpath = os.path.normpath(os.path.dirname(os.path.dirname(path)))
    file_list = StoreApi.listfolder(user, path)
    quota = StoreApi.requestquota(user)
    return render_to_response('store/list.html',
                              RequestContext(request,
                                             {
                                                 'file_list': file_list,
                                                 'path': path,
                                                 'backpath': backpath,
                                                 'username': user,
                                                 'quota': quota
                                             }
                                             ))


@login_required
def ajax_listfolder(request):
    user = request.user.username
    if StoreApi.userexist(user) is not True:
        estabilish_store_user(request, user)
    path = '/'
    try:
        path = request.POST['path']
    except:
        pass
    # Normalize path (Need double dirname /folder/ -> /folder -> /
    # backpath = os.path.normpath(os.path.dirname(os.path.dirname(path)))
    file_list = StoreApi.listfolder(user, path)
    return HttpResponse(json.dumps(file_list))


@login_required
def ajax_quota(request):
    user = request.user.username
    if StoreApi.userexist(user) is not True:
        estabilish_store_user(request, user)
    return HttpResponse(json.dumps(StoreApi.requestquota(user)))
    # return HttpResponse(json.dumps({'Used':20,'Soft':160,'Hard':200}))


@login_required
def ajax_download(request):
    user = request.user.username
    try:
        dl = request.POST['dl']
        return HttpResponse(json.dumps(
            {'url': StoreApi.requestdownload(user, dl)}))
    except:
        pass
    return HttpResponse('File not found!', status=404)


@login_required
def ajax_upload(request):
    user = request.user.username
    try:
        ul = request.POST['ul']
        url = StoreApi.requestupload(user, ul)
        return HttpResponse(json.dumps({'url': url}))
    except:
        pass
    return HttpResponse('Error!', status=404)


@login_required
def ajax_delete(request):
    user = request.user.username
    try:
        rm = request.POST['rm']
        return HttpResponse(json.dumps(
            {'success': StoreApi.requestremove(user, rm)}))
    except:
        pass
    return HttpResponse('File not found!', status=404)


@login_required
def ajax_new_folder(request):
    user = request.user.username
    try:
        path = request.POST['path']
        new = request.POST['new']
        success = StoreApi.requestnewfolder(user, path + '/' + new)
        return HttpResponse(json.dumps({'success': success}))
    except:
        pass
    return HttpResponse('Error!', status=404)


@login_required
def ajax_rename(request):
    user = request.user.username
    try:
        path = request.POST['path']
        new = request.POST['new']
        success = StoreApi.requestrename(user, path, new)
        return HttpResponse(json.dumps({'success': success}))
    except:
        pass
    return HttpResponse('Error!', status=404)


@login_required
def toplist(request):
    user = request.user.username
    path = backpath = '/'
    file_list = StoreApi.toplist(user)
    return render_to_response('store/list.html',
                              RequestContext(request,
                                             {
                                                 'file_list': file_list,
                                                 'path': path,
                                                 'backpath': backpath,
                                                 'username': user
                                             }))


@login_required
def ajax_toplist(request):
    user = request.user.username
    file_list = StoreApi.toplist(user)
    return HttpResponse(json.dumps(file_list))


@login_required
def gui(request):
    user = request.user.username
    if request.method == 'GET':
        return render_to_response('store/gui.html',
                                  RequestContext(
                                      request,
                                      {
                                          'username': user,
                                          'host': StoreApi.get_host()
                                      }))
    elif request.method == 'POST':
        try:
            details = request.user.cloud_details
            password = details.smb_password
            key_list = []
            for key in request.user.sshkey_set.all():
                key_list.append(key.key)
        except:
            return HttpResponse('Can not acces to django database!',
                                status=404)
        try:
            lab_key_decoded = base64.b64decode(request.POST['KEY'])
            key_list.append(lab_key_decoded)
        except:
            if StoreApi.updateauthorizationinfo(user, password, key_list):
                return HttpResponse('Keys resetted succesfully!')
            else:
                return HttpResponse('Can not update authorization '
                                    'information!')
        if StoreApi.updateauthorizationinfo(user, password, key_list):
            return HttpResponse('https://cloud.ik.bme.hu/home/' +
                                '?neptun=' + user + '&' + 'host=' +
                                StoreApi.get_host())
        else:
            return HttpResponse('Can not update authorization information!')
    else:
        return HttpResponse('Method not found!', status=404)


def logout(request):
    auth.logout(request)
    return redirect('/')
