package org.biojava.nbio.aaproperties;

import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * This class provides the protein properties at the level of individual amino acids.
 *
 * @author Yana Valasatava
 */
public class AminoAcidProperties {

	private static final Set<String> negChargedAAs = Stream.of("D", "E").collect(Collectors.toSet());
	private static final Set<String> posChargedAAs = Stream.of("K", "R", "H").collect(Collectors.toSet());
	private static final Set<String> polarAAs = Stream.of("D", "E", "K", "R", "H", "N", "Q", "S", "T", "Y")
			.collect(Collectors.toSet());
	
	/**
	 * At pH=7, two are negative charged: aspartic acid (Asp, D) and glutamic acid (Glu, E) (acidic side chains), 
	 * and three are positive charged: lysine (Lys, K), arginine (Arg, R) and histidine (His, H) (basic side chains).
	 * 
	 * @param aa The one-letter amino acid code 
	 * @return true if amino acid is charged
	 */
	public static final boolean isCharged(char aa) {
		if (negChargedAAs.contains(String.valueOf(aa))) {
			return true;
		}
		else if (posChargedAAs.contains(String.valueOf(aa))) {
			return true;
		}
		return false;
	}
	
	/**
	 * Returns the charge of amino acid. At pH=7, two are negative charged: aspartic acid (Asp, D) and glutamic acid (Glu, E) (acidic side chains), 
	 * and three are positive charged: lysine (Lys, K), arginine (Arg, R) and histidine (His, H) (basic side chains).
	 * 
	 * @param aa The one-letter amino acid code 
	 * @return the charge of amino acid (1 if positively charged, -1 if negatively charged, 0 if not charged)
	 */
	public static final int getChargeOfAminoAcid(char aa) {
		if (negChargedAAs.contains(String.valueOf(aa))) {
			return -1;
		}
		else if (posChargedAAs.contains(String.valueOf(aa))) {
			return 1;
		}
		return 0;
	}
	
	/**
	 * There are 10 amino acids: D, E, H, K, R, N, Q, S, T, Y, that are polar.
	 * 
	 * @param aa The one-letter amino acid code 
	 * @return true if amino acid is polar
	 */
	public static final boolean isPolar(char aa) {
		if (polarAAs.contains(String.valueOf(aa))) {
			return true;
		}
		return false;
	}
	
	/**
	 * There are 10 amino acids: D, E, H, K, R, N, Q, S, T, Y, that are polar.
	 * 
	 * @param aa The one-letter amino acid code
	 * @return the polarity of amino acid (1 if polar, 0 if not polar)
	 */
	public static final int getPolarityOfAminoAcid(char aa) {
		if (polarAAs.contains(String.valueOf(aa))) {
			return 1;
		}
		return 0;
	}
}
