package org.gluu.oxtrust.service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import org.gluu.oxtrust.model.GluuCustomPerson;
import org.gluu.oxtrust.model.GluuGroup;
import org.gluu.persist.exception.EntryPersistenceException;
import org.gluu.util.StringHelper;
import org.slf4j.Logger;

@Named
public class MemberService implements Serializable {

	private static final long serialVersionUID = -3545641785714134933L;

	@Inject
	private GroupService groupService;

	@Inject
	private PersonService personService;
	
	@Inject
	private Logger log;

	public void removePerson(GluuCustomPerson person) {
		// Remove groups where user is owner
		List<GluuGroup> groups = groupService.getAllGroups();
		for (GluuGroup group : groups) {
			if (StringHelper.equalsIgnoreCase(group.getOwner(), person.getDn())) {
				groupService.removeGroup(group);
			}
		}
		// Remove person from associated groups
		removePersonFromGroups(person);
		// Remove person
		personService.removePerson(person);
	}

	private void removePersonFromGroups(GluuCustomPerson person) {
		log.debug("Removing person from associated group before deletion");
        String pesonDn = person.getDn();
		// Remove person from associated groups
		List<String> associatedGroupsDn = person.getMemberOf();
		for (String groupDn : associatedGroupsDn) {
		    if (!groupService.contains(groupDn)) {
		        continue;
		    }

		    GluuGroup group = groupService.getGroupByDn(groupDn);

			List<String> members = new ArrayList<String>(group.getMembers());
			members.remove(pesonDn);
			group.setMembers(members);
			try {
				groupService.updateGroup(group);
			} catch (EntryPersistenceException ex) {
			    log.error("Failed to remove preson '{}' from group '{}'", ex);
			}
		}
		log.debug("All group updated");
	}

}