/**
 * 
 */
package cz.neubauer.tomas.hazardanalysis.model.stages;

import java.util.ArrayList;

import cz.neubauer.tomas.hazardanalysis.model.dangers.DangerType;
import cz.neubauer.tomas.hazardanalysis.model.dangers.DangerVariant;

/**
 * Třída reprezentující fázi životní etapy stroje.
 * 
 * @author Tomáš Neubauer
 */
/**
 * @author pmacik
 * 
 */
public class Phase {
	/**
	 * Název fáze.
	 */
	private String name;

	/**
	 * Životní etapa stroje, do které fáze patří.
	 */
	private Stage stage;

	/**
	 * Kolekce závažných variant nebezpečí, které se projevují v dané fázi.
	 */
	private ArrayList<DangerVariant> variants;

	/**
	 * Vytvoří fázi životní etapy stroje s danými atributy.
	 * 
	 * @param stage
	 *            Životní etapa stroje, do které fáze patří.
	 * @param name
	 *            Název fáze.
	 */
	public Phase(Stage stage, String name) {
		this.stage = stage;
		this.name = name;
		variants = new ArrayList<DangerVariant>(10);
	}

	/**
	 * Vrází název fáze.
	 * 
	 * @return Název fáze.
	 */
	public String getName() {
		return name;
	}

	/**
	 * Nastaví název fáze.
	 * 
	 * @param name
	 *            Nový název fáze.
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * Vrátí životní etapu stroje, do které fáze patří.
	 * 
	 * @return Životní etapa stroje.
	 */
	public Stage getStage() {
		return stage;
	}

	/**
	 * Nastaví životní etapu stroje, do které fáze patří.
	 * 
	 * @param stage
	 *            Nová životní etapa stroje.
	 */
	public void setStage(Stage stage) {
		this.stage = stage;
	}

	/**
	 * Vrátí kolekci závažných variant, které se ve fázi projevují.
	 * 
	 * @return Kolekce závažných variant, které se ve fázi projevují.
	 */
	public ArrayList<DangerVariant> getVariants() {
		return variants;
	}

	/**
	 * Nastaví kolekci závažných variant, které se ve fázi projevují.
	 * 
	 * @param variants
	 *            Nová Kolekci závažných variant.
	 */
	public void setVariants(ArrayList<DangerVariant> variants) {
		this.variants = variants;
	}

	/**
	 * Vloží do fáze novou závažnou variantu nebezpečí.
	 * 
	 * @param dangerVariant
	 *            Vkládaná varianta nebezpečí.
	 */
	public void addDangerVariant(DangerVariant dangerVariant) {
		variants.add(dangerVariant);
	}

	/**
	 * Vrází variantu nebezpečí, která je ve fázi na pozici s daným indexem.
	 * 
	 * @param index
	 *            Index pozice varianty nebezpečí v rámci fáze.
	 * @return Závažnou variantu nebezpečí na dahé pozici.
	 */
	public DangerVariant getDangerVariant(int index) {
		return variants.get(index);
	}

	/**
	 * Odstraní z fáze variantu nebezpečí, která je ve fázi na pozici s daným
	 * indexem.
	 * 
	 * @param index
	 *            Index pozice varianty nebezpečí v rámci fáze.
	 */
	public void removeDangerVariant(int index) {
		variants.remove(index);
	}

	/**
	 * Smaže všechny varianty ve fázi.
	 */
	public void clear() {
		variants.clear();
	}

	/**
	 * Vrází textový řetězec, který obsahuje seznam typů nebezpečí, jejichž
	 * varianty jsou ve fázi.
	 * 
	 * @return Textový řetězec obsahující seznam typů nebezpečí.
	 */
	public String getDangerTypesAsString() {
		ArrayList<DangerType> types = new ArrayList<DangerType>(10);
		String retVal = "";

		int variantCount = variants.size();
		boolean firstRecord = true;
		DangerType currentType;
		for (int i = 0; i < variantCount; i++) {
			currentType = variants.get(i).getDangerType();
			if (!types.contains(currentType)) {
				if (!firstRecord) {
					retVal += ", ";
				} else {
					firstRecord = false;
				}
				retVal += currentType.getDescription();

				types.add(currentType);
			}
		}
		return retVal;
	}

	/**
	 * Vrází textový řetězec, který obsahuje seznam kódů typů nebezpečí, jejichž
	 * varianty jsou ve fázi.
	 * 
	 * @return Textový řetězec obsahující seznam kódů typů nebezpečí.
	 */
	public String getDangerTypeCodesAsString() {
		ArrayList<DangerType> types = new ArrayList<DangerType>(10);
		String retVal = "";

		int variantCount = variants.size();
		boolean firstRecord = true;
		DangerType currentType;
		for (int i = 0; i < variantCount; i++) {
			currentType = variants.get(i).getDangerType();
			if (!types.contains(currentType)) {
				if (!firstRecord) {
					retVal += ", ";
				} else {
					firstRecord = false;
				}
				retVal += currentType.getCode();

				types.add(currentType);
			}
		}
		return retVal;
	}

	/**
	 * Vrází textový řetězec, který obsahuje seznam popisů variant typů
	 * nebezpečí, které jsou ve fázi.
	 * 
	 * @return Textový řetězec obsahující seznam popisů variant typů nebezpečí.
	 */
	public String getDangerVarantDescriptionsAsString() {
		String retVal = "";

		int variantCount = variants.size();
		boolean firstRecord = true;
		for (int i = 0; i < variantCount; i++) {
			if (!firstRecord) {
				retVal += ", ";
			} else {
				firstRecord = false;
			}
			retVal += variants.get(i).getDescription();
		}
		return retVal;
	}
}
