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

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

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

/**
 * Třída reprezentující analýzu rizik. Představuje kontejner pro jednotlivé
 * záznamy.
 * 
 * @author Tomáš Neubauer
 */
public class Analysis {

	/**
	 * Uspořádaná kolekce záznamů analýzy.
	 */
	private ArrayList<AnalysisRecord> analysisRecords;

	/**
	 * Vytvoří analýzu a inicializuje kolekci záznamů.
	 */
	public Analysis() {
		analysisRecords = new ArrayList<AnalysisRecord>(10);
	}

	/**
	 * Přidá záznam do analýzy.
	 * 
	 * @param analysisRecord
	 *            Nová záznam analýzy.
	 */
	public void addAnalysisRecord(AnalysisRecord analysisRecord) {
		analysisRecords.add(analysisRecord);
	}

	/**
	 * Vrátí záznam analýzy, který se nachází v kolekci na pozici s daným
	 * indexem.
	 * 
	 * @param index
	 *            Index záznamu.
	 * @return Záznam analýzy na příslušné pozici.
	 */
	public AnalysisRecord getAnalysisRecord(int index) {
		return analysisRecords.get(index);
	}

	/**
	 * Vrátí aktuální počet záznamů.
	 * 
	 * @return Počet záznamů.
	 */
	public int getRecordsCount() {
		return analysisRecords.size();
	}

	/**
	 * Do systémové konzole vypíše informace o analýze - jednotlivé záznamy.
	 */
	public void printAnalysis() {
		int recordCount = analysisRecords.size();
		AnalysisRecord currentRecord;
		Component currentComponent;
		for (int i = 0; i < recordCount; i++) {
			currentRecord = analysisRecords.get(i);
			currentComponent = currentRecord.getComponent();
			System.out.println(currentComponent.getName() + "; "
					+ currentRecord.getComponent().getLocation() + "; "
					+ currentComponent.getDangersAsString());
		}
	}

	/**
	 * Uloží aktuální analýzu (záznamy) do daného textového souboru.
	 * 
	 * @param fileName
	 *            Cesta k textovému souboru.
	 */
	public void saveToFile(String fileName) {
		try {
			File file = new File(fileName);
			FileWriter fw = new FileWriter(file);
			BufferedWriter bw = new BufferedWriter(fw);

			int recordCount = analysisRecords.size();
			AnalysisRecord currentRecord;
			Component currentComponent;
			for (int i = 0; i < recordCount; i++) {
				currentRecord = analysisRecords.get(i);
				currentComponent = currentRecord.getComponent();
				bw.write(currentComponent.getName() + ";"
						+ currentRecord.getComponent().getLocation() + ";"
						+ currentComponent.getDangersAsString());
				bw.newLine();
			}

			bw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	/**
	 * Prohledá analýzu a vrátí kolekci variant nebezpečí, které jsou označeny
	 * jako závažné (kritické).
	 * 
	 * @return Kolekce závažných nebezpečí.
	 */
	public ArrayList<DangerVariant> getCriticalDangerVariants() {
		ArrayList<DangerVariant> criticalVariants = new ArrayList<DangerVariant>(
				100);

		int analysisRecordCount = getRecordsCount();
		Component currentComponent;
		for (int i = 0; i < analysisRecordCount; i++) {
			currentComponent = getAnalysisRecord(i).getComponent();
			ArrayList<DangerVariant> componentVariants = currentComponent
					.getDangerVariants();
			int dvc = componentVariants.size();
			DangerVariant dv;
			for (int j = 0; j < dvc; j++) {
				dv = componentVariants.get(j);
				if (dv.isCritical() && !criticalVariants.contains(dv)) {
					criticalVariants.add(dv);
				}
			}

		}

		return criticalVariants;
	}

}
