package com.csc.library.dwr;


import java.util.Enumeration;
import java.util.Hashtable; 

import com.csc.library.session.DbInquiry;
import com.csc.library.utilities.CscCalendar;
import com.csc.library.utilities.CscTime;

public class TA_DWR_Services extends DWR_base {

	public String chkOTOver(String employeeid , String  dataOT) {	
		this.setUProfile();
		Hashtable<String,Float> otRequestData = this.extractData(dataOT);
		Enumeration e = otRequestData.keys();
		 
		//fix �������բ����ŷ�� table mconfig 
		String otMsg = "";
		float maxOTPerWeek = 36;

		try{ 
			//get data from table mconfig 
			DbInquiry otMaxRec = this.getInquiry("mconfig", "config_value", "configid = 'TA1013' ", "", this.up);
			if(otMaxRec.next()){
				maxOTPerWeek =otMaxRec.getCurrentDbRecord().getFloat("config_value")  ;
			}//end if 
			
			String whereClause ="";
			while( e. hasMoreElements() ){
				String dataKey = String.valueOf(e.nextElement()) ;
				//OT �����ͧ��
				CscTime hour = new CscTime(); 
				hour.add(otRequestData.get(dataKey));
				
				String[] keys = dataKey.split(":");
			 	CscCalendar stDate = new CscCalendar (keys[0]) ;
				CscCalendar endDate = new CscCalendar (keys[1]);	
			
			 
				whereClause = "doctype in('O','B','OM')"
									+" and employeeid ='" + employeeid+ "'"
									+" and dateid >= '" + stDate.getYYYYMMDD() +"'" 
									+" and dateid <= '" + endDate.getYYYYMMDD() +"'" ;
									 
				DbInquiry otRec = this.getInquiry("tleave_summary", "m_lv", whereClause, "", this.up);
				otRec.refresh();
				while(otRec.next()){
					//OT ����¶١��������� �ѻ�������
					hour.add(otRec.getCurrentDbRecord().getFloat("m_lv")) ;
				}//end while
				
				if(hour.getFloat()>=maxOTPerWeek ){
					//�������ö�� OT ��ѻ���� ���� ���ա
					System.out.print("Sorry ! u can't request OT in this week...");
		 			
					if(otMsg.equals("")){
						otMsg  = stDate.getDDMMYYYY()+":" +endDate.getDDMMYYYY();
					}else{
						otMsg +="#"+ stDate.getDDMMYYYY()+":" +endDate.getDDMMYYYY();
					}//end if 
				}else{
					//����ö�� OT ��ѻ���� ���� ��
					System.out.print("OK ! u can request OT in this week...");	
				}//end if 
				
			}//end while
			
		}catch (Exception ex){
			System.out.print("Error in TA_DWR_Services " + ex.getStackTrace());
		}//end try
		
		return otMsg;
	}//end chkOTOver
	
	private Hashtable<String,Float> extractData(String dataOT){
		//ત����ѹ��� ����кء����ͧ�� OT � row ���� �ѹ�Һ������ѻ�������� ?
		//������ �¡�͡�� ���� modify dataOT ����
		dataOT = modifyDataOT(dataOT);
		String[] dataPerDay = dataOT.split("#");
  	
		//���ѹ�� �ѹ����������-����ش��ѻ������ �Ѻ �ӹǹ ��. OT ��� �����ҵ����ǧ������¡�������
		Hashtable<String,Float> hstOT = new Hashtable<String,Float>(); 
	 
		try{
			for (int ii =0;ii<dataPerDay.length;ii++){
				String[] data = dataPerDay[ii].split(":");
				
				CscCalendar  stDateTime = new CscCalendar(data[0]);
				CscCalendar  endDateTime = new CscCalendar(data[1]);
 
				int daySpan = endDateTime.subForDay(stDateTime);
				
				CscCalendar  tmpStDate  = new CscCalendar(stDateTime.getYYYYMMDD());
				CscCalendar  tmpEndDate  = new CscCalendar(stDateTime.getYYYYMMDD());
				
				CscTime otHourPerWeek = new CscTime(); 
				
				for (int dayIndex =0;dayIndex<=daySpan;dayIndex++){
					if(dayIndex ==0){
						tmpStDate.incDate(0);
						tmpStDate.setCSCTime(Double.valueOf(data[2]));
					}else{
						tmpStDate.incDate(1);
						tmpStDate.setCSCTime(Double.valueOf(data[2]));
					}//end if 
					
					if (Double.valueOf(data[3])< Double.valueOf(data[2])){
						tmpEndDate  = new CscCalendar(tmpStDate.getYYYYMMDD());
						tmpEndDate.incDate(1);
						tmpEndDate.setCSCTime(Double.valueOf(data[3]));
					}else{
						if(dayIndex ==0){
							tmpEndDate.incDate(0);
							tmpEndDate.setCSCTime(Double.valueOf(data[3]));
						}else{
							tmpEndDate.incDate(1);
							tmpEndDate.setCSCTime(Double.valueOf(data[3]));
						}//end if 
					}//end if 
					
					//otTotal
					otHourPerWeek.add(tmpEndDate.subForHour(tmpStDate));
 				}//end for dayIndex
				
				//key=  �纪�ǧ�ѹ�����������ѻ����-����ش�ѻ����  value = �ӹǹ ��.OT ���
				//set data to Hashtable
				CscCalendar stOTRqt = new CscCalendar(data[0]);
				int dayOfWeek = stOTRqt.getCSCDOW();
			  
				CscCalendar stDayInWeek = new  CscCalendar(stOTRqt.getYYYYMMDD()).decDate(dayOfWeek-1);
				CscCalendar stWeekDate = new CscCalendar (stDayInWeek.getYYYYMMDD());
				CscCalendar endWeekDate = new CscCalendar (stDayInWeek.incDate(6).getYYYYMMDD());
				
				if (hstOT.size()==0){
					hstOT.put(stWeekDate.getYYYYMMDD()+":"+endWeekDate.getYYYYMMDD()
							,otHourPerWeek.getFloat());
				}else{
					//����� key �繤��������ʴ����������ѻ�������ǡѹ �� ������� key ���ǡѹ���	
					if(hstOT.containsKey(stWeekDate.getYYYYMMDD()+":"+endWeekDate.getYYYYMMDD())){
						float oldValue = hstOT.get(stWeekDate.getYYYYMMDD()+":"+endWeekDate.getYYYYMMDD());
						
						hstOT.put(stWeekDate.getYYYYMMDD()+":"+endWeekDate.getYYYYMMDD()
								,otHourPerWeek.getFloat() + oldValue);
					}else{
						hstOT.put(stWeekDate.getYYYYMMDD()+":"+endWeekDate.getYYYYMMDD()
								,otHourPerWeek.getFloat());
					}//end if 
				}//end if 
 			
			}//end for ii
			
		}catch(Exception ex){
			System.out.print("Error in extractData "+ ex.getStackTrace());
		}//end try 
	
		return hstOT;
	}//end extractData
	
	private String modifyDataOT(String dataOT){
		String newDataOT ="";
		String[] dataPerDay = dataOT.split("#");
		
		for (int ii =0;ii<dataPerDay.length;ii++){
			String[] data  = dataPerDay[ii].split(":");
			CscCalendar  stDateTime = new CscCalendar(data[0]);
			CscCalendar  endDateTime = new CscCalendar(data[1]);
			
			CscCalendar curDate = new CscCalendar(stDateTime.getYYYYMMDD());
			int dayOfWeek = curDate.getCSCDOW();
			
			CscCalendar stDayInWeek = new  CscCalendar(curDate.getYYYYMMDD()).decDate(dayOfWeek-1);
			CscCalendar stDate = new CscCalendar (stDayInWeek.getYYYYMMDD());
			CscCalendar endDate = new CscCalendar (stDayInWeek.incDate(6).getYYYYMMDD());
		
			//��� �ѹ��� ������� ,�ѹ�������ش ����㹪�ǧ �ѻ�������ǡѹ �稺 ����������¡			
			if(stDateTime.subForDay(stDate) >= 0 && stDateTime.subForDay(endDate) <= 0
			   && endDateTime.subForDay(stDate) >= 0 && endDateTime.subForDay(endDate) <= 0){
				if(newDataOT.equals("")){
					newDataOT =stDateTime.getDDMMYYYY() +":"+ endDateTime.getDDMMYYYY() 
					+":"+data[2]+":"+data[3];
				}else{
					newDataOT +="#"+stDateTime.getDDMMYYYY() +":"+endDateTime.getDDMMYYYY()
					+":"+data[2]+":"+data[3];
				}//end if 
			}else{
				//�¡
				 if(newDataOT.equals("")){
				    newDataOT =stDateTime.getDDMMYYYY() +":"+endDate.getDDMMYYYY() 
					+":"+data[2]+":"+data[3];		
				}else{ 
					newDataOT +="#"+ stDateTime.getDDMMYYYY() +":"+endDate.getDDMMYYYY() 
					+":"+data[2]+":"+data[3];
				}//end if 
 				
				boolean isContinue = true;
			    while(isContinue){
			    	//�ѧ�Թ ���� ?
			    	if(endDateTime.subForDay(endDate)>6){
			    		newDataOT +="#"+ endDate.incDate(1).getDDMMYYYY() +":"+endDate.incDate(6).getDDMMYYYY()
						+":"+data[2]+":"+data[3];
			    	}else if(endDateTime.subForDay(endDate)==0){
			    		isContinue = false;
			    	}else{
			    		isContinue = false;
			    		newDataOT +="#"+ endDate.incDate(1).getDDMMYYYY() +":"+endDateTime.getDDMMYYYY()
						+":"+data[2]+":"+data[3];
			    	}//end if     	
			    }//end while
			    
			}//end if 
		}//end for 
		
		//=========Debug====================
		String[] dataDebug = newDataOT.split("#");
		System.out.print("=====newDataOT after modify is============\n");
		for (int ii = 0;ii<dataDebug.length ;ii++){
			System.out.print(dataDebug[ii]+"\n");
		}//end for
		System.out.print("==================================");
		//=================================
		
		return newDataOT;
	}//end modifyDataOT
}//end class