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

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

/**
 * @author Tomáš Neubauer
 */
public class DangerType {
	/**
	 * ID - hodnota primárního klíče posledního vkládaného zaáznamu v databázi.
	 * Sdílená promenná používaná pro generování klíče pro vkládání nového
	 * záznamu do tabulky v databázi.
	 */
	private static int last_insert_id = -1;

	/**
	 * Klíč záznamu v datavázi.
	 */
	private int id;

	/**
	 * Kód typu nebezpečí.
	 */
	private String code;

	/**
	 * Popis nebezpečí.
	 */
	private String description;

	/**
	 * Popis nebezpečné situace.
	 */
	private String situationDescription;

	/**
	 * Skupina nebezpečí, do které typ patří.
	 */
	private DangerGroup dangerGroup;

	/**
	 * Kolekce variant nebezpečí.
	 */
	private ArrayList<DangerVariant> variants;

	/**
	 * Sloupec v tisknuté tabulce.
	 */
	private String column_cast2_a1_1995, column_cast1_r1991,
			column_cast2_r1991, column_csn_en_iso_12100_1_2003,
			column_csn_en_iso_12100_2_2003, column_normy_typu_b,
			column_clanky_csn_en_12415_2001;

	/**
	 * Vytvoří nový typ nebezpečí s danými atributy.
	 * 
	 * @param dangerGroup
	 *            Skupina, do které typ patří.
	 * @param id
	 *            Klíč záznamu v databázi.
	 * @param code
	 *            Kód typu nebezpečí.
	 * @param description
	 *            Popis nebezpečí.
	 * @param column_cast2_a1_1995
	 *            Sloupec v tištěné tabulce.
	 * @param column_cast1_r1991
	 *            Sloupec v tištěné tabulce.
	 * @param column_cast2_r1991
	 *            Sloupec v tištěné tabulce.
	 * @param column_csn_en_iso_12100_1_2003
	 *            Sloupec v tištěné tabulce.
	 * @param column_csn_en_iso_12100_2_2003
	 *            Sloupec v tištěné tabulce.
	 * @param column_normy_typu_b
	 *            Sloupec v tištěné tabulce.
	 * @param column_clanky_csn_en_12415_2001
	 *            Sloupec v tištěné tabulce.
	 * @param situationDescription
	 *            Popis nebezpečné situace.
	 */
	public DangerType(DangerGroup dangerGroup, int id, String code,
			String description, String column_cast2_a1_1995,
			String column_cast1_r1991, String column_cast2_r1991,
			String column_csn_en_iso_12100_1_2003,
			String column_csn_en_iso_12100_2_2003, String column_normy_typu_b,
			String column_clanky_csn_en_12415_2001, String situationDescription) {
		this.id = id;
		this.code = code;
		this.description = description;
		this.dangerGroup = dangerGroup;
		this.column_cast2_a1_1995 = column_cast2_a1_1995;
		this.column_cast1_r1991 = column_cast1_r1991;
		this.column_cast2_r1991 = column_cast2_r1991;
		this.column_csn_en_iso_12100_1_2003 = column_csn_en_iso_12100_1_2003;
		this.column_csn_en_iso_12100_2_2003 = column_csn_en_iso_12100_2_2003;
		this.column_normy_typu_b = column_normy_typu_b;
		this.column_clanky_csn_en_12415_2001 = column_clanky_csn_en_12415_2001;
		this.situationDescription = situationDescription;
		variants = new ArrayList<DangerVariant>(10);
	}

	/**
	 * Vrází kód typu nebezpečí.
	 * 
	 * @return Kód typu nebezpečí.
	 */
	public String getCode() {
		return code;
	}

	/**
	 * Nastaví kód typu nebezpečí.
	 * 
	 * @param code
	 *            Nový kód typu nebezpečí.
	 */
	public void setCode(String code) {
		this.code = code;
	}

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

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

	/**
	 * Vrátí kolekci variant nebezpečí, které patří do typu.
	 * 
	 * @return Kolekce variant nebezpečí.
	 */
	public ArrayList<DangerVariant> getVariants() {
		return variants;
	}

	/**
	 * Nastaví varianty nebezpečí patřící typu.
	 * 
	 * @param variants
	 *            Nová kolekce variant nebezpečí.
	 */
	public void setVariants(ArrayList<DangerVariant> variants) {
		this.variants = variants;
	}

	/**
	 * Vrátí skupinu nebezpečí, do které typ patří.
	 * 
	 * @return Skupina nebezpečí, do které typ patří.
	 */
	public DangerGroup getDangerGroup() {
		return dangerGroup;
	}

	/**
	 * Nastaví skupinu nebezpečí, do které typ patří.
	 * 
	 * @param dangerGroup
	 *            Nová skupina, do které typ patří.
	 */
	public void setDangerGroup(DangerGroup dangerGroup) {
		this.dangerGroup = dangerGroup;
	}

	/**
	 * 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;
	}

	/**
	 * Uloží záznam do databáze prostřednictvím daného připojení. Pokud se v
	 * tabulce záznam s daným klíčem nachází, pouze jej aktualizuje (UPDATE),
	 * jinak se do tabulky vloží nový záznam (INSERT).
	 * 
	 * @param connection
	 *            Připojení k databázi.
	 */
	public void saveToDB(Connection connection) {
		if (connection != null) {
			String a = "";
			try {
				Statement stmt = connection.createStatement();
				if (last_insert_id < 1) {
					stmt.executeQuery("SELECT max(id) FROM danger_type;");
					ResultSet rs = stmt.getResultSet();
					if (rs.next()) {
						last_insert_id = rs.getInt(1);
					}
				}

				stmt
						.executeQuery("SELECT count(id) as count FROM danger_type WHERE id = '"
								+ id + "';");
				ResultSet rs1 = stmt.getResultSet();
				if (rs1.next() && rs1.getInt(1) == 0) {
					stmt.executeUpdate(a = "INSERT INTO danger_type VALUES ("
							+ (last_insert_id > 0 ? "'" + (++last_insert_id)
									+ "'" : "LAST_INSERT_ID()") + ", " + "'"
							+ dangerGroup.getId() + "', " + "'" + code + "', "
							+ "'" + description + "', " + "'"
							+ column_cast2_a1_1995 + "', " + "'"
							+ column_cast1_r1991 + "', " + "'"
							+ column_cast2_r1991 + "', " + "'"
							+ column_csn_en_iso_12100_1_2003 + "', " + "'"
							+ column_csn_en_iso_12100_2_2003 + "', " + "'"
							+ column_normy_typu_b + "', " + "'"
							+ column_clanky_csn_en_12415_2001 + "'," + "'"
							+ situationDescription + "');",
							Statement.RETURN_GENERATED_KEYS);
					ResultSet rs = stmt.getGeneratedKeys();
					if (rs.next()) {
						id = rs.getInt(1);
						last_insert_id = id;
					}
				} else {

					stmt
							.executeUpdate("UPDATE danger_type SET danger_group_id='"
									+ dangerGroup.getId()
									+ "', code = '"
									+ code
									+ "', description = '"
									+ description
									+ "', "
									+ "column_cast2_a1_1995 = '"
									+ column_cast2_a1_1995
									+ "',"
									+ "column_cast1_r1991 = '"
									+ column_cast1_r1991
									+ "',"
									+ "column_cast2_r1991 = '"
									+ column_cast2_r1991
									+ "',"
									+ "column_csn_en_iso_12100_1_2003 = '"
									+ column_csn_en_iso_12100_1_2003
									+ "',"
									+ "column_csn_en_iso_12100_2_2003 = '"
									+ column_csn_en_iso_12100_2_2003
									+ "',"
									+ "column_normy_typu_b = '"
									+ column_normy_typu_b
									+ "',"
									+ "column_clanky_csn_en_12415_2001 = '"
									+ column_clanky_csn_en_12415_2001
									+ "',"
									+ "situation_description = '"
									+ situationDescription
									+ "' WHERE id='"
									+ id + "';");
				}
				stmt.close();
			} catch (SQLException e) {
				System.err.println(a);
				e.printStackTrace();
			}
		}
	}

	/**
	 * Smaže záznam z databáze prostřednictvím daného připojení a zruší
	 * instanci.
	 * 
	 * @param connection
	 *            Připojení k databázi.
	 */
	public void deleteFromDB(Connection connection) {
		if (connection != null) {
			// smazání variant
			for (int i = 0; i < variants.size(); i++) {
				variants.get(i).deleteFromDB(connection);
			}

			Statement stmt;
			try {
				stmt = connection.createStatement();

				stmt.executeUpdate("DELETE FROM danger_type WHERE id = '" + id
						+ "';");
				stmt.close();
				finalize();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Throwable e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * Vložení nové varianty do typu nebezpečí.
	 * 
	 * @param dangerVariant
	 *            Nová varianta typu nebezpečí.
	 */
	public void addDangerVariant(DangerVariant dangerVariant) {
		variants.add(dangerVariant);
	}

	/**
	 * Vrátí počet variant, které patří do typu.
	 * 
	 * @return Počet variant typu nebezpečí.
	 */
	public int getDangerVariantCount() {
		return variants.size();
	}

	/**
	 * Vrází variantu typu nebezpečí na pozici s daným indexem.
	 * 
	 * @param index
	 *            Index pozice varianty typu nebezpečí.
	 * @return Varianta typu nebezpečí na dané pozici.
	 */
	public DangerVariant getDangerVariant(int index) {
		return variants.get(index);
	}

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

	/**
	 * Vrátí hodnotu daného sloupce v tištěné tabulce.
	 * 
	 * @return Hodnota ve sloupci v tištěné tabulce.
	 */
	public String getColumn_cast2_a1_1995() {
		return column_cast2_a1_1995;
	}

	/**
	 * Nastaví hodnotu daného sloupce v tištěné tabulce.
	 * 
	 * @param column_cast2_a1_1995
	 *            Hodnota daného sloupce.
	 */
	public void setColumn_cast2_a1_1995(String column_cast2_a1_1995) {
		this.column_cast2_a1_1995 = column_cast2_a1_1995;
	}

	/**
	 * Vrátí hodnotu daného sloupce v tištěné tabulce.
	 * 
	 * @return Hodnota ve sloupci v tištěné tabulce.
	 */
	public String getColumn_cast1_r1991() {
		return column_cast1_r1991;
	}

	/**
	 * Nastaví hodnotu daného sloupce v tištěné tabulce.
	 * 
	 * @param column_cast1_r1991
	 *            Hodnota daného sloupce.
	 */
	public void setColumn_cast1_r1991(String column_cast1_r1991) {
		this.column_cast1_r1991 = column_cast1_r1991;
	}

	/**
	 * Vrátí hodnotu daného sloupce v tištěné tabulce.
	 * 
	 * @return Hodnota ve sloupci v tištěné tabulce.
	 */
	public String getColumn_cast2_r1991() {
		return column_cast2_r1991;
	}

	/**
	 * Nastaví hodnotu daného sloupce v tištěné tabulce.
	 * 
	 * @param column_cast2_r1991
	 *            Hodnota daného sloupce.
	 */
	public void setColumn_cast2_r1991(String column_cast2_r1991) {
		this.column_cast2_r1991 = column_cast2_r1991;
	}

	/**
	 * Vrátí hodnotu daného sloupce v tištěné tabulce.
	 * 
	 * @return Hodnota ve sloupci v tištěné tabulce.
	 */
	public String getColumn_csn_en_iso_12100_1_2003() {
		return column_csn_en_iso_12100_1_2003;
	}

	/**
	 * Nastaví hodnotu daného sloupce v tištěné tabulce.
	 * 
	 * @param column_csn_en_iso_12100_1_2003
	 *            Hodnota daného sloupce.
	 */
	public void setColumn_csn_en_iso_12100_1_2003(
			String column_csn_en_iso_12100_1_2003) {
		this.column_csn_en_iso_12100_1_2003 = column_csn_en_iso_12100_1_2003;
	}

	/**
	 * Vrátí hodnotu daného sloupce v tištěné tabulce.
	 * 
	 * @return Hodnota ve sloupci v tištěné tabulce.
	 */
	public String getColumn_csn_en_iso_12100_2_2003() {
		return column_csn_en_iso_12100_2_2003;
	}

	/**
	 * Nastaví hodnotu daného sloupce v tištěné tabulce.
	 * 
	 * @param column_csn_en_iso_12100_2_2003
	 *            Hodnota daného sloupce.
	 */
	public void setColumn_csn_en_iso_12100_2_2003(
			String column_csn_en_iso_12100_2_2003) {
		this.column_csn_en_iso_12100_2_2003 = column_csn_en_iso_12100_2_2003;
	}

	/**
	 * Vrátí hodnotu daného sloupce v tištěné tabulce.
	 * 
	 * @return Hodnota ve sloupci v tištěné tabulce.
	 */
	public String getColumn_normy_typu_b() {
		return column_normy_typu_b;
	}

	/**
	 * Nastaví hodnotu daného sloupce v tištěné tabulce.
	 * 
	 * @param column_normy_typu_b
	 *            Hodnota daného sloupce.
	 */
	public void setColumn_normy_typu_b(String column_normy_typu_b) {
		this.column_normy_typu_b = column_normy_typu_b;
	}

	/**
	 * Vrátí hodnotu daného sloupce v tištěné tabulce.
	 * 
	 * @return Hodnota ve sloupci v tištěné tabulce.
	 */
	public String getColumn_clanky_csn_en_12415_2001() {
		return column_clanky_csn_en_12415_2001;
	}

	/**
	 * Nastaví hodnotu daného sloupce v tištěné tabulce.
	 * 
	 * @param column_clanky_csn_en_12415_2001
	 *            Hodnota daného sloupce.
	 */
	public void setColumn_clanky_csn_en_12415_2001(
			String column_clanky_csn_en_12415_2001) {
		this.column_clanky_csn_en_12415_2001 = column_clanky_csn_en_12415_2001;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof DangerType) {
			return ((DangerType) obj).getId() == id;
		}
		return false;
	}

	/**
	 * Vrátí popis nebezpečné situace.
	 * 
	 * @return Popis nebezpečné situace.
	 */
	public String getSituationDescription() {
		return situationDescription;
	}

	/**
	 * Nastaví popis nebezpečné situace.
	 * 
	 * @param situationDescription
	 *            Nový popis nebezpečné situace.
	 */
	public void setSituationDescription(String situationDescription) {
		this.situationDescription = situationDescription;
	}
}
