/**
 *  UserManagement
 *  Copyright 23.06.2015 by Robert Mader, @treba13
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *  
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *  
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program in the file lgpl21.txt
 *  If not, see <http://www.gnu.org/licenses/>.
 */

package org.loklak.api.cms;

import org.json.JSONObject;
import org.loklak.data.DAO;
import org.loklak.server.*;
import org.loklak.tools.storage.JSONObjectWithDefault;

import javax.servlet.http.HttpServletResponse;
import java.util.Map;

public class UserManagementService extends AbstractAPIHandler implements APIHandler {

	private static final long serialVersionUID = 8578478303032749879L;

	@Override
	public BaseUserRole getMinimalBaseUserRole() {
		return BaseUserRole.PRIVILEGED;
	}

	@Override
	public JSONObject getDefaultPermissions(BaseUserRole baseUserRole){
		JSONObject result = new JSONObject();

		switch(baseUserRole){
			case ADMIN:
				result.put("list_users", true);
				result.put("list_users-roles", true);
				result.put("edit-all", true);
				result.put("edit-less-privileged", true);
				break;
			case PRIVILEGED:
				result.put("list_users", true);
				result.put("list_users-roles", true);
				result.put("edit-all", false);
				result.put("edit-less-privileged", true);
				break;
			default:
				result.put("list_users", false);
				result.put("list_users-roles", false);
				result.put("edit-all", false);
				result.put("edit-less-privileged", false);
				break;
		}

		return result;

	}

	public String getAPIPath() {
		return "/api/user-management.json";
	}

	@Override
	public JSONObject serviceImpl(Query post, HttpServletResponse response, Authorization rights, final JSONObjectWithDefault permissions) throws APIException {

		JSONObject result = new JSONObject();

		switch (post.get("show","")){
			case "user-list":
				if(permissions.getBoolean("list_users", false)){
					result.put("user-list", DAO.authorization.getPersistent());
				} else throw new APIException(403, "Forbidden");
				break;
			case "user-roles":
				JSONObject userRolesObj = new JSONObject();
				Map<String, UserRole> userRoles = DAO.userRoles.getUserRoles();
				for(String key : userRoles.keySet()){
					UserRole userRole = userRoles.get(key);
					JSONObject obj = new JSONObject();
					obj.put("display-name",userRole.getDisplayName());
					obj.put("base-user-role",userRole.getBaseUserRole().name());
					obj.put("permission-overrides",userRole.getPermissionOverrides());
					userRolesObj.put(key,obj);
				}
				result.put("user-roles", userRolesObj);
				break;
			default: throw new APIException(400, "No 'show' parameter specified");
		}

		return result;
	}
}
