package neu.integration.base.action;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.hibernate.criterion.Criterion;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 查询Action基类
 * 
 * 
 */
public abstract class BaseListAction extends ActionSupport {
	private int rows;// 每页多少行，对应rowNum
	private int page;// Get the requested page. By default grid sets this to 1.
	private int total;// 总页?
	private long records;// 总记录数
	private List gridModel;//对象列表

	private String sord = "asc"; // sorting order - asc or desc
	private String sidx = "";//  表示用于排序的列名的参数名称
	
	private String searchField;// Search Field
	private String searchString; // The Search String
	private String searchOper;// The Search Operation
								// ['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc']
	
	private String filters;
	
	public String getFilters() {
		return filters;
	} 
	public void setFilters(String filters) {
		this.filters = filters;
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}

	public int getTotal() {
		total = (int) Math.ceil((double) records / (double) rows);
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	public long getRecords() {
		return records;
	}

	public void setRecords(long records) {
		this.records = records;
	}

	public List getGridModel() {
		return gridModel;
	}

	public void setGridModel(List gridModel) {
		this.gridModel = gridModel;
	}

	public String getSord() {
		return sord;
	}

	public void setSord(String sord) {
		this.sord = sord;
	}

	public String getSidx() {
		return sidx;
	}

	public void setSidx(String sidx) {
		this.sidx = sidx;
	}

	public String getSearchField() {
		return searchField;
	}

	public void setSearchField(String searchField) {
		this.searchField = searchField;
	}

	public String getSearchString() {
		return searchString;
	}

	public void setSearchString(String searchString) {
		this.searchString = searchString;
	}

	public String getSearchOper() {
		return searchOper;
	}

	public void setSearchOper(String searchOper) {
		this.searchOper = searchOper;
	}

	public boolean isAsc() {
		return this.sord.equals("asc");
	}
	
	/**
	 * 根据前台传入fileters生成复杂查询条件的方?
	 * 
	 * @param filters
	 *           前台查询条件json?
	 *           
	 * @return 生成的查询条件criteria
	 */
	public List<Criterion> generateSearchCriteriaFromFilters(String filters) {  
	    List<Criterion> criteria = new ArrayList<Criterion>();  
	      
	    JSONObject jsonObject = JSONObject.fromObject(filters);   
	    //String str = new String("{\"groupOp\":\"AND\",\"rules\":[{\"field\":\"adRegionCity\",\"op\":\"eq\",\"data\":\"沈阳市\"}]}");
//        try {     
//        	jsonObject = JSONObject.fromObject(filters);   
//        } catch (Exception e) {   
//            e.printStackTrace();   
//        } 
	    //filters = {"rules":[{"field":"drainName","op":"bw","data":"鞍子?,"datatype":"String"}]}
	    JSONArray rules = jsonObject.getJSONArray("rules");  
	      
	    for(Object obj : rules) {  
	        JSONObject rule = (JSONObject) obj;  
	          
	        String field = rule.getString("field");  
	        String op = rule.getString("op");  
	        String dataString = rule.getString("data");  
	        String dataType = rule.getString("datatype");
	        Object data = null;
	        if(dataType.equals("int")){
	        	data = new Long(dataString);
	        }else if(dataType.equals("bd")){
	        	data = new BigDecimal(dataString);
	        }else if(dataType.equals("double")){
	        	data = new Double(dataString);
	        }else if(dataType.equals("date")){
	        	SimpleDateFormat sdf =   new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
	        	
	        	try {
					data = (Date)sdf.parse(dataString + " 00:00:00");
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	        }else{
	        	data = new String(dataString);
	        }
	        	
	        Criterion criterion = RestrictionUtil.constructCriterion(field, data, op);  
	          
	        if(criterion != null) {  
	            criteria.add(criterion);  
	        }  
	    }  
	      
	    return criteria;  
	}
	/**
	 * 根据前台传入fileters生成复杂查询条件的方?
	 * 
	 * @param filters
	 *           前台查询条件json?
	 *           
	 * @return 生成的查询条件List<Object[]>
	 */
	public List<Object[]> generateSearchFromFilters(String filters) {  
	    List<Object[]> searchf = new ArrayList<Object[]>();  
	      
	    JSONObject jsonObject = JSONObject.fromObject(filters);   
	    //String str = new String("{\"groupOp\":\"AND\",\"rules\":[{\"field\":\"adRegionCity\",\"op\":\"eq\",\"data\":\"沈阳市\"}]}");
//        try {     
//        	jsonObject = JSONObject.fromObject(filters);   
//        } catch (Exception e) {   
//            e.printStackTrace();   
//        } 
	    //filters = {"rules":[{"field":"drainName","op":"bw","data":"鞍子?,"datatype":"String"}]}
	    JSONArray rules = jsonObject.getJSONArray("rules");  
	      
	    for(Object obj : rules) {  
	        JSONObject rule = (JSONObject) obj;  
	          
	        String field = rule.getString("field");  
	        String op = rule.getString("op");  
	        String dataString = rule.getString("data");  
	        String dataType = rule.getString("datatype");
	        Object data = null;
	        if(dataType.equals("int")){
	        	data = new Long(dataString);
	        }else if(dataType.equals("bd")){
	        	data = new BigDecimal(dataString);
	        }else if(dataType.equals("double")){
	        	data = new Double(dataString);
	        }else if(dataType.equals("date")){
	        	SimpleDateFormat sdf =   new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
	        	
	        	try {
					data = (Date)sdf.parse(dataString + " 00:00:00");
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	        }else{
	        	data = new String(dataString);
	        }
	        Object[]  s;
	        s = new Object[3];
	        s[0] = field;
	        s[1] = data;
	        s[2] = op;
	 
	          
	        if(s != null) {  
	        	searchf.add(s);  
	        }  
	    }  
	      
	    return searchf;  
	}
	/**
	 * 根据前台传入fileters生成更新Vo对象的方?
	 * 
	 * @param  vObject
	 * 			 已查询出的要更新的Vo对象
	 * 			filters
	 *           前台查询条件json?
	 *           
	 * @return 修改过更新字段的Vo对象
	 */
	
	public <M extends java.io.Serializable> M getVoFromFilters(M vObject,String filters){
		M updateObject = vObject;
		JSONObject jsonObject = null;
		boolean setValue = false;//是否给该字段赋?，默认不赋?
		try {     
			jsonObject = JSONObject.fromObject(filters);   
		} catch (Exception e) {   
			e.printStackTrace();   
		} 
		//JSONObject jsonObject = JSONObject.fromObject(filters);
		JSONArray updateData = jsonObject.getJSONArray("updateData");
	    for(Object obj : updateData) {  
	        JSONObject rule = (JSONObject) obj;  
	          
	        String field = rule.getString("field");  
	        String dataString = rule.getString("data");  
	        String dataType = rule.getString("datatype");
	        Object data = null;
			Field fieldObj;
			try {
				fieldObj = updateObject.getClass().getDeclaredField(field);
				if(dataType.equals("int")){
					if( (dataString != null) && (!dataString.equals("")) ){
						data = new Long(dataString); 
						setValue = true;
					}
				}else if(dataType.equals("bd")){
					if( (dataString != null) && (!dataString.equals("")) ){
						data = new BigDecimal(dataString);
						setValue = true;
					}
		        }else if(dataType.equals("double")){
		        	if( (dataString != null) && (!dataString.equals("")) ){
		        		data = new Double(dataString);
						setValue = true;
		        	}
				}else if(dataType.equals("date")){
					if( (dataString != null) && (!dataString.equals("")) ){
						SimpleDateFormat sdf =   new SimpleDateFormat( "yyyy-MM-dd" );
			        	try {
							data = (Date)sdf.parse(dataString);
							setValue = true;
						} catch (ParseException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}else{
					data = new String(dataString);
					setValue = true;
				}
				
				try {
					if(setValue){//存在值时,才给字段赋?
						fieldObj.setAccessible(true);
						fieldObj.set(updateObject,data);
					}
					setValue = false;//重新赋?判断
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchFieldException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	    }
	    
	    return updateObject;
	 }
	
	
	/**
	 * 根据前台传入fileter获取要更新的Vo对象ID
	 * 
	 * @param filters
	 *           前台更新操作的json?
	 *           
	 * @return  要更新Vo对象的Id
	 */
	
	public Long getIdFromFilters(String filters){
		
		JSONObject jsonObject = JSONObject.fromObject(filters);
		String strId = jsonObject.getString("id");
		Long id  = new Long(strId);
		return id;
	}
}
