/*
 * 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/
 *
 * Author: Daniel Asarnow
 * Date:   2012-6-23
 */

package org.biojava.nbio.structure.cath;

import java.util.List;

/** General API for interacting with CATH.
 *
 * @author Daniel Asarnow
 */
public interface CathDatabase {

	/** Return the CATH release version.
	 *
	 * @return CATH version
	 */
	public String getCathVersion();

	/** Return the CathNode for a node ID.
	 *
	 * @param nodeId
	 * @return CATH node
	 */
	public CathNode getCathNode(String nodeId);

	/** Return list of CATH descriptions for node representatives at a CATH category (e.g. "T").
	 *
	 * @param category
	 * @return CATH descriptions
	 */
	public List<CathDomain> getByCategory(CathCategory category);

	/** Return list of CATH descriptions whose CATH codes (e.g. 1.4.6.10) start with the query.
	 * This is currently redundant with getDescriptionsByNodeId.
	 *
	 * @param query
	 * @return CATH descriptions
	 */
	public List<CathDomain> filterByCathCode(String query);

	/** Return the CATH sub-tree for a particular domain.
	 *
	 * @param domain
	 * @return CATH sub-tree
	 */
	public List<CathNode> getTree(CathDomain domain);

	/** Return list of CATH domains whose node name (e.g. Orthogonal Bundle) starts with the query.
	 *
	 * @param query
	 * @return CATH domains
	 */
	public List<CathDomain> filterByNodeName(String query);

	/** Return list of CATH descriptions whose descriptions (name field) starts with the query.
	 *
	 * @param query
	 * @return CATH descriptions
	 */
	public List<CathDomain> filterByDescription(String query);

	/** Return CATH description for node representative by node ID.
	 *
	 * @param nodeId
	 * @return CATH description
	 */
	public CathDomain getDescriptionByNodeId(String nodeId);

	/** Return all CATH domains for a PDB ID.
	 *
	 * @param pdbId
	 * @return CATH domains
	 */
	public List<CathDomain> getDomainsForPdb(String pdbId);

	/** Return CATH domain for CATH domain ID.
	 *
	 * @param cathId
	 * @return CATH domain
	 */
	public CathDomain getDomainByCathId(String cathId);

	/** Return CATH description for CATH domain ID.
	 *
	 * @param cathId
	 * @return
	 */
	public CathDomain getDescriptionByCathId(String cathId);

	/** Return all CATH domains for a particular CATH node.
	 *
	 * @param nodeId
	 * @return
	 */
	public List<CathDomain> getDomainsByNodeId(String nodeId);

	public List<CathFragment> getFragmentsByPdbId(String pdbId);
}
