#// Copyright (c) 2000-2017 Ericsson Telecom AB                                                         //
#// All rights reserved. This program and the accompanying materials are made available under the terms //
#// of the Eclipse Public License v1.0 which accompanies this distribution, and is available at         //
#// http://www.eclipse.org/legal/epl-v10.html                                                           //
#/////////////////////////////////////////////////////////////////////////////////////////////////////////
import json, os

class FileUserHandler:
    '''
    This class stores usergroup information in a json file and provides an interface for editing the usergroups.
    '''

    def __init__(self, directory):
        self._directory = directory
        with open(os.path.join(self._directory, 'userGroups.json'), 'r') as f:
            self._userGroups = json.load(f)

    def _saveUserGroups(self):
        with open(os.path.join(self._directory, 'userGroups.json'), 'w') as f:
            json.dump(self._userGroups, f, indent = 4)

    def getUserGroups(self, username):
        return set(self._userGroups['users'].get(username, []))

    def addGroup(self, group, save = True):
        if group not in self._userGroups['groups']:
            self._userGroups['groups'].append(group)
            if save:
                self._saveUserGroups()

    def removeGroup(self, group, save = True):
        if group in self._userGroups['groups']:
            self._userGroups['groups'].remove(group)
            for user in self._userGroups['users'].keys():
                self.removeUserFromGroup(user, group, False)
            if save:
                self._saveUserGroups()

    def addUserToGroup(self, username, group, save = True):
        if group in self._userGroups['groups']:
            if username not in self._userGroups['users']:
                self._userGroups['users'][username] = []
            if group not in self._userGroups['users'][username]:
                self._userGroups['users'][username].append(group)
                if save:
                    self._saveUserGroups()

    def removeUserFromGroup(self, username, group, save = True):
        if username in self._userGroups['users'] and group in self._userGroups['users'][username]:
            self._userGroups['users'][username].remove(group)
            if len(self._userGroups['users'][username]) == 0:
                self._userGroups['users'].pop(username, [])
            if save:
                self._saveUserGroups()

    def listGroups(self):
        return self._userGroups['groups']

    def listUsersInGroup(self, group):
        users = set()
        for user in self._userGroups['users']:
            if group in self._userGroups['users'][user]:
                users.add(user)
        return users
