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

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

/**
 * Třída, která představuje správce životních etap stroje.
 * 
 * @author Tomáš Neubauer
 */
public class StageManager {

	/**
	 * Kolekce životních etap stroje.
	 */
	private ArrayList<Stage> stages;

	/**
	 * Vytvoří správce životních etap.
	 */
	public StageManager() {
		stages = new ArrayList<Stage>(5);
	}

	/**
	 * Načte výchozí etapy a jejich fáze z databáze prostřednictvím daného
	 * připojení.
	 * 
	 * @param connection
	 *            Připojení k databázi.
	 */
	public void loadFromDB(Connection connection) {
		if (connection != null) {
			Statement stmt;
			Statement stmt2;
			try {
				stmt = connection.createStatement();
				stmt2 = connection.createStatement();
				stmt
						.executeQuery("SELECT id, description FROM stage ORDER BY id");

				ResultSet rs = stmt.getResultSet();

				Stage currentStage;
				while (rs.next()) {
					currentStage = new Stage(rs.getInt("id"), rs
							.getString("description"));
					stmt2
							.executeQuery("SELECT pn.name as name FROM phase p JOIN phase_name pn on (p.phase_name_id = pn.id) WHERE p.stage_id = '"
									+ currentStage.getId()
									+ "' ORDER BY pn.id;");
					ResultSet rs2 = stmt2.getResultSet();
					Phase currentPhase;
					while (rs2.next()) {
						currentPhase = new Phase(currentStage, rs2
								.getString("name"));
						currentStage.addPhase(currentPhase);
					}
					stages.add(currentStage);
				}

				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * Vloží do kolekce novou životní etapu.
	 * 
	 * @param stage
	 *            Nová životní etapa.
	 */
	public void addStage(Stage stage) {
		stages.add(stage);
	}

	/**
	 * Vrátí životní etapu, která je v kolekci na pozici s daným indexem.
	 * 
	 * @param index
	 *            Index pozice životní etapy v kolekci.
	 * @return Životní etapa na dané pozici.
	 */
	public Stage getStage(int index) {
		return stages.get(index);
	}

	/**
	 * Odstraní životní etapu, která je v kolekci na pozici s daným indexem.
	 * 
	 * @param index
	 *            Index pozice životní etapy v kolekci.
	 */
	public void clear() {
		stages.clear();
	}

	/**
	 * Vrátí kolekci životních etap.
	 * 
	 * @return Kolekce životních etap.
	 */
	public ArrayList<Stage> getStages() {
		return stages;
	}

	/**
	 * Nastaví kolekci životních etap.
	 * 
	 * @param stages
	 *            Nová kolekce životních etap.
	 */
	public void setStages(ArrayList<Stage> stages) {
		this.stages = stages;
	}

}
