package prototype;

import java.util.Hashtable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.util.Calendar;


public class MemberManagerBean {
	
	private Hashtable members = new Hashtable();
	private String healthPlanID;

	/**
	 *
	 */

	public MemberManagerBean(String hpID) {
		healthPlanID = hpID;
		buildMembers();
	}

	/**
	 * getMember is used for retrieving a MemberBean from the hashtable of members
	 * which are associated with the health plan ID
	 */
	public MemberBean getMember(String memberID) throws java.lang.IllegalArgumentException{
		MemberBean retrievedMember;
		if(members.containsKey(memberID)){
			retrievedMember = (MemberBean)members.get(memberID);
		}else{
			throw new java.lang.IllegalArgumentException("Member ID not found");
		}
		return retrievedMember;
	}
	
	/**
	 * getMembers returns an enumeration of all MemberBean objects associated with
	 * a given health plan ID
	 */
	public java.util.Enumeration getMembers(){
		return members.elements();
	}
	
	/**
	 * buildMembers is a private class used for accessing the database and creating
	 * the member bean objects associated with the health plan id. These member beans are
	 * then placed into a hashtable, where the member id is the key to the MemberBean
	 */
    private void buildMembers(){
    	Connection con = getConnection();
		int secID =-1;
			
		String secondaryID;
		MemberBean tempMember;
		
		String firstName ="";
		String lastName = "";
		String name;
		String[] nameArray;
		String addr ="";
		String phone = "";
		String dob;
		String[] dobArray;
		boolean moreRows = false;
    	try{
			Statement getSeqStatement = con.createStatement();
			ResultSet rs = getSeqStatement.executeQuery(
						   "SELECT * FROM member WHERE MemberID =" + healthPlanID);
			moreRows = rs.first();
			
			while(moreRows){
				tempMember = new MemberBean();
			    secID = rs.getInt("SECONDARYID");
			    secondaryID = (new Integer(secID)).toString();
			    tempMember.setMemberNumber(secondaryID);
			    
			    name = rs.getString("NAME");
			    nameArray = name.split(",");
			    if (nameArray.length == 2){
					firstName = nameArray[0];
					lastName = nameArray[1];
			    }
			    tempMember.setFirstname(firstName);
			    tempMember.setLastname(lastName);
			    
			    tempMember.setPhoneNumber(rs.getString("PHONENUMBER"));
			    tempMember.setRelation(rs.getString("RELATION"));
			    tempMember.setStartCoverageDate((rs.getDate("STARTCOVERAGEDATE")).toString());
			    tempMember.setEndCoverageDate((rs.getDate("ENDCOVERAGEDATE")).toString());
			    tempMember.setStatus(rs.getString("STATUS"));
			    
			    dob = (rs.getDate("DOB")).toString();
			    tempMember.setDob(dob);
			    tempMember.setPcpName(rs.getString("PCPNAME"));
			    tempMember.setPcpSubProgram(rs.getString("PCPSUBPROGRAM"));
			    tempMember.setAltPcpName(rs.getString("ALTPCP"));
			    
			    dobArray = dob.split("-");
			    if(dobArray.length == 3){
			        tempMember.setAge(getAge(dobArray[1],dobArray[2],dobArray[0]));
			    }else{
			    	tempMember.setAge("Unknown");
			    }
			    
			    members.put(secondaryID,tempMember);
			//get members from the DB
			//Get memberID and use as key to hashtable
			    moreRows = rs.next();
			}
    	}catch (java.sql.SQLException e) {
		    e.printStackTrace();
	    }
    	
    }
    
    /**
     * Method used for retrieving a connection to the database
     */
	private Connection getConnection(){        
	   Connection con = null;
	   try {
	       // register the DB2 JDBC driver with DriverManager
		   Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance();
		   String url = "jdbc:db2:testdb";
		   String username = "administrator";
		   String password = "26!fmd9a ";
		   con = DriverManager.getConnection(url, username, password);

	   }catch (Exception e){
		   e.printStackTrace();
	   }
	   return con;
	}
	
	/** 
	 * Used for calculating the current age of a member based on their D.O.B
	 */
	private String getAge(String month,String day,String year){
		int birthYear = (new Integer(year)).intValue();
		int birthMonth = (new Integer(year)).intValue();
		int birthDay = (new Integer(year)).intValue();
		//Get the current year
		java.util.Calendar cal = java.util.Calendar.getInstance();
		int curYear = cal.get(Calendar.YEAR);
		int curMonth = cal.get(Calendar.MONTH);
		int curDay = cal.get(Calendar.DAY_OF_WEEK);
		
		//Calculate the current age based on the D.O.B and current date
		int tempAge = curYear - birthYear;
		int curAge;
		if((curMonth - birthMonth) < 0 ){
			curAge = tempAge - 1;
		}else if((curMonth - birthMonth) == 0){
			if((curDay - birthDay) < 0){
				curAge = tempAge - 1;
			}else{
				curAge = tempAge;
			}
		}else{
			curAge = tempAge;
		}
		String age = (new Integer(curAge)).toString();
		return age;
	}
    
}

/*
 *	$Log: MemberManagerBean.java,v $
 *	Revision 1.9  2004/04/09 04:55:49  jmp9921
 *	completed the initial implementation of buildMembers
 *	
 *	Revision 1.8  2004/04/09 03:34:21  jmp9921
 *	removed commented out code which was using the String method split.
 *	This method is available in Java 1.4.x. In order to use the updated version
 *	of jave, the java build path library must be changed to include the proper
 *	rt.jar file.
 *	
 *	Revision 1.7  2004/04/09 03:30:48  jmp9921
 *	removed stringtokenizer from import block
 *	
 *	Revision 1.6  2004/04/08 22:48:55  jjf3692
 *	Updated Claim Portlets.
 *	Cleaned up debugging output.
 *	Current errors are with session passing in the Claims portlets.
 *	
 *	Revision 1.5  2004/04/07 22:54:07  jmp9921
 *	started to implement the building of MemberBeans from the database
 *	
 *	Revision 1.4  2004/04/06 17:05:50  jmp9921
 *	added a method which returns a connection to the database
 *	
 *	Revision 1.3  2004/04/06 16:52:49  jmp9921
 *	Added a method which returns an enumeration containing all the MemberBean objects associated with the given health plan ID
 *	
 *	Revision 1.2  2004/04/06 16:44:31  jmp9921
 *	Initial implementation of core methods
 *	
 *
 */
