package ibase.dashboard.mfg.ejb;

import ibase.system.config.ConnDriver;
import ibase.webitm.ejb.ValidatorEJB;
import ibase.webitm.utility.ITMException;

import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.ejb.Stateless;

/**
 * Session Bean implementation class ProductionVsBudgetReport
 */
@Stateless
public class ProductionVsBudgetReport extends ValidatorEJB implements ProductionVsBudgetReportRemote, ProductionVsBudgetReportLocal 
{
    /**
     * Default constructor. 
     */
	List<String> listDate     =null;
	StringBuffer xmlDataForGeo = null;
	StringBuffer xmlDataForUnit = null;
	String initGeoLocation ="";
	String initUnitForm =""; 
	public ProductionVsBudgetReport() throws RemoteException, ITMException
    {
  // TODO Auto-generated constructor stub
    	
    	String sql = "";
		ResultSet rs = null;		
		Connection conn = null;		
		PreparedStatement pstmt = null;
		ConnDriver connDriver = new ConnDriver();
	    listDate = new ArrayList<String>();
	    String firstDateofMonth="";
	    String lstDateofMonth="";
	    Calendar cal=null;
	    SimpleDateFormat sdf=null;
	    
		try
		{
			conn = connDriver.getConnectDB("DriverITM");
			connDriver = null;
			sql="select  to_char ( trunc(sysdate,'Month') + rownum - 1,'DD') as tran_date from item where rownum <= last_day (sysdate) - trunc(sysdate,'Month') + 1 order by 1 ";
			
			pstmt = conn.prepareStatement(sql); 			
			rs = pstmt.executeQuery();
			
			while(rs.next())
			{
				listDate.add(rs.getString(1));
			}
			pstmt.close();
		    rs.close();
			pstmt = null;   					  
			rs    = null;
			
			/**
			 Code for get first n last date of month date 17/10/13	*/			
			
			  cal = Calendar.getInstance();
			  sdf=new SimpleDateFormat("dd-MMM-yy");
			  cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
			  lstDateofMonth=sdf.format(cal.getTime());
			  cal = Calendar.getInstance();
			  //cal.add(cal.MONTH,-1);
			  cal.set(Calendar.DATE, cal.getActualMinimum(Calendar.DATE));
			  firstDateofMonth=  sdf.format(cal.getTime());			
	
			//coding for generate  geoLocation combo box 
			
			//sql   ="select  fld_value, descr from gencodes  where FLD_NAME='GEO_LOC' and mod_name='X' ";			
			sql="select fld_value, descr from gencodes where fld_name = 'GEO_LOC' and mod_name = 'X' and fld_value in (select distinct geo_loc from site where site_code in (select distinct site_code from dwh_production_day_events where tran_date between ? and ?  and ref_ser ='W-RCP'))";
			
			pstmt = conn.prepareStatement(sql); 
			pstmt.setString(1, firstDateofMonth);
		    pstmt.setString(2, lstDateofMonth);
			rs    = pstmt.executeQuery();
			xmlDataForGeo = new StringBuffer("<?xml version=\"1.0\"?><Root>");
			int count=1;
			while(rs.next())
			{
				if(count==1){
					initGeoLocation =checkNull(rs.getString("fld_value"));      	
				}
				xmlDataForGeo.append("<Detail>");				
				xmlDataForGeo.append("<fld_value>").append("<![CDATA[" + checkNull(rs.getString("fld_value"))+"]]>").append("</fld_value>");
				xmlDataForGeo.append("<descr>").append("<![CDATA[" + checkNull(rs.getString("descr"))+"]]>").append("</descr>");
				xmlDataForGeo.append("</Detail>");
				count++;
			}
			xmlDataForGeo.append("</Root>");
			System.out.println("Geo Location Drop Down List=="+xmlDataForGeo);
			pstmt.close();
		    rs.close();
			pstmt = null;   					  
			rs = null;
			
		//End of geoLoaction with unit_form			
		//coding for gererate  unit form drop down			
			sql   ="select distinct(unit__form)  from item_type  where  unit__form is not null";
			pstmt = conn.prepareStatement(sql); 
			rs    = pstmt.executeQuery();
			xmlDataForUnit = new StringBuffer("<?xml version=\"1.0\"?><Root>");
			int count2=1;
			while(rs.next())
			{
				if(count2==1){
					initUnitForm =checkNull(rs.getString("unit__form"));      	
				}
				xmlDataForUnit.append("<Detail>");				
				xmlDataForUnit.append("<unit_form>").append("<![CDATA[" + checkNull(rs.getString("unit__form"))+"]]>").append("</unit_form>");
				xmlDataForUnit.append("</Detail>");
				count2++;
			}
			xmlDataForUnit.append("</Root>");
			System.out.println("unitForm  Drop Down List=="+xmlDataForUnit);
			pstmt.close();
		    rs.close();
			pstmt = null;   					  
			rs = null;	
						
		//End of unit for drop down	
			
		}
		 catch (Exception e)
			{
				e.printStackTrace();
				throw new ITMException(e);
			} finally
			{
				try
				{
					  if (conn != null)
				       {
					  	conn.close();
						conn = null;
				       }
						if (rs != null)
						{
							rs.close();
						    rs = null;
						}
						
						
						if (pstmt != null)
						{
							pstmt.close();
						    pstmt = null;
						}
				
					
				} catch (Exception d)
				{
					d.printStackTrace();
					throw new ITMException(d);
				}
			}
    }
	
// This method will be return xml data for geoLoaction List
	 public String getGeoLoCodeXmlData()
	    {
		 return xmlDataForGeo.toString();
	    }
	
	 public String getUnitFormXmlData()
	    {
		 return xmlDataForUnit.toString();
	    }
	 
    
  //This is main method which are performed to all chart    
    
    public String getProductionBudget(String frmDate,String toDate,String geoLoc,String unitForm) throws RemoteException, ITMException
    {
		String sql = "";
		ResultSet rs = null,rs1=null;
		Connection conn = null;
		PreparedStatement pstmt = null,pstmt1;		
		ConnDriver connDriver = new ConnDriver();
		StringBuffer xmlData = null;
		String geoLocation="";
		String unit="";
		String previousUnit="";
		String geoLocationPrevious="";
		int count=0;
		int todaysDay=0;
		int lastDayOfMonth=0;
		double dailyBudgetQty=0;
		String geol_Descr="";
		String unit_Descr="";
		int year=0;
		String month="";		
		try
		{
			conn = connDriver.getConnectDB("DriverITM");
			connDriver = null;						
			
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MMM-yy");
			Calendar calendar = Calendar.getInstance();			
			
			calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
			calendar = Calendar.getInstance();
			calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
			todaysDay         =Calendar.getInstance().get(Calendar.DAY_OF_MONTH);			
			lastDayOfMonth    = Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);			
			year              =calendar.get(Calendar.YEAR);
			month             = new SimpleDateFormat("MMM").format(calendar.getTime());	
			// change on item changes of GeoLocation code

			initGeoLocation="'"+initGeoLocation+"'";
			initUnitForm="'"+initUnitForm+"'";
			
			if((geoLoc!=null && geoLoc.trim().length()>0)&& (unitForm!=null && unitForm.trim().length()>0)){
				initGeoLocation =geoLoc;
				initUnitForm    =unitForm;
			   }
			System.out.println("select Final initGeoLocation inside in java ==="+initGeoLocation +"selected initUnitForm inside in java =="+initUnitForm);
			
			/*sql  = "select geo_loc, unit__form,to_char (tran_date,'DD') as tran_date, day_quantity, pyr_cumqty,cum_budqty "+
					"from ("+
					"select s.GEO_LOC,p.tran_date, t.unit__form, "+
					"fn_get_budgetqty(p.tran_date,s.GEO_LOC,t.unit__form ) as cum_budqty ,"+
					"sum(fn_qty_form(p.item_code,p.unit,t.unit__form, p.quantity)) as "+
					"day_quantity, fn_get_pyr_cumqty( "+
					"to_date(add_months(p.tran_date,-12)),s.geo_loc,t.unit__form ) as pyr_cumqty "+
					"from dwh_production_day_events p, item i, item_type t, site s "+
					"where p.site_code = s.site_code "+
					"and  p.item_code = i.item_code "+
					"and i.item_type = t.item_type "+
					"and p.tran_date >= ? "+
					"and p.tran_date <= ? "+
					"and p.ref_type like 'P%' "+
					"and p.ref_ser = 'W-RCP' "+
					"group by s.GEO_LOC, p.tran_date, t.unit__form ) order by geo_loc, unit__form,tran_date ";
			 */
						
			
			        sql="select geo_loc, unit__form,to_char (tran_date,'DD') as tran_date, day_quantity, pyr_cumqty, " +
					"cum_budqty , sum(day_quantity) over (partition by geo_loc, unit__form order by tran_date) " +
					"as cur_cumqty from ( select s.GEO_LOC,p.tran_date, t.unit__form, " +
					"sum(fn_qty_form(p.item_code,p.unit,t.unit__form, p.quantity)) " +
					"as day_quantity, fn_get_pyr_cumqty( to_date(add_months(p.tran_date,-12)),s.geo_loc,t.unit__form ) " +
					"as pyr_cumqty, fn_get_budgetqty(p.tran_date,s.GEO_LOC,t.unit__form ) " +
					"as cum_budqty from dwh_production_day_events p, item i, item_type t, " +
					"site s where p.site_code = s.site_code and  p.item_code = i.item_code " +
					"and i.item_type = t.item_type and p.tran_date >= ? " +
					"and p.tran_date <= ? " +
					"and p.ref_type = (case when  t.item_type in('AMPOULES','BOTTLES','DROPS','GRANULES','INHALER','POWDER','POUCH','PELLETS','SUSPENSION','SYRINGE','TUBE','VIALS') then 'P'  when  t.item_type in('CAPSULES','TABLETS',' SOFTGELCAP') then 'F' else '' end  ) " +					
					"and p.ref_ser = 'W-RCP' and s.geo_loc in(" + initGeoLocation +") "+
					"and t.unit__form in("+initUnitForm +") group by s.GEO_LOC, p.tran_date, t.unit__form ) " +
					"order by geo_loc, unit__form,tran_date";
			
			
				   pstmt = conn.prepareStatement(sql); 			
			       pstmt.setString(1,frmDate);
			       pstmt.setString(2,toDate);
			       //End of setter statement
			       
			        rs = pstmt.executeQuery();
		            xmlData = new StringBuffer("<?xml version=\"1.0\"?><Root>");
			        xmlData.append("<Detail>");
			        int cntFrBudget=0;			    	
 				    String curCumQty="";
 				    String missingDate=""; 				
 				    String pyrCumqty="0.0"; 
			        int dayCount=0;
			   
			while(rs.next())
			{
   				
				
				    count++;
   					geoLocation =checkNull(rs.getString("geo_loc"));
   					unit        =checkNull(rs.getString("unit__form")); 	
   					
   					if(count > 1 && ((!previousUnit.equals(unit)) ||  (!geoLocationPrevious.equals(geoLocation))) )
   					{
   						 						
   						if(dayCount<=lastDayOfMonth)
   						{
   							int cntr =dayCount;
   							for(int j=0;j<lastDayOfMonth-cntr;j++)
   							{
   							 cntFrBudget++;  			 
   							 xmlData.append("<tran_date  date=\""+(listDate.get(dayCount))+"\">");
	   	   		   			 xmlData.append("<day_quantity quantity=\"0\">"); 
	   	   		   			 
	   	   		   		    //Add new Block for preyear Cumulative	   	   		   			 
	   	   		   			 //sql="select to_date(add_months(?,-12)) from dual ";	   
	   	   		   			 
	   	   		         	 missingDate =listDate.get(dayCount)+"-"+month+"-"+year;	   	   		         	
	   	   		   			 sql         ="select fn_get_pyr_cumqty( to_date(add_months('"+missingDate+"',-12)),"+geoLocationPrevious+",'"+previousUnit +"') as pyr_cumqty from dual";	   	   		   			 
			   	   		   	 pstmt1      = conn.prepareStatement(sql); 		 				       				     
		 				     rs1         = pstmt1.executeQuery();
		 				     if(rs1.next())
		 				       {
		 				    	 if(rs1.getDouble("pyr_cumqty")!=0)		 				    		 
		 				    	 {
		 				    		pyrCumqty = checkNull(rs1.getString("pyr_cumqty")) ; 	 				    		 
		 				    		System.out.println("preyrcumulative ==="+pyrCumqty); 
		 				    		System.out.println("preyrcumulative for missing date:"+missingDate+"===geoloc:"+geoLocationPrevious+":previousUnit:"+previousUnit); 
		 				    	   }
		 				        }  
		 				    pstmt1.close();
		 					rs1.close();
		 					pstmt1 = null;   					  
		 					rs1 = null;
		 			//End of preyearCumulative		 					
		 					 
	   	   		   			 xmlData.append("<pyr_cumqty>").append("<![CDATA["+pyrCumqty+"]]>").append("</pyr_cumqty>");	   	   		   					
	   	   		   			 xmlData.append("<cum_budqty>").append("<![CDATA["+dailyBudgetQty*(cntFrBudget)+"]]>").append("</cum_budqty>");	   	   		   					
	   	   		   			 xmlData.append("<cur_cumqty>").append("<![CDATA["+curCumQty+"]]>").append("</cur_cumqty>");	   	   		   					
	   	   		   			 xmlData.append("</day_quantity>");   					
	   	   		   		     xmlData.append("</tran_date>");
	   	   		      	     dayCount++;
	   	   		      	     
   							}
   						}
   							
   						xmlData.append("</unit_form>");
   						xmlData.append("</geo_loc>");
   						//dayCount=0;
   					}
   				
   					if((count==1) || (!previousUnit.equals(unit)) ||( !geoLocationPrevious.equals(geoLocation)) )
   					{
   						
   					//Add here for decr pupose	
   	   				 sql="select  descr from gencodes  where FLD_NAME='GEO_LOC' and fld_value= ?";
   						
   		   			   pstmt1 = conn.prepareStatement(sql); 			
   				       pstmt1.setString(1,geoLocation);   				     
   				       rs1 = pstmt1.executeQuery();
   				       if(rs1.next())
   				       {
   				    	geol_Descr = checkNull(rs1.getString("descr"))  ; 
   				       }   				       
   					   pstmt1 = null;   					  
   					   rs1 = null;
   					  //**************************************************
   					  sql="select descr from uom where unit= ?";
						
		   			   pstmt1 = conn.prepareStatement(sql); 			
		   			   pstmt1.setString(1,unit);
				      
				       rs1 = pstmt1.executeQuery();
				       if(rs1.next())
				       {
				    	   
				    	unit_Descr = checkNull(rs1.getString("descr"))  ; 
				    	   
				       }
				       pstmt1.close();
					   pstmt1 = null;
					   rs1.close();
					   rs1 = null;   					
   					   
   					//End here decr pupose for Unit_form and geo_location
   					   
   						cntFrBudget=0;	
   						xmlData.append("<geo_loc location=\""+geoLocation+"\" glocdescr =\""+geol_Descr+"\"  >");
   						xmlData.append("<unit_form unit=\""+checkNull(rs.getString("unit__form"))+"\" unitdescr =\""+unit_Descr+"\">");
   						dayCount=0;
   						curCumQty="0.0";   						
   						pyrCumqty="0.0";   						
   						geoLocationPrevious   =geoLocation=checkNull(rs.getString("geo_loc"));
   						previousUnit          =checkNull(rs.getString("unit__form"));
   						//Add descr
   						geol_Descr="";
   						unit_Descr="";
   						
   					}
   					

   					dailyBudgetQty =rs.getDouble("cum_budqty");   					
   					cntFrBudget++;    								 			    	
   					
   					if(!listDate.get(dayCount).equals(rs.getString("tran_date")))
   					{
   						int cnt= dayCount;	
   						for(int i=0;i<Integer.parseInt(rs.getString("tran_date"))-(cnt+1);i++)
   						{
   					     //Add new Block for preyear Cumulative   							
   						 //sql="select to_date(add_months(?,-12)) from dual ";	   	   		   			 
   						     missingDate=listDate.get(dayCount)+"-"+month+"-"+year;   						     
	   	   		   			 sql="select fn_get_pyr_cumqty( to_date(add_months('"+missingDate+"',-12)),"+geoLocation+",'"+unit +"') as pyr_cumqty from dual";	   	   		   			 
			   	   		   	 pstmt1 = conn.prepareStatement(sql); 		 				       				     
		 				     rs1 = pstmt1.executeQuery();
		 				     if(rs1.next())
		 				       {
		 				    	 //Modify by birendra Pandey
		 				    	 if(rs1.getDouble("pyr_cumqty")!=0)		 				    		 
		 				    	 {
		 				    		pyrCumqty = checkNull(rs1.getString("pyr_cumqty")) ; 	 				    		 
		 				    		System.out.println("preyrcumulative ==="+pyrCumqty);
		 				    	 }
		 				       	 		 				    	   
		 				      }  
		 				    pstmt1.close();
		 					rs1.close();
		 					pstmt1 = null;   					  
		 					rs1 = null;
		 			//End of preyearCumulative
		 					
   							xmlData.append("<tran_date  date=\""+(listDate.get(dayCount))+"\">");
	   	   		   			xmlData.append("<day_quantity quantity=\"0\">");   	   		   					
	   	   		   			xmlData.append("<pyr_cumqty>").append("<![CDATA["+pyrCumqty+"]]>").append("</pyr_cumqty>");	   	   		   					
	   	   		   			xmlData.append("<cum_budqty>").append("<![CDATA["+dailyBudgetQty*(cntFrBudget)+"]]>").append("</cum_budqty>");	   	   		   					
	   	   		   			xmlData.append("<cur_cumqty>").append("<![CDATA["+curCumQty+"]]>").append("</cur_cumqty>");	   	   		   					
	   	   		   			xmlData.append("</day_quantity>");   					
	   	   		   		    xmlData.append("</tran_date>");
	   	   		            dayCount++;
	   	   		            cntFrBudget++; 
	   	   		           
	   	   		           
   						}
   						
   					}  
   					
   				    xmlData.append("<tran_date  date=\""+checkNull(rs.getString("tran_date"))+"\">");
   					xmlData.append("<day_quantity quantity=\""+checkNull(rs.getString("day_quantity"))+"\">");
   					xmlData.append("<pyr_cumqty>").append("<![CDATA[" + checkNull(rs.getString("pyr_cumqty"))+"]]>").append("</pyr_cumqty>");
   					xmlData.append("<cum_budqty>").append("<![CDATA[" + dailyBudgetQty*(cntFrBudget) +"]]>").append("</cum_budqty>");
   					xmlData.append("<cur_cumqty>").append("<![CDATA[" + checkNull(rs.getString("cur_cumqty"))+"]]>").append("</cur_cumqty>");
   					xmlData.append("</day_quantity>");   					
   					xmlData.append("</tran_date>");			
   					curCumQty       = checkEmpty(checkNull(rs.getString("cur_cumqty")));     				 
   					pyrCumqty       =checkEmpty(checkNull(rs.getString("pyr_cumqty"))); 
   					dayCount++;   					
   				   
			     
			}
			
			if(count>0)
			{
				if(dayCount<lastDayOfMonth)
				{
					
					for(int p=dayCount;p<lastDayOfMonth;p++)
					{
					     cntFrBudget++; 
				         //Add new Block for preyear Cumulative   							
						 //sql="select to_date(add_months(?,-12)) from dual ";	   	   		   			 
					     missingDate=listDate.get(dayCount)+"-"+month+"-"+year;					     
  	   		   			 sql="select fn_get_pyr_cumqty( to_date(add_months('"+missingDate+"',-12)),"+geoLocation+",'"+unit +"') as pyr_cumqty from dual";	   	   		   			 
		   	   		   	 pstmt1 = conn.prepareStatement(sql); 		 				       				     
	 				     rs1 = pstmt1.executeQuery();
	 				     if(rs1.next())
	 				       {
	 				    	if(rs1.getDouble("pyr_cumqty")!=0)		 				    		 
	 				    	 {
	 				    		 pyrCumqty = checkNull(rs1.getString("pyr_cumqty")) ; 		 				    	 
		 				    	 System.out.println("pyrCumqty As New ==="+pyrCumqty);
		 				    	   
	 				    	 }
	 				    	 
	 				      }  
	 				    pstmt1.close();
	 					rs1.close();
	 					pstmt1 = null;   					  
	 					rs1 = null;
	 			//End of preyearCumulative
					
				    xmlData.append("<tran_date  date=\""+(listDate.get(dayCount))+"\">");
  		   			xmlData.append("<day_quantity quantity=\"0\">");   	   		   					
  		   			xmlData.append("<pyr_cumqty>").append("<![CDATA["+pyrCumqty+"]]>").append("</pyr_cumqty>");	   	   		   					
  		   			xmlData.append("<cum_budqty>").append("<![CDATA["+dailyBudgetQty*(cntFrBudget)+"]]>").append("</cum_budqty>");	   	   		   					
  		   			xmlData.append("<cur_cumqty>").append("<![CDATA["+curCumQty+"]]>").append("</cur_cumqty>");	   	   		   					
  		   			xmlData.append("</day_quantity>");   					
  		   		    xmlData.append("</tran_date>");
  		   		    dayCount++;
  		   		    
					}
			}
			    xmlData.append("</unit_form>");
			    xmlData.append("</geo_loc>");
			}
			
								
			xmlData.append("</Detail>");
		    xmlData.append("</Root>");
			pstmt.close();
			pstmt = null;
			rs.close();
			rs = null;
		
		} catch (Exception e)
		{

			e.printStackTrace();
			System.out.println("ibase.dashboard.mfg.ejb :ProductionVsBudgetReport"+e);
			throw new ITMException(e);
		} finally
		{
			try
			{
				if (conn != null)
				{
					if (rs != null)
						rs.close();
					    rs = null;
					
					if (pstmt != null)
						pstmt.close();
					    pstmt = null;				   
					    conn.close();
					    conn = null;
				}
				conn = null;
			} catch (Exception d)
			{
				d.printStackTrace();
				System.out.println("ibase.dashboard.mfg.ejb :ProductionVsBudgetReport"+d);
				throw new ITMException(d);
			}
		}
		return xmlData.toString();
    }
    
    
    private String checkNull(String input)
	{
		
		if (input == null)
		{
			input = "";
		} else
		{
			input = input.trim();
		}
		return input;
	}
    
    private String checkEmpty(String input)
	{
		
		if (input == "")
		{
			input = "0";
		} else
		{
			input = input.trim();
		}
		return input;
	}
    
    
    
	public String getInitGeoLocation()
    {
    	return initGeoLocation;
    }

	public void setInitGeoLocation(String initGeoLocation)
    {
    	this.initGeoLocation = initGeoLocation;
    }

	public String getInitUnitForm()
    {
    	return initUnitForm;
    }

	public void setInitUnitForm(String initUnitForm)
    {
    	this.initUnitForm = initUnitForm;
    }
    
   
    
    
}
