package eu.dnetlib.client.managers;

import java.util.logging.Logger;

import javax.inject.Inject;
import javax.inject.Singleton;

import eu.dnetlib.client.shared.StartUpComponents;
import eu.dnetlib.efg1914.authoring.components.Permit;
import eu.dnetlib.efg1914.authoring.components.Permit.actions;
import eu.dnetlib.efg1914.authoring.components.Permit.editRange;

/*
 * 
 */
@Singleton
public class PermissionsManagerImpl implements PermissionsManager {
	@Inject
	private StartUpComponents startupComponents;

	private static Logger log = Logger.getLogger("PermissionsManagerImpl.java");

	public PermissionsManagerImpl() {

	};

	public boolean isPermitted(final String userId, final String componentId, final String componentClass, final String componentCurator, final String action) {

		Permit permit = this.startupComponents.getPermissions().get(componentClass);

		boolean edit = false;

		if (action.equalsIgnoreCase("create")) {
			edit = permit.isPermitted(actions.valueOf(action), editRange.MINE);
		} else {

			if (userId.equals(componentCurator)) {

				edit = permit.isPermitted(actions.valueOf(action), editRange.MINE);
			} else {
				edit = permit.isPermitted(actions.valueOf(action), editRange.ALL);
			}
		}

		return edit;

	}

	public boolean isUserPermitted(final String userId, final String componentId, String action) {

		Permit permit = this.startupComponents.getPermissions().get("user");

		boolean edit = false;

		if (action.equalsIgnoreCase("create")) {
			edit = permit.isPermitted(actions.valueOf(action), editRange.MINE);
		} else {

			if (userId.equals(componentId)) {
				edit = permit.isPermitted(actions.valueOf(action), editRange.MINE);
			} else {
				edit = permit.isPermitted(actions.valueOf(action), editRange.ALL);

			}

		}

		return edit;

	}

	public boolean isPermitted(final String userId, final String componentClass, final String action) {

		Permit permit = this.startupComponents.getPermissions().get(componentClass);

		boolean edit = false;

		if (action.equalsIgnoreCase("create")) {
			edit = permit.isPermitted(actions.valueOf(action), editRange.MINE);
		} else {

			edit = permit.isPermitted(actions.valueOf(action), editRange.ALL);

		}
		log.info("user us permitted: " + componentClass + action + edit);
		return edit;

	}
}
