package com.csc.library.entry;

import java.util.StringTokenizer;
import java.util.Vector;

import com.csc.library.database.ChildManager;
import com.csc.library.database.FieldDate;
import com.csc.library.database.Relation;
import com.csc.library.session.DbInquiry;
import com.csc.library.session.DbRecord;
import com.csc.library.session.DbTable;
import com.csc.library.utilities.CscCalendar;
import com.csc.library.utilities.MyLog;

public class BinaryHelpEntry extends HelpEntry{
	
	public BinaryHelpEntry() {
		this.type = "helpEntry";
	}

	@Override
	public void setSearch() {
		        try {
		        	ChildManager cmobj = null;
		        	if (this.myRec != null) {
		        		cmobj = (ChildManager) myRec;
		        	} else if (this.inq != null) {
		        		cmobj = (ChildManager) inq;
		        	} else if (this.myTab != null) {
		        		cmobj = (ChildManager) myTab;
		        	}
		        	MyLog.debug(this, this.getUProfile(), " ********  Debug Child Manager : " + cmobj);
		            String listCon = "";
		            Object obj = null;
		            if ((this.fixCon != null) && (!this.fixCon.equals("")) && (!this.fixCon.equals("null"))) {
		                listCon = fixCon;
		            }
		            if ((!this.valueSearch.equals("")) && (!this.searchBy.equals("")) && (!this.valueSearch.equals("null"))) {
		                if (this.searchBy.substring(0,this.searchBy.indexOf(".")).equalsIgnoreCase(cmobj.getTableName())) {
		                	if (cmobj instanceof DbRecord) {
		                		obj = (DbRecord)cmobj;
		                	} else if (cmobj instanceof DbInquiry) {
		                		obj = (DbRecord)this.inq.getCurrentDbRecord();
		                	} else if (cmobj instanceof DbTable) {
		                		obj = (DbRecord)this.myTab.getCurrentRecordManager();
		                	} 
		                	String valuesearch=this.valueSearch;
		                	String searchby=this.searchBy.substring(this.searchBy.indexOf(".") + 1);
		                	if(((DbRecord)obj).getField(searchby) instanceof FieldDate){
		                		CscCalendar cs=new CscCalendar(valuesearch);
		                		valuesearch=cs.getYYYYMMDD();
		                	}
		                    if ((listCon != null) && (!listCon.equals(""))) {
		                        if (this.conSearch.equals("like")) {
		                            listCon = "(" + listCon + ") and " + searchby + " " + this.conSearch + " N'%" + valuesearch + "%'";
		                        } else {
		                            listCon = "(" + listCon + ") and " + searchby + " " + this.conSearch + " N'" + valuesearch + "'";
		                        }
		                    } else {
		                        if (this.conSearch.equals("like")) {
		                            listCon = searchby + "  " + this.conSearch + " N'%" + valuesearch + "%'";
		                        } else {
		                            listCon = searchby + "  " + this.conSearch + " N'" + valuesearch + "'";
		                        }
		                    }
		                } else {
		                	if (cmobj instanceof DbRecord) {
		                		obj = cmobj.getChild(this.searchBy.substring(0, this.searchBy.indexOf(".")));
		                        if (this.conSearch.equals("like")) {
		                            ((DbRecord) obj).setFilter(this.searchBy.substring(this.searchBy.indexOf(".") + 1) + "  " + this.conSearch + " N'%" + this.valueSearch + "%'");
		                        } else {
		                            ((DbRecord) obj).setFilter(this.searchBy.substring(this.searchBy.indexOf(".") + 1) + "  " + this.conSearch + " N'" + this.valueSearch + "'");
		                        }
		                	} else if (cmobj instanceof DbInquiry) {
		                		obj = this.inq.getCurrentDbRecord().getChild(this.searchBy.substring(0, this.searchBy.indexOf(".")));
		                		String subQuery="";
		                		Relation rela=null;
		                		try{ 
		                			if(obj!=null){
		               				rela= ((DbInquiry) obj).getRelation(inq.getTableName());
		               				Vector vrela=rela.getVFieldListParent();
		                			Vector vparent=inq.getCurrentDbRecord().getAllFieldName();
		                			for(int i=0;i<vrela.size();i++){
		                				if(vparent.contains((String)vrela.get(i))){
		                					subQuery=(String)vrela.get(i)+" in (select "+(String)rela.getVFieldtListChild().get(i)+" from "+((DbInquiry)obj).getTableName()+" where ";
		                					break;
		                				}
		                			}
		                		  }
		                		}catch(Exception ex){
		                			MyLog.warn(this,this.getUProfile(),ex);
		                		}                		
		                        if (this.conSearch.equals("like")) {
		                            inq.setFilter(subQuery+" "+this.searchBy.substring(this.searchBy.indexOf(".") + 1) + "  " + this.conSearch + " N'%" + this.valueSearch + "%' "+((subQuery.length()>0)?")":""));
		                        } else {
		                            inq.setFilter(subQuery+" "+this.searchBy.substring(this.searchBy.indexOf(".") + 1) + "  " + this.conSearch + " N'" + this.valueSearch + "' "+((subQuery.length()>0)?")":""));
		                        }
		                	} else if (cmobj instanceof DbTable) {
		                		obj = this.myTab.getCurrentRecordManager().getChild(this.searchBy.substring(0, this.searchBy.indexOf(".")));
		                	}
		                }
		            }
		            if ((this.childFilter != null) && (!this.childFilter.equals("")) && (!this.childFilter.equals("null"))) {
		                for (StringTokenizer token = new StringTokenizer(this.childFilter, ";"); token.hasMoreTokens();) {
		                    for (StringTokenizer sub_token = new StringTokenizer(token.nextToken(), ":"); sub_token.hasMoreTokens();) {
		                    	if (cmobj instanceof DbRecord) {
		                        	obj = this.myRec.getChild(sub_token.nextToken());
		                        } else if (cmobj instanceof DbInquiry) {
		                        	obj = this.inq.getCurrentDbRecord().getChild(sub_token.nextToken());
		                        } else if (cmobj instanceof DbTable) {
		                        	obj = this.myTab.getCurrentRecordManager().getChild(sub_token.nextToken());
		                        }
		                    	
		                        if (obj instanceof DbRecord) {
		                            ((DbRecord) obj).setFilter(sub_token.nextToken());
		                        } else {
		                            if (obj instanceof DbInquiry) {
		                                ((DbInquiry) obj).setFilter(sub_token.nextToken());
		                            } else if (obj instanceof DbTable) {
		                            	((DbTable) obj).setFilter(sub_token.nextToken());
		                            }
		                        }
		                    }
		                }
		            }
		            if ((listCon != null) && (!listCon.equals("")) && (!listCon.equals("null"))) {
		            	if(cmobj instanceof DbInquiry ){
		            		if(((DbInquiry)cmobj).getFilter().trim().length()>0){
		            			cmobj.setFilter(((DbInquiry)cmobj).getFilter()+" and "+listCon);
		            		}else{
		            			cmobj.setFilter(listCon);
		            		}
		            	}
		            }
		        } catch (Exception e) {
					MyLog.error(this, this.getUProfile(), e);
		        }
		}
}