/*
 *                    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/
 *
 */
package org.biojava.nbio.structure;

import java.io.IOException;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.biojava.nbio.structure.align.util.AtomCache;

public class BioAssemblyIdentifier implements StructureIdentifier {
	private String pdbCode;
	private int biolNr;

	public static final Pattern BIO_NAME_PATTERN = Pattern.compile("^(?:BIO:)([0-9][a-z0-9]{3})(?::([0-9]+))?$", Pattern.CASE_INSENSITIVE);

	public BioAssemblyIdentifier(String name) {
		Matcher match = BIO_NAME_PATTERN.matcher(name);
		if(! match.matches() ) {
			throw new IllegalArgumentException("Invalid BIO identifier");
		}
		pdbCode = match.group(1);
		if(match.group(2) != null) {
			biolNr = Integer.parseInt(match.group(2));
		} else {
			biolNr = 1;
		}
	}

	public BioAssemblyIdentifier(String pdbCode, int biolNr) {
		this.pdbCode = pdbCode;
		this.biolNr = biolNr;
	}

	@Override
	public String getIdentifier() {
		if( biolNr < 0) {
			return "BIO:"+pdbCode;
		} else {
			return String.format("BIO:%s:%d",pdbCode,biolNr);
		}
	}
	@Override
	public String toString() {
		return getIdentifier();
	}

	@Override
	public Structure loadStructure(AtomCache cache) throws StructureException,
			IOException {
		return cache.getBiologicalAssembly(pdbCode, biolNr);
	}

	@Override
	public SubstructureIdentifier toCanonical() throws StructureException {
		return new SubstructureIdentifier(pdbCode, new ArrayList<ResidueRange>());
	}

	@Override
	public Structure reduce(Structure input) throws StructureException {
		// Should be the full structure
		return input;
	}

}
