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

import java.util.ArrayList;

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

/**
 * Třída reprezentující źivotní etapu stroje.
 * 
 * @author Tomáš Neubauer
 */
public class Stage {
	/**
	 * Klíč záznamu v datavázi.
	 */
	private int id;

	/**
	 * Popis životní etapy.
	 */
	private String description;

	/**
	 * Kolekce fází životní etapy.
	 */
	private ArrayList<Phase> phases;

	/**
	 * Vytvoří novou životní etapu stroje s danými atriburty.
	 * 
	 * @param id
	 *            Klíč záznamu v databázi.
	 * @param description
	 *            Popis životní etapy.
	 * @param phases
	 *            Kolekce fází životní etapy.
	 */
	public Stage(int id, String description, ArrayList<Phase> phases) {
		this.id = id;
		this.description = description;
		this.phases = phases;
	}

	/**
	 * Vytvoří novou životní etapu stroje s danými atriburty a prázdnou kolekcí
	 * jejích fází.
	 * 
	 * @param id
	 *            Klíč záznamu v databázi.
	 * @param description
	 *            Popis životní etapy.
	 */
	public Stage(int id, String description) {
		this.id = id;
		this.description = description;
		phases = new ArrayList<Phase>(10);
	}

	/**
	 * Vrátí popis životní etapy.
	 * 
	 * @return Popis životní etapy.
	 */
	public String getDescription() {
		return description;
	}

	/**
	 * Nastaví popis životní etapy.
	 * 
	 * @param description
	 *            Nový popis životní etapy.
	 */
	public void setDescription(String description) {
		this.description = description;
	}

	/**
	 * Vrátí kolekci fází životní etapy.
	 * 
	 * @return Kolekce fází životní etapy.
	 */
	public ArrayList<Phase> getPhases() {
		return phases;
	}

	/**
	 * Nastaví kolekci fází životní etapy.
	 * 
	 * @param phases
	 *            Nová kolekce fází životní etapy.
	 */
	public void setPhases(ArrayList<Phase> phases) {
		this.phases = phases;
	}

	/**
	 * Vloží do životní etapy novou fázi.
	 * 
	 * @param phase
	 *            Nová fáze životí etapy.
	 */
	public void addPhase(Phase phase) {
		phases.add(phase);
	}

	/**
	 * Vrází fázi životní etapy, která je v kolekci na pozici s daným indexem.
	 * 
	 * @param index
	 *            Index pozice fáze.
	 * @return Fáze životní etapy na dané pozici.
	 */
	public Phase getPhase(int index) {
		return phases.get(index);
	}

	/**
	 * Odstraní z kolekce fázi životní etapy, která je v kolekci na pozici s
	 * daným indexem.
	 * 
	 * @param index
	 *            Index pozice fáze.
	 */
	public void removePhase(int index) {
		phases.remove(index);
	}

	/**
	 * Odstraní z životní etapy všechny její fáze.
	 */
	public void clear() {
		phases.clear();
	}

	/**
	 * Vrátí klíč záznamu v databázové tabulce.
	 * 
	 * @return Klíč záznamu.
	 */
	public int getId() {
		return id;
	}

	/**
	 * Nastaví klíč záznamu.
	 * 
	 * @param id
	 *            Nový klíč záznamu.
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * Vrátí aktuální počet fází.
	 * 
	 * @return Počet fází.
	 */
	public int getPhasesCount() {
		return phases.size();
	}

	/**
	 * Vrátí kolekci všech variant nebezpečí, které se projevují celé životní
	 * etapě napříč všemi fázemi.
	 * 
	 * @return Kolekce závažných nebezpečí v životní etapě.
	 */
	public ArrayList<DangerVariant> getDangerVariants() {
		ArrayList<DangerVariant> variants = new ArrayList<DangerVariant>(10);

		for (int i = 0; i < getPhasesCount(); i++) {
			variants.addAll(phases.get(i).getVariants());
		}

		return variants;
	}
}
