/**
 * @author Coder ACJHP
 * @Email [email protected]
 * @Date 15/07/2017
 */
package com.coder.hms.connection;

import java.awt.Toolkit;
import java.sql.Connection;
import java.sql.SQLException;

import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;

import com.coder.hms.entities.Company;
import com.coder.hms.entities.Customer;
import com.coder.hms.entities.Hotel;
import com.coder.hms.entities.HotelSystemStatus;
import com.coder.hms.entities.Payment;
import com.coder.hms.entities.Posting;
import com.coder.hms.entities.Reservation;
import com.coder.hms.entities.Room;
import com.coder.hms.entities.User;
import com.coder.hms.ui.external.InformationFrame;

public class DataSourceFactory {

	private static SessionFactory sessionFactory = null;

	public DataSourceFactory() {}

	public static void createConnection() {
		try {

				sessionFactory = new Configuration().configure("com/coder/hms/connection/hibernate.cfg.xml")
						.addAnnotatedClass(Reservation.class)
						.addAnnotatedClass(Company.class)
						.addAnnotatedClass(Customer.class)
						.addAnnotatedClass(Hotel.class)
						.addAnnotatedClass(HotelSystemStatus.class)
						.addAnnotatedClass(Payment.class)
						.addAnnotatedClass(Posting.class)
						.addAnnotatedClass(Room.class)
						.addAnnotatedClass(User.class)
						.buildSessionFactory();

		} catch (HibernateException e) {
			Toolkit.getDefaultToolkit().beep();
			final InformationFrame dialog = new InformationFrame();
			dialog.setMessage("Sorry we can't connect to database right now, without "
					+ "connection the application will not work properly.");
			dialog.okBtn.addActionListener(ActionListener->{
				return;
			});
			dialog.setVisible(true);
		}
	}

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

        //replacement connection for old types like java.sql.Connection.
	public Connection getSqlConnection() {
		Connection connection = null;
		try {
			connection = getSessionFactory().
					getSessionFactoryOptions().getServiceRegistry().
					getService(ConnectionProvider.class).getConnection();
		} catch (SQLException e) {
			final InformationFrame INFORMATION_FRAME = new InformationFrame();
			INFORMATION_FRAME.setMessage("Connection converting error!\n" +e.getLocalizedMessage());
			INFORMATION_FRAME.setVisible(true);
		}
		return connection;
	}
	
	public Transaction getTransaction() {
		return getSessionFactory().openSession().beginTransaction();
	}
	
	public void shutDown() {
		if(sessionFactory != null && sessionFactory.isOpen())
                        sessionFactory.close();
	}
}