/*
 *                    BioJava development code
 *
 * This code may be freely distributed and modified under the
 * terms of the GNU Lesser General Public Licence.  This should
 * be distributed with the code.  If you do not have a copy,
 * see:
 *
 *      http://www.gnu.org/copyleft/lesser.html
 *
 * Copyright for this code is held jointly by the individual
 * authors.  These should be listed in @author doc comments.
 *
 * For more information on the BioJava project and its aims,
 * or to join the biojava-l mailing list, visit the home page
 * at:
 *
 *      http://www.biojava.org/
 *
 * Created on Jun 5, 2010
 * Author: Jianjiong Gao
 *
 */

package org.biojava.nbio.protmod.structure;

import org.biojava.nbio.protmod.ProteinModification;

import java.util.Collection;
import java.util.Set;

/**
 * Root interface for all modifications in structure.
 *
 * @author Jianjiong Gao
 * @since 3.0
 */
public interface ModifiedCompound {

	/** return a description of this compound
	 *
	 * @return a description
	 */
	public String getDescription();

	public void setDescription(String desc);

	/**
	 *
	 * @return {@link ProteinModificationBean} occurred on the residue.
	 */
	public ProteinModification getModification();

	public void setModification(ProteinModification modi);

	/**
	 *
	 * @return a set of involved group.
	 */
	public Set<StructureGroup> getGroups();

	public void setGroups(Set<StructureGroup> groups);

	/**
	 *
	 * @param isAminoAcid true if amino acids.
	 * @return a set of involved group of the type.
	 */
	public Set<StructureGroup> getGroups(boolean isAminoAcid);



	/**
	 *
	 * @return a set of atom linkages.
	 * @see #getLinkedGroupPairs
	 * @see StructureAtomLinkage
	 */
	public Set<StructureAtomLinkage> getAtomLinkages();

	/** Set atom linkages
	 *
	 * @return
	 */
	public void setAtomLinkages(Set<StructureAtomLinkage> linkages);

	/**
	 * Add a linkage. Add new the involved groups first using {@link addGroup}.
	 * @param linkage an atom linkage.
	 * @return true if this linkage was not already contained.
	 * @see StructureAtomLinkage
	 */
	public boolean addAtomLinkage(StructureAtomLinkage linkage);

	/**
	 * Add a collections of linkages.
	 * @param linkages an atom linkage.
	 */
	public void addAtomLinkages(Collection<StructureAtomLinkage> linkages);


	/**
	 *
	 * @return true if groups from multiple chains were involved
	 */
	public boolean crossChains();


}
