def group(request):
    allGroups = Group.objects.all()
    if 'currentUser' in request.session:
        method = request.POST.get("goBack", '').lower()
        if method == 'go back':
            return render(request, 'index.html')
        form = addGroupForm.addGroupForm()
        formDel = deleteForm.deleteForm()
        if request.method == 'POST':
            method = request.POST.get("addGroup", '').lower()
            if method == "add group":
                form = addGroupForm.addGroupForm(request.POST)
                if form.is_valid():
                    groupname = form.cleaned_data['groupname']
                    Group.addGroup(groupname)
            else:
                method = request.POST.get("delGroup", '').lower()
                if method == "delete group":
                    formDel = deleteForm.deleteForm(request.POST)
                    if formDel.is_valid():
                        name = formDel.cleaned_data['name']
                        Group.delGroup(name)
        return render(
            request, 'group.html', {
                'allGroups': allGroups,
                'form': form,
                'formDel': formDel,
                'session': request.session
            })

    return HttpResponseRedirect(redirect_to='/login/')
def user(request):
    allUsers = User.objects.all()
    if 'currentUser' in request.session:
        form = addUserForm.addUserForm()
        formDel = deleteForm.deleteForm()
        formUpdatePass = updatePassForm.updatePassForm()
        if request.method == 'POST':
            method = request.POST.get("goBack", '').lower()
            if method == 'go back':
                return render(request, 'index.html')
            method = request.POST.get("addUser", '').lower()
            if method == "add user":
                form = addUserForm.addUserForm(request.POST)
                if form.is_valid():
                    username = form.cleaned_data['username']
                    password = form.cleaned_data['password']
                    groupList = form.cleaned_data['groups']
                    User.addUser(username, groupList, password)
            method = request.POST.get("delUser", '').lower()
            if method == "delete user":
                formDel = deleteForm.deleteForm(request.POST)
                if formDel.is_valid():
                    name = formDel.cleaned_data['name']
                    User.delUser(name)
            method = request.POST.get("updatePass", '').lower()
            if method == "update":
                formUpdatePass = updatePassForm.updatePassForm(request.POST)
                if formUpdatePass.is_valid():
                    newPass = formUpdatePass.cleaned_data['newPassword']
                    User.setPassword(request.session['currentUser'], newPass)

        return render(
            request, 'user.html', {
                'allUsers': allUsers,
                'form': form,
                'formDel': formDel,
                'formUpdatePass': formUpdatePass,
                'session': request.session
            })

    return HttpResponseRedirect(redirect_to='/login/')
def user(request):
    if 'currentUser' in request.session:
        allUsers = User.objects.all()
        successful_event = False
        form = addUserForm.addUserForm()
        formDel = deleteForm.deleteForm()
        formUpdatePass = updatePassForm.updatePassForm()

        if request.method == 'POST':
            method = request.POST.get("action")

            if method == 'goBack':  # not implemented
                successful_event = True

            if method == "addUser":
                username = request.POST.get("username")
                password = request.POST.get("password")
                groupList = request.POST.get("groups")
                groupList = json.loads(groupList)
                User.addUser(username, groupList, password)
                successful_event = True
            if method == "delUser":
                name = request.POST.get("username")
                User.delUser(name)
                successful_event = True

            if method == "updatePass":
                formUpdatePass = updatePassForm.updatePassForm(request.POST)
                if formUpdatePass.is_valid():
                    newPass = request.POST.get("newPassword")
                    User.setPassword(request.session['currentUser'], newPass)
                    successful_event = True

            json_to_client = {'isSuccessful': successful_event}
            return JsonResponse(json_to_client)
        if request.method == 'GET':
            return render(
                request, 'user.html', {
                    'allUsers': allUsers,
                    'form': form,
                    'formDel': formDel,
                    'formUpdatePass': formUpdatePass,
                    'session': request.session
                })

    else:  # not logged in
        return HttpResponseRedirect(redirect_to='/login/')
def group(request):
    if 'currentUser' in request.session:
        allGroups = Group.objects.all()
        successful_event = False
        form = addGroupForm.addGroupForm()
        formDel = deleteForm.deleteForm()

        if request.method == 'POST':
            method = request.POST.get("action")

            if method == 'goBack':  # not implemented
                successful_event = True

            if method == "addGroup":
                groupname = request.POST.get("groupname")
                Group.addGroup(groupname)
                successful_event = True

            if method == "delGroup":
                name = request.POST.get("name")
                Group.delGroup(name)
                successful_event = True

            json_to_client = {'isSuccessful': successful_event}
            return JsonResponse(json_to_client)
        if request.method == 'GET':
            return render(
                request, 'group.html', {
                    'allGroups': allGroups,
                    'form': form,
                    'formDel': formDel,
                    'session': request.session
                })

    else:  # not logged in
        return HttpResponseRedirect(redirect_to='/login/')
def image(request):
    allImages = Image.objects.all()
    if 'currentUser' in request.session:
        form = loadImageForm.loadImageForm()
        formSave = saveImageForm.saveImageForm()
        formLoad = saveImageForm.saveImageForm()
        formSetDefault = setDefaultForm.setDefaultForm()
        formAddRule = addRuleForm.addRuleForm()
        formDelRule = deleteForm.deleteForm()
        if request.method == 'POST':
            method = request.POST.get("goBack", '').lower()
            if method == 'go back':
                return render(request, 'index.html')
            method = request.POST.get("load", '').lower()
            if method == "load":
                form = loadImageForm.loadImageForm(request.POST, request.FILES)
                if form.is_valid():
                    img = form.cleaned_data['img'].name
                    adjustSession(request, False, img)
            method = request.POST.get("save", '').lower()
            if method == "save":
                formSave = saveImageForm.saveImageForm(request.POST)
                if formSave.is_valid():
                    imgInstance = Image(
                        owner=request.session['currentUser'],
                        name=formSave.cleaned_data['imageName'],
                        rule_list=request.session['rule_list'],
                        defaultAction=request.session['defaultAction'],
                        is_initialized=request.session['is_initialized'],
                        img=request.session['currentImage'])
                    imgInstance.name = formSave.cleaned_data['imageName']
                    imgInstance.saveDB(imgInstance.name)
            method = request.POST.get("loadDB", '').lower()
            if method == "load":
                formLoad = saveImageForm.saveImageForm(request.POST)
                if formLoad.is_valid():
                    nameToLoaded = formLoad.cleaned_data['imageName']
                    imgInstance = Image.objects.filter(name=nameToLoaded)[0]
                    imgInstance.load(nameToLoaded)
                    adjustSession(request, True, imgInstance)
            method = request.POST.get("showImage", '').lower()
            if method == 'show image':
                imgInstance = Image(
                    owner=request.session['owner'],
                    name=request.session['name'],
                    rule_list=request.session['rule_list'],
                    defaultAction=request.session['defaultAction'],
                    is_initialized=request.session['is_initialized'],
                    img=request.session['currentImage'])
                img = imgInstance.getImage(request.session['currentUser'])
                cv2.imshow('im', img)
                cv2.waitKey()
            method = request.POST.get("setDefault", '').lower()
            if method == 'set default':
                formSetDefault = setDefaultForm.setDefaultForm(request.POST)
                if formSetDefault.is_valid():
                    imgInstance = Image(
                        owner=request.session['owner'],
                        name=request.session['name'],
                        rule_list=request.session['rule_list'],
                        defaultAction=request.session['defaultAction'],
                        is_initialized=request.session['is_initialized'],
                        img=request.session['currentImage'])
                    imgInstance.setDefault(
                        formSetDefault.cleaned_data['defaultAction'])
                    adjustSession(request, True, imgInstance)
            method = request.POST.get("addRule", '').lower()
            if method == 'add rule':
                formAddRule = addRuleForm.addRuleForm(request.POST)
                if formAddRule.is_valid():
                    imgInstance = Image(
                        owner=request.session['owner'],
                        name=request.session['name'],
                        rule_list=request.session['rule_list'],
                        defaultAction=request.session['defaultAction'],
                        is_initialized=request.session['is_initialized'],
                        img=request.session['currentImage'])
                    effects = formAddRule.cleaned_data['effects']
                    action = formAddRule.cleaned_data['action']
                    shape = formAddRule.cleaned_data['shape']
                    coordinates = formAddRule.cleaned_data[
                        'coordinates'].split(' ')
                    rule = None
                    if shape.lower() == 'circle':
                        rule = (shape, int(coordinates[0]),
                                int(coordinates[1]), int(coordinates[2]))
                    if shape.lower() == 'rectangle':
                        rule = (shape, int(coordinates[0]),
                                int(coordinates[1]), int(coordinates[2]),
                                int(coordinates[2]))
                    if shape.lower() == 'polyline':
                        coordinates = list(map(int, coordinates))
                        res = []
                        for i in range(0, len(coordinates), 2):
                            res.append((coordinates[i], coordinates[i + 1]))
                        rule = (shape, res)
                    imgInstance.addRule(effects, rule, action)
                    request.session['owner'] = imgInstance.owner
                    request.session['name'] = imgInstance.name
                    request.session[
                        'defaultAction'] = imgInstance.defaultAction
                    request.session['rule_list'] = imgInstance.rule_list
                    request.session[
                        'is_initialized'] = imgInstance.is_initialized
                    request.session['currentImage'] = imgInstance.img.name
            method = request.POST.get("delRule", '').lower()
            if method == 'delete rule':
                formDelRule = deleteForm.deleteForm(request.POST)
                if formDelRule.is_valid():
                    imgInstance = Image(
                        owner=request.session['owner'],
                        name=request.session['name'],
                        rule_list=request.session['rule_list'],
                        defaultAction=request.session['defaultAction'],
                        is_initialized=request.session['is_initialized'],
                        img=request.session['currentImage'])
                    deletePos = formDelRule.cleaned_data['name']
                    imgInstance.delRule(deletePos)
                    request.session['owner'] = imgInstance.owner
                    request.session['name'] = imgInstance.name
                    request.session[
                        'defaultAction'] = imgInstance.defaultAction
                    request.session['rule_list'] = imgInstance.rule_list
                    request.session[
                        'is_initialized'] = imgInstance.is_initialized
                    request.session['currentImage'] = imgInstance.img.name

        return render(
            request, 'image.html', {
                'allImages': allImages,
                'form': form,
                'formSave': formSave,
                'formLoadFromDB': formLoad,
                'formSetDefault': formSetDefault,
                'formAddRule': formAddRule,
                'formDelRule': formDelRule,
                'session': request.session
            })

    return HttpResponseRedirect(redirect_to='/login/')
def image(request):
    if 'currentUser' in request.session:
        allImages = Image.objects.all()
        form = loadImageForm.loadImageForm()
        formSave = saveImageForm.saveImageForm()
        formLoad = loadFromDB.loadImageForm()
        formSetDefault = setDefaultForm.setDefaultForm()
        formAddRule = addRuleForm.addRuleForm()
        formDelRule = deleteForm.deleteForm()
        successful_event = False
        if request.method == 'POST':
            method = request.POST.get("action")
            print(request.POST)
            if method == 'goBack':
                successful_event = True
            if method == "loadFromComp":
                img = request.POST.get('img')
                adjustSession(request, False, img)
                successful_event = True
            if method == "save":
                imgInstance = Image(
                    owner=request.session['currentUser'],
                    name=request.POST.get('imageName'),
                    rule_list=request.session['rule_list'],
                    defaultAction=request.session['defaultAction'],
                    is_initialized=request.session['is_initialized'],
                    img=request.session['currentImage'])
                imgInstance.saveDB(imgInstance.name)
                successful_event = request.session['currentUser']
            if method == "loadDB":
                nameToLoaded = request.POST.get('imageName')
                imgInstance = Image.objects.filter(name=nameToLoaded)[0]
                imgInstance.load(nameToLoaded)
                adjustSession(request, True, imgInstance)
                successful_event = True
            if method == 'showImage':
                imgInstance = Image(
                    owner=request.session['owner'],
                    name=request.session['name'],
                    rule_list=request.session['rule_list'],
                    defaultAction=request.session['defaultAction'],
                    is_initialized=request.session['is_initialized'],
                    img=request.session['currentImage'])
                img = imgInstance.getImage(request.session['currentUser'])
                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
                pilimg = PILImage.fromarray(img)
                pilimg.save("img_tool_app/media/trial_image.jpeg", 'JPEG')
                return HttpResponse("/media/trial_image.jpeg",
                                    content_type="text/plain")
            if method == 'set default':
                imgInstance = Image(
                    owner=request.session['owner'],
                    name=request.session['name'],
                    rule_list=request.session['rule_list'],
                    defaultAction=request.session['defaultAction'],
                    is_initialized=request.session['is_initialized'],
                    img=request.session['currentImage'])
                imgInstance.setDefault(request.POST.get('defaultAction'))
                adjustSession(request, True, imgInstance)
                img = imgInstance.getImage(request.session['currentUser'])
                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
                pilimg = PILImage.fromarray(img)
                pilimg.save("img_tool_app/media/trial_image.jpeg", 'JPEG')
                print("New Image with new Default Saved")
                return HttpResponse("/media/trial_image.jpeg",
                                    content_type="text/plain")

            if method == 'add rule':
                print("helo")
                imgInstance = Image(
                    owner=request.session['owner'],
                    name=request.session['name'],
                    rule_list=request.session['rule_list'],
                    defaultAction=request.session['defaultAction'],
                    is_initialized=request.session['is_initialized'],
                    img=request.session['currentImage'])
                effects = request.POST.get('effects')
                action = request.POST.get('defaultAction')
                shape = request.POST.get('shape')
                coordinates = request.POST.get('coordinates').split(' ')
                rule = None
                print(shape)
                if shape.lower() == 'circle':
                    rule = (shape, int(coordinates[0]), int(coordinates[1]),
                            int(coordinates[2]))
                if shape.lower() == 'rectangle':

                    rule = (shape, int(coordinates[0]), int(coordinates[1]),
                            int(coordinates[2]), int(coordinates[2]))
                if shape.lower() == 'polyline':
                    coordinates = list(map(int, coordinates))
                    res = []
                    for i in range(0, len(coordinates), 2):
                        res.append((coordinates[i], coordinates[i + 1]))
                    rule = (shape, res)
                imgInstance.addRule(effects, rule, action)
                request.session['owner'] = imgInstance.owner
                request.session['name'] = imgInstance.name
                request.session['defaultAction'] = imgInstance.defaultAction
                request.session['rule_list'] = imgInstance.rule_list
                request.session['is_initialized'] = imgInstance.is_initialized
                request.session['currentImage'] = imgInstance.img.name
                img = imgInstance.getImage(request.session['currentUser'])
                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
                pilimg = PILImage.fromarray(img)
                pilimg.save("img_tool_app/media/trial_image.jpeg", 'JPEG')
                print("New Image Saved")
                return HttpResponse("/media/trial_image.jpeg",
                                    content_type="text/plain")
            if method == 'delete rule':
                imgInstance = Image(
                    owner=request.session['owner'],
                    name=request.session['name'],
                    rule_list=request.session['rule_list'],
                    defaultAction=request.session['defaultAction'],
                    is_initialized=request.session['is_initialized'],
                    img=request.session['currentImage'])
                deletePos = request.POST.get('position')
                imgInstance.delRule(deletePos)
                request.session['owner'] = imgInstance.owner
                request.session['name'] = imgInstance.name
                request.session['defaultAction'] = imgInstance.defaultAction
                request.session['rule_list'] = imgInstance.rule_list
                request.session['is_initialized'] = imgInstance.is_initialized
                request.session['currentImage'] = imgInstance.img.name
                img = imgInstance.getImage(request.session['currentUser'])
                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
                pilimg = PILImage.fromarray(img)
                pilimg.save("img_tool_app/media/trial_image.jpeg", 'JPEG')
                return HttpResponse("/media/trial_image.jpeg",
                                    content_type="text/plain")
            json_to_client = {'isSuccessful': successful_event}
            return JsonResponse(json_to_client)
        if request.method == 'GET':
            return render(
                request, 'image.html', {
                    'allImages': allImages,
                    'form': form,
                    'formSave': formSave,
                    'formLoadFromDB': formLoad,
                    'formSetDefault': formSetDefault,
                    'formAddRule': formAddRule,
                    'formDelRule': formDelRule,
                    'session': request.session
                })

    else:  # not logged in
        return HttpResponseRedirect(redirect_to='/login/')