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

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import cz.neubauer.tomas.hazardanalysis.Rizika;
import cz.neubauer.tomas.hazardanalysis.model.stages.VariantStage;

/**
 * Třída, která představuje kontejner pro data pro jeden formulář analýzy, která
 * jsou zobrazena na formuláři <code>DangerEstimationFrame</code>.
 * 
 * @author Tomáš Neubauer
 */
public class DangerEstimationBacking {

	/**
	 * Klíč posledního vloženého záznamu historie v databázi.
	 */
	private static int last_insert_id = -1;

	/**
	 * Reference na objekt aplikace.
	 */
	private Rizika application;

	/**
	 * Kombinace varianty nebezpečí a životní etapy stroje, pro kterou existuje
	 * formulář.
	 */
	private VariantStage variantStage;

	/**
	 * Nebezpeční prostor.
	 */
	private String dangerArea;

	/**
	 * Ohrožené osoby.
	 */
	private String persons;

	/**
	 * Popis nebezpečné situace/události.
	 */
	private String dangerEventDescription;

	/**
	 * Popis protiopatření v kroku 1.
	 */
	private String counterAct1;

	/**
	 * Popis protiopatření v kroku 2.
	 */
	private String counterAct2;

	/**
	 * Popis protiopatření v kroku 3.
	 */
	private String counterAct3;

	/**
	 * Provozní stav stroje (index položky v číselníku).
	 */
	private int state;

	/**
	 * Pole obsahující stavy číselníků na počítadle míry rizika.
	 */
	private int[] step0, step1, step2, step3;

	/**
	 * Vytvoří kontejner.
	 * 
	 * @param application
	 *            Reference na objekt aplikace.
	 */
	public DangerEstimationBacking(Rizika application) {
		this.application = application;
		variantStage = null;
		dangerArea = "";
		persons = "";
		state = 0;
		dangerEventDescription = "";
		counterAct1 = "";
		counterAct2 = "";
		counterAct3 = "";
		step0 = new int[4];
		step1 = new int[4];
		step2 = new int[4];
		step3 = new int[4];
	}

	/**
	 * Vrátí kombinaci varianty nebezpečí a životní etapy stroje.
	 * 
	 * @return Kombinace varianty a etapy.
	 */
	public VariantStage getVariantStage() {
		return variantStage;
	}

	/**
	 * Nastaví kombinaci varianty nebezpečí a životní etapy stroje.
	 * 
	 * @param variantStage
	 *            Nová kombinace varianty a etapy .
	 */
	public void setVariantStage(VariantStage variantStage) {
		this.variantStage = variantStage;
		int dangerVariantId = variantStage.getDangerVariant().getId();

		try {
			Statement stmt = application.getConnection().createStatement();

			stmt
					.executeQuery("SELECT * FROM history WHERE danger_variant_id = '"
							+ dangerVariantId + "';");

			ResultSet rs = stmt.getResultSet();

			if (rs.next()) {
				setDangerArea(rs.getString("area"));
				setPersons(rs.getString("persons"));
				setDangerEventDescription(rs.getString("event"));
				setCounterAct1(rs.getString("step1"));
				setCounterAct2(rs.getString("step2"));
				setCounterAct3(rs.getString("step3"));
				step0[0] = rs.getInt("s0");
				step1[0] = rs.getInt("s1");
				step2[0] = rs.getInt("s2");
				step3[0] = rs.getInt("s3");
				step0[1] = rs.getInt("a0");
				step1[1] = rs.getInt("a1");
				step2[1] = rs.getInt("a2");
				step3[1] = rs.getInt("a3");
				step0[2] = rs.getInt("e0");
				step1[2] = rs.getInt("e1");
				step2[2] = rs.getInt("e2");
				step3[2] = rs.getInt("e3");
				step0[3] = rs.getInt("w0");
				step1[3] = rs.getInt("w1");
				step2[3] = rs.getInt("w2");
				step3[3] = rs.getInt("w3");
			} else {

				if (stmt.execute("select max(id) as id from history;")) {
					ResultSet res = stmt.getResultSet();
					if (res.next()) {
						last_insert_id = res.getInt("id");
					}
				}

				application
						.getConnection()
						.createStatement()
						.executeUpdate(
								"INSERT INTO history VALUES ("
										+ (last_insert_id > 0 ? ++last_insert_id
												: "1")
										+ ", '"
										+ dangerVariantId
										+ "','','','','','','',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);");
			}
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Uloží aktuální data formuláře do historie (databézové tabulky).
	 */
	public void saveHistory() {
		int dangerVariantId = variantStage.getDangerVariant().getId();

		try {
			Statement stmt = application.getConnection().createStatement();
			stmt.executeUpdate("UPDATE history SET area='" + getDangerArea()
					+ "', persons='" + getPersons() + "',  event='"
					+ getDangerEventDescription() + "', step1='"
					+ getCounterAct1() + "', step2='" + getCounterAct2()
					+ "', step3='" + getCounterAct3() + "', s0='" + step0[0]
					+ "', s1='" + step1[0] + "', s2='" + step2[0] + "', s3='"
					+ step3[0] + "', a0='" + step0[1] + "', a1='" + step1[1]
					+ "', a2='" + step2[1] + "', a3='" + step3[1] + "', e0='"
					+ step0[2] + "', e1='" + step1[2] + "', e2='" + step2[2]
					+ "', e3='" + step3[2] + "', w0='" + step0[3] + "', w1='"
					+ step1[3] + "', w2='" + step2[3] + "', w3='" + step3[3]
					+ "' WHERE danger_variant_id='" + dangerVariantId + "';");

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

	/**
	 * Vrátí nebezpečný prostor.
	 * 
	 * @return Nebezpečný prostor.
	 */
	public String getDangerArea() {
		return dangerArea;
	}

	/**
	 * Nastaví nebezpečný prostor.
	 * 
	 * @param dangerArea
	 *            Nový nebezpečný prostor.
	 */
	public void setDangerArea(String dangerArea) {
		this.dangerArea = dangerArea;
	}

	/**
	 * Vrátí ohrožené osoby.
	 * 
	 * @return Ohrožené osoby.
	 */
	public String getPersons() {
		return persons;
	}

	/**
	 * Nastaví ohrožené osoby.
	 * 
	 * @param persons
	 *            Nové ohrožené osoby.
	 */
	public void setPersons(String persons) {
		this.persons = persons;
	}

	/**
	 * Vrátí provozní stav stroje.
	 * 
	 * @return Provozní stav stroje.
	 */
	public int getState() {
		return state;
	}

	/**
	 * Nastaví provozní stav stroje (index položky číselníku).
	 * 
	 * @param state
	 *            Nový provozní stav stroje.
	 */
	public void setState(int state) {
		this.state = state;
	}

	/**
	 * Vrátí popis nebezpečné situace/události.
	 * 
	 * @return Popis nebezpečné situace/události.
	 */
	public String getDangerEventDescription() {
		return dangerEventDescription;
	}

	/**
	 * Nastaví popis nebezpečné situace/události.
	 * 
	 * @param dangerEventDescription
	 *            Nový popis nebezpečné situace/události.
	 */
	public void setDangerEventDescription(String dangerEventDescription) {
		this.dangerEventDescription = dangerEventDescription;
	}

	/**
	 * Vrátí protiopatření v kroku 1.
	 * 
	 * @return Protipatření.
	 */
	public String getCounterAct1() {
		return counterAct1;
	}

	/**
	 * Nastaví protipopatření v kroku 1.
	 * 
	 * @param counterAct1
	 *            Nové protiopatření.
	 */
	public void setCounterAct1(String counterAct1) {
		this.counterAct1 = counterAct1;
	}

	/**
	 * Vrátí protiopatření v kroku 2.
	 * 
	 * @return Protipatření.
	 */
	public String getCounterAct2() {
		return counterAct2;
	}

	/**
	 * Nastaví protipopatření v kroku 2.
	 * 
	 * @param counterAct1
	 *            Nové protiopatření.
	 */
	public void setCounterAct2(String counterAct2) {
		this.counterAct2 = counterAct2;
	}

	/**
	 * Vrátí protiopatření v kroku 3.
	 * 
	 * @return Protipatření.
	 */
	public String getCounterAct3() {
		return counterAct3;
	}

	/**
	 * Nastaví protipopatření v kroku 3.
	 * 
	 * @param counterAct1
	 *            Nové protiopatření.
	 */
	public void setCounterAct3(String counterAct3) {
		this.counterAct3 = counterAct3;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return variantStage.toString();
	}

	/**
	 * Vrátí pole s hodnotami číselníků v počítadle míry počátečního rizika.
	 * 
	 * @return Pole s hodnotami číselníků v počítadle míry počátečního rizika.
	 */
	public int[] getStep0() {
		return step0;
	}

	/**
	 * Nastaví pole s hodnotami číselníků v počítadle míry počátečního rizika.
	 * 
	 * @param step0
	 *            Pole s hodnotami číselníků v počítadle míry počátečního
	 *            rizika.
	 */
	public void setStep0(int[] step0) {
		this.step0 = step0;
	}

	/**
	 * Vrátí pole s hodnotami číselníků v počítadle míry rizika v kroku 1.
	 * 
	 * @return Pole s hodnotami číselníků v počítadle míry rizika v kroku 1.
	 */
	public int[] getStep1() {
		return step1;
	}

	/**
	 * Nastaví pole s hodnotami číselníků v počítadle míry rizika v kroku 1.
	 * 
	 * @param step1
	 *            Pole s hodnotami číselníků v počítadle míry rizika v kroku 1.
	 */
	public void setStep1(int[] step1) {
		this.step1 = step1;
	}

	/**
	 * Vrátí pole s hodnotami číselníků v počítadle míry rizika v kroku 2.
	 * 
	 * @return Pole s hodnotami číselníků v počítadle míry rizika v kroku 2.
	 */
	public int[] getStep2() {
		return step2;
	}

	/**
	 * Nastaví pole s hodnotami číselníků v počítadle míry rizika v kroku 2.
	 * 
	 * @param step2
	 *            Pole s hodnotami číselníků v počítadle míry rizika v kroku 2.
	 */
	public void setStep2(int[] step2) {
		this.step2 = step2;
	}

	/**
	 * Vrátí pole s hodnotami číselníků v počítadle míry rizika v kroku 3.
	 * 
	 * @return Pole s hodnotami číselníků v počítadle míry rizika v kroku 3.
	 */
	public int[] getStep3() {
		return step3;
	}

	/**
	 * Nastaví pole s hodnotami číselníků v počítadle míry rizika v kroku 3.
	 * 
	 * @param step3
	 *            Pole s hodnotami číselníků v počítadle míry rizika v kroku 3.
	 */
	public void setStep3(int[] step3) {
		this.step3 = step3;
	}

}
