package nl.askesis;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.HashMap;


public class Application {

	/**
	 * @param args
	 */
	public static void main(String[] args) {		
		
		Timestamp startTime = new Timestamp(System.currentTimeMillis());			
		System.err.println( "Conversion started: " + startTime);
		
		try{
			Class.forName("org.postgresql.Driver");
			Connection connection = DriverManager.getConnection("jdbc:postgresql://Panoramix.Askesis.nl:5432/muntdev?prepareThreshold=1","postgres", "");		
						
			Statement titlesSelectStatement = connection.createStatement();
			ResultSet titlesResultSet = titlesSelectStatement .executeQuery("select objectid, code from prototype.titles");			
			HashMap<String,String> titles = new HashMap<String,String>();
			while( titlesResultSet.next() ){
				titles.put(titlesResultSet.getString(2),titlesResultSet.getString(1));
			}			
			titlesSelectStatement.close();
			
			Statement currenciesSelectStatement = connection.createStatement();
			ResultSet currenciesResultSet = currenciesSelectStatement.executeQuery("select objectid, code from prototype.currencies");			
			HashMap<String,String> currencies = new HashMap<String,String>();
			while( currenciesResultSet.next() ){
				currencies.put(currenciesResultSet.getString(2),currenciesResultSet.getString(1));
			}			
			currenciesSelectStatement.close();
			
			Statement deliveryTermsSelectStatement = connection.createStatement();
			ResultSet deliveryTermsResultSet = deliveryTermsSelectStatement.executeQuery("select objectid, deliveryconditioncode from prototype.deliveryterms ");			
			HashMap<String,String> deliveryTerms = new HashMap<String,String>();
			while( deliveryTermsResultSet.next() ){
				deliveryTerms.put(deliveryTermsResultSet.getString(2),deliveryTermsResultSet.getString(1));
			}			
			deliveryTermsSelectStatement.close();
			
			Statement paymentTermsSelectStatement = connection.createStatement();
			ResultSet paymentTermsResultSet = paymentTermsSelectStatement.executeQuery("select objectid, paymentconditioncode from prototype.paymentterms");			
			HashMap<String,String> paymentTerms= new HashMap<String,String>();
			while( paymentTermsResultSet.next() ){
				paymentTerms.put(paymentTermsResultSet.getString(2),paymentTermsResultSet.getString(1));
			}			
			paymentTermsSelectStatement.close();			
			
			System.err.println("We got the infra");
			
			connection.setAutoCommit(false);
			
			Statement customersSelectStatement = connection.createStatement();
			ResultSet customersResultSet = customersSelectStatement.executeQuery("select klantnummer, titelatuurcode, valuta_code, leveringsconditie, betalingsconditie from odbc.klt_alg");
			
			System.err.println("We got the customers");
			
			PreparedStatement customersUpdateStatement = 
			connection.prepareStatement("update prototype.customers set title=? , defaultcurrency=?, defaulttermsofdelivery=?, defaulttermsofpayment=? where customernumber=?");
					
			int record = 0;
			while( customersResultSet.next() )
			{
				if( (++record % 5) == 0){
					System.err.println( "Handling batch record: " + record);
					// For debugging purposes we bail out after 4 instead of all 1.100.0000 customers
					break;
				}
				
				Integer customerNumber = customersResultSet.getInt(1);
				String titleObjectId = "";//= titles.get(customersResultSet.getString(2));
				String currencyObjectId = "";//currencies.get(customersResultSet.getString(3));
				String deliveryTermsObjectId = "";//deliveryTerms.get(customersResultSet.getString(4));
				String paymentTermsObjectId = "";//paymentTerms.get(customersResultSet.getString(5));
								
				customersUpdateStatement.setInt(1,customerNumber);
				customersUpdateStatement.setString(2,titleObjectId);				
				customersUpdateStatement.setString(3,currencyObjectId);
				customersUpdateStatement.setString(4,deliveryTermsObjectId);
				customersUpdateStatement.setString(5,paymentTermsObjectId);				
				
				customersUpdateStatement.addBatch();				
				
			}	
			
			customersUpdateStatement.executeBatch();
			
			connection.commit();
			
			customersSelectStatement.close();
			customersUpdateStatement.close();
			
			connection.close();
			
			Timestamp endTime = new Timestamp(System.currentTimeMillis());
			System.err.println( "Conversion started: " + startTime);
			System.err.println( "Conversion finished: " + endTime);
			
		}catch (Exception e) {
			e.printStackTrace();
		}		
	}	
}

