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

/**
 * Třída reprezentující skupinu nebezpečí.
 * 
 * @author Tomáš Neubauer
 */
public class DangerGroup {
	/**
	 * 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;

	/**
	 * Název skupiny.
	 */
	private String name;

	/**
	 * Kolekce typů nebezpečí, které patří do skupiny.
	 */
	private ArrayList<DangerType> types;

	/**
	 * Vytvoří novou skupinu nebezpečí s danými atributy.
	 * 
	 * @param id
	 *            Klíč záznamu v datavázi.
	 * @param name
	 *            Název skupiny.
	 */
	public DangerGroup(int id, String name) {
		this.id = id;
		this.name = name;
		types = new ArrayList<DangerType>(10);
	}

	/**
	 * Vrátí název skupiny.
	 * 
	 * @return Název skupiny.
	 */
	public String getName() {
		return name;
	}

	/**
	 * Nastaví název skupiny.
	 * 
	 * @param name
	 *            Nový název skupiny.
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * Vloží do skupiny nový typ nebezpečí.
	 * 
	 * @param dangerType
	 *            Vkládaný typ nebezpečí.
	 */
	public void addDangerType(DangerType dangerType) {
		types.add(dangerType);
	}

	/**
	 * Vrátí typ nebezpečí na pozici s daným indexem.
	 * 
	 * @param index
	 *            Index pozice typu nebezpečí.
	 * @return Typ nebezpečí na dané pozici.
	 */
	public DangerType getDangerType(int index) {
		return types.get(index);
	}

	/**
	 * Vrátí počet typů nebezpečí, které patří do skupiny.
	 * 
	 * @return Počet typů nebezpečí.
	 */
	public int getDangerTypeCount() {
		return types.size();
	}

	/**
	 * 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) {
			try {
				Statement stmt = connection.createStatement();
				if (last_insert_id < 1) {
					stmt.executeQuery("SELECT max(id) FROM danger_group;");
					ResultSet rs = stmt.getResultSet();
					if (rs.next()) {
						last_insert_id = rs.getInt(1);
					}
				}
				stmt
						.executeQuery("SELECT count(id) as count FROM danger_group WHERE id = '"
								+ id + "';");
				ResultSet rs1 = stmt.getResultSet();
				if (rs1.next() && rs1.getInt(1) == 0) {
					stmt.executeUpdate("INSERT INTO danger_group VALUES ("
							+ (last_insert_id > 0 ? "'" + (++last_insert_id)
									+ "'" : "LAST_INSERT_ID()") + ", '" + name
							+ "');", Statement.RETURN_GENERATED_KEYS);
					ResultSet rs = stmt.getGeneratedKeys();
					if (rs.next()) {
						id = rs.getInt(1);
						last_insert_id = id;
					}
				} else {
					stmt.executeUpdate("UPDATE danger_group SET name='" + name
							+ "' WHERE id='" + id + "';");
				}
				stmt.close();
			} catch (SQLException e) {
				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) {
			try {
				// smazání všech typů, které patří do skupiny
				for (int i = 0; i < types.size(); i++) {
					types.get(i).deleteFromDB(connection);
				}

				// vlastní smazání skupiny
				Statement stmt = connection.createStatement();
				stmt.executeUpdate("DELETE FROM danger_group WHERE id = '" + id
						+ "';");

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

		}
	}

	/**
	 * 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í kolekci typů nebezpečí, které patří do skupiny.
	 * 
	 * @return Kolekce typů nebezpečí.
	 */
	public ArrayList<DangerType> getTypes() {
		return types;
	}

	/**
	 * Nastaví novou kolekci typů nebezpečí.
	 * 
	 * @param types
	 *            Nová kolekce typů nebezpečí.
	 */
	public void setTypes(ArrayList<DangerType> types) {
		this.types = types;
	}

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

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