/*
 * Created on 10-Sep-2009
 *
 * TODO 
 */
package uk.ac.roe.wfau;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Random;

import javax.naming.Context;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.jmock.Mock;



/**
 * @author mar
 *
 */

public class DatabaseConnection {
    static Logger logger=Logger.getLogger("wsa.simple");
    static {

        try {
            Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // A class not found error means the SQL driver class could not be
            // found.
            // Which means that this driver would not be available until this is
            // remedied. This flag variable will signal this to the class!
            logger.error("ImageList,SQLRetrieverThread::static(): Could not load SQLServerDriver class! "+stack2string.getString(e));
          }
          
    }
    public static Random rand= new Random();
    
    public static Connection getConnection(String [] servers, String database, String archive, HttpSession sess) {
        return  getConnection(false,servers,database,archive,sess,null);
    }
    public static Connection getConnection(String [] servers, String database, String dbUser, String dbPasswd, String startServer) {
    	return getConnection(false, servers, database, dbUser, dbPasswd, startServer);

    }
    
    public static Connection getConnection(boolean serverSupplied, String [] servers, String database, String dbUser, String dbPasswd, String startServer) {
        String conn=null;
        if (!serverSupplied) {
        if (database.toLowerCase().startsWith("vvvdr1")  || database.toLowerCase().startsWith("vvvdr2") || database.toLowerCase().startsWith("vvvv20110928")) {
            String [] vvvServers ={"ramses13"};
            servers=vvvServers;
        }
        else if (database.toLowerCase().startsWith("vvv") ) {
            String [] vvvServers ={"ramses10"};
            servers=vvvServers;
        }
        }
        int noOfServers=servers.length;
        int server=rand.nextInt(noOfServers);
        if (startServer != null) {
            for (int i=0; i < noOfServers; i++) {
                if (servers[i].equalsIgnoreCase(startServer)) {
                    server=i;
                }
            }
        }
        
         for (int i=0; i<noOfServers;i++) {
            server=server+i;
            if (server >= noOfServers) {
                server=0;
            }
            try {
                return DriverManager.getConnection(DatabaseURL.getDatabaseURL(servers[server],database,dbUser,dbPasswd,true));
            }
            catch (SQLException se) {
                logger.error("databaseConnection ERROR "+se+" "+servers[server]+" "+database+" "+dbUser);
            }
            finally {
                logger.info("DBCONN_DBURL: "+DatabaseURL.getDatabaseURL(servers[server],database,dbUser,dbPasswd,true));
                //return null;
            }
            
        }
        
        return null;
        
    }
    public static Connection getConnection(String [] servers, String database, String archive, HttpSession sess, String startServer) {
        return getConnection(false,servers, database,archive,sess,startServer,false);
        }
  
    public static Connection getConnection(boolean serverSupplied,String [] servers, String database, String archive, HttpSession sess, String startServer) {
    return getConnection(serverSupplied,servers, database,archive,sess,startServer,false);
    }
    public static Connection getConnection(boolean serverSupplied,String [] servers, String database, String archive, HttpSession sess, String startServer,boolean overideLoginForLoadServer) {
        String dbUser=null;
           
            dbUser=VDFSSession.getDBUser(sess,archive);  
       
        String dbPasswd=dbUser+"pw";
        if (!WSASession.getCommunity(sess).equalsIgnoreCase(WSASchema.PRERELEASECOMMUNITY) && database.equalsIgnoreCase(WSASchema.rollingDB) && VDFSSession.getLoginBoolean(sess,archive)){
            dbUser=WSASchema.rollingDBUser;
            dbPasswd=WSASchema.rollingDBPasswd;
            database=WSASchema.actualRollingDB;
        }
        else if (!VSASession.getCommunity(sess).equalsIgnoreCase(WSASchema.PRERELEASECOMMUNITY) && database.equalsIgnoreCase(VSASchema.actualRollingDB) && VDFSSession.getLoginBoolean(sess,archive)){
            dbUser=WSASchema.rollingDBUser;
            dbPasswd=WSASchema.rollingDBPasswd;
            database=VSASchema.actualRollingDB;
        }
        else if (!OSASession.getCommunity(sess).equalsIgnoreCase(OSASchema.PRERELEASECOMMUNITY) && database.equalsIgnoreCase(OSASchema.actualRollingDB) && VDFSSession.getLoginBoolean(sess,archive)){
            dbUser=OSASchema.rollingDBUser;
            dbPasswd=OSASchema.rollingDBPasswd;
            database=OSASchema.actualRollingDB;
        }
        
        if (servers[0].equalsIgnoreCase("ramses14") && database.equalsIgnoreCase(VSASchema.PRERELEASEDATABASE)) {
            database="VSAVVV";
        }
       return getConnection(serverSupplied, servers,database,dbUser,dbPasswd,startServer);
        
    }

    public static void main(String[] args) {
      
  
        
        String [] servers={"ramses1","ramses2"};
        for (int i=0;i<100;i++) {
            getConnection(servers,null,null,null);
        }
  
        
    }
}
