/**
 *                    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 Dec 7, 2013
 * Created by Douglas Myers-Turnbull
 *
 */
package org.biojava.bio.structure.io.sifts;

/**
 * An entry in the chain-level SIFTS mapping between UniProt and the PDB.
 * @author dmyersturnbull
 * @see SiftsChainToUniprotMapping
 * @since 3.0.7
 * @see SiftsResidue Which is a distinct concept
 */
public class SiftsChainEntry {

	private final String chainId;
	private final String pdbEnd;
	private final String pdbId;
	private final String pdbStart;
	private final String seqresEnd;
	private final String seqresStart;
	private final String uniprotEnd;
	private final String uniProtId;
	private final String uniprotStart;

	public SiftsChainEntry(String pdbId, String chainId, String uniProtId, String seqresStart, String seqresEnd,
			String pdbStart, String pdbEnd, String uniprotStart, String uniprotEnd) {
		super();
		this.pdbId = pdbId;
		this.chainId = chainId;
		this.uniProtId = uniProtId;
		this.seqresStart = seqresStart;
		this.seqresEnd = seqresEnd;
		this.pdbStart = pdbStart;
		this.pdbEnd = pdbEnd;
		this.uniprotStart = uniprotStart;
		this.uniprotEnd = uniprotEnd;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) return true;
		if (obj == null) return false;
		if (getClass() != obj.getClass()) return false;
		SiftsChainEntry other = (SiftsChainEntry) obj;
		if (chainId == null) {
			if (other.chainId != null) return false;
		} else if (!chainId.equals(other.chainId)) return false;
		if (pdbEnd == null) {
			if (other.pdbEnd != null) return false;
		} else if (!pdbEnd.equals(other.pdbEnd)) return false;
		if (pdbId == null) {
			if (other.pdbId != null) return false;
		} else if (!pdbId.equals(other.pdbId)) return false;
		if (pdbStart == null) {
			if (other.pdbStart != null) return false;
		} else if (!pdbStart.equals(other.pdbStart)) return false;
		if (seqresEnd == null) {
			if (other.seqresEnd != null) return false;
		} else if (!seqresEnd.equals(other.seqresEnd)) return false;
		if (seqresStart == null) {
			if (other.seqresStart != null) return false;
		} else if (!seqresStart.equals(other.seqresStart)) return false;
		if (uniProtId == null) {
			if (other.uniProtId != null) return false;
		} else if (!uniProtId.equals(other.uniProtId)) return false;
		if (uniprotEnd == null) {
			if (other.uniprotEnd != null) return false;
		} else if (!uniprotEnd.equals(other.uniprotEnd)) return false;
		if (uniprotStart == null) {
			if (other.uniprotStart != null) return false;
		} else if (!uniprotStart.equals(other.uniprotStart)) return false;
		return true;
	}

	public String getChainId() {
		return chainId;
	}

	/**
	 * @return A residue number
	 */
	public String getPdbEnd() {
		return pdbEnd;
	}

	public String getPdbId() {
		return pdbId;
	}

	/**
	 * @return A residue number
	 */
	public String getPdbStart() {
		return pdbStart;
	}

	/**
	 * @return A residue number
	 */
	public String getSeqresEnd() {
		return seqresEnd;
	}

	/**
	 * @return A residue number
	 */
	public String getSeqresStart() {
		return seqresStart;
	}

	public String getUniprotEnd() {
		return uniprotEnd;
	}

	public String getUniProtId() {
		return uniProtId;
	}

	public String getUniprotStart() {
		return uniprotStart;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (chainId == null ? 0 : chainId.hashCode());
		result = prime * result + (pdbEnd == null ? 0 : pdbEnd.hashCode());
		result = prime * result + (pdbId == null ? 0 : pdbId.hashCode());
		result = prime * result + (pdbStart == null ? 0 : pdbStart.hashCode());
		result = prime * result + (seqresEnd == null ? 0 : seqresEnd.hashCode());
		result = prime * result + (seqresStart == null ? 0 : seqresStart.hashCode());
		result = prime * result + (uniProtId == null ? 0 : uniProtId.hashCode());
		result = prime * result + (uniprotEnd == null ? 0 : uniprotEnd.hashCode());
		result = prime * result + (uniprotStart == null ? 0 : uniprotStart.hashCode());
		return result;
	}

	@Override
	public String toString() {
		return "SiftsChainToUniprotEntry [pdbId=" + pdbId + ", chainId=" + chainId + ", uniProtId=" + uniProtId
				+ ", seqresStart=" + seqresStart + ", seqresEnd=" + seqresEnd + ", pdbStart=" + pdbStart + ", pdbEnd="
				+ pdbEnd + ", uniprotStart=" + uniprotStart + ", uniprotEnd=" + uniprotEnd + "]";
	}

}
