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

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

import javax.xml.xpath.XPathConstants;

import org.w3c.dom.NodeList;

import cz.neubauer.tomas.hazardanalysis.model.XMLReader;
import cz.neubauer.tomas.hazardanalysis.model.analysis.Analysis;
import cz.neubauer.tomas.hazardanalysis.model.analysis.AnalysisRecord;
import cz.neubauer.tomas.hazardanalysis.model.components.Component;
import cz.neubauer.tomas.hazardanalysis.model.components.ComponentCatalog;
import cz.neubauer.tomas.hazardanalysis.viewcontroller.MainFrame;

/**
 * Hlavní třída aplikace. Stará se o spuštění aplikace.
 * 
 * @author Tomáš Neubauer
 */
public class Rizika {
	/**
	 * Katalog komponent.
	 */
	private ComponentCatalog componentCatalog;

	/**
	 * Připojení k databázi.
	 */
	private Connection connection;

	/**
	 * Vytvoří aplikaci, vytvoří připojení k databázi na základě konfiguračního
	 * souboru <i>./conf/db.conf</i>, načte z databáze datový model (katalog
	 * komponent včetně hierarchie nebezpečí).
	 */
	public Rizika() {
		try {
			DriverManager.registerDriver(new com.mysql.jdbc.Driver());

			String configurationFile = "conf/db.conf";

			String host = (String) XMLReader.readXML(configurationFile,
					"/connection/host", XPathConstants.STRING);
			String port = (String) XMLReader.readXML(configurationFile,
					"/connection/port", XPathConstants.STRING);
			String schema = (String) XMLReader.readXML(configurationFile,
					"/connection/schema", XPathConstants.STRING);
			String username = (String) XMLReader.readXML(configurationFile,
					"/connection/username", XPathConstants.STRING);
			String password = (String) XMLReader.readXML(configurationFile,
					"/connection/password", XPathConstants.STRING);

			Properties info = new Properties();
			info.put("user", username);
			info.put("password", password);
			info.put("characterEncoding", "utf8");

			connection = DriverManager.getConnection("jdbc:mysql://" + host
					+ ":" + port + "/" + schema + "", info);

			componentCatalog = new ComponentCatalog();
			componentCatalog.loadFromDB(connection);

			new MainFrame(this);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Spouštěcí metoda - vstupní bod programu. Vytvoří instanci aplikace.
	 * 
	 * @param args
	 *            Parametry příkazové řádky (nejsou použity).
	 */
	public static void main(String[] args) {
		new Rizika();
	}

	/**
	 * Vytvoří analýzu z diagramu uloženého v souboru na daném URI.
	 * 
	 * @param xmlFileURI
	 *            URI souboru obsahující diagram (XML).
	 * @return Analýza, vytvořená na základě diagramu.
	 */
	public Analysis createAnalysis(String xmlFileURI) {
		// nacteni komponent konkretniho diagramu
		NodeList nl = (NodeList) XMLReader.readXML(xmlFileURI,
				"/VisioDocument/Masters/Master/@NameU", XPathConstants.NODESET);
		if (nl == null) {
			return null;
		}

		Analysis analysis = new Analysis();
		String currentComponentNode;
		Component currentComponent;
		for (int i = 0; i < nl.getLength(); i++) {
			currentComponentNode = nl.item(i).getNodeValue();
			currentComponent = componentCatalog
					.getComponentByName(currentComponentNode);
			if (currentComponent != null) {
				AnalysisRecord analysisRecord = new AnalysisRecord(
						currentComponent);
				analysis.addAnalysisRecord(analysisRecord);
			}
		}
		return analysis;
	}

	/**
	 * Vrací aktuální katalog komponent.
	 * 
	 * @return Katalog komponent.
	 */
	public ComponentCatalog getComponentCatalog() {
		return componentCatalog;
	}

	/**
	 * Vrací připojení k databázi.
	 * 
	 * @return Připojení k databázi.
	 */
	public Connection getConnection() {
		return connection;
	}

	/**
	 * Aktualizuje katalog komponent - znovu načte z databáze.
	 */
	public void refresh() {
		componentCatalog.loadFromDB(connection);
	}
}
