package com.fitbank.homebanking;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.fitbank.dto.management.Criterion;
import com.fitbank.dto.management.Detail;
import com.fitbank.dto.management.Field;
import com.fitbank.dto.management.Record;
import com.fitbank.dto.management.Table;


public class JSONData {
	private static final String QUERY_CTL="__QUERY";
	private static final String TABLE_CTL="__TABLE";
	private static final String ID_CTL="__ID";
	@SuppressWarnings("unused")
	private HttpServletRequest request;
	private Map<String,Object> param;
	private String identifier="code";
    private Detail detail;
    private String query;
    private String table;
    private int page=1;

	@SuppressWarnings("unchecked")
	public JSONData(HttpServletRequest pRequest) throws Exception {
		request = pRequest;
		param=new HashMap<String, Object>();
		for(Object key:request.getParameterMap().keySet()){
		  param.put(key.toString(),request.getParameter(key.toString()));
		}
          detail=new Detail();            
                detail.setType(MessageTypes.CON.name());                   
                query=(String)param.get(QUERY_CTL);
                table=(String)param.get(TABLE_CTL);
                identifier=(String)param.get(ID_CTL);
                Object obj=this.request.getSession().getAttribute(this.query);
                
                if(!(obj instanceof Transaction)){
                    throw new Exception("El detail asociado a la lista de valores no definido");
                }
                DataManage dm=(DataManage)request.getSession().getAttribute(DataManage.KEY);
                dm.prepareDetail(detail,(Transaction)obj);
                Table lov= detail.findTableByAlias(table);
                lov.setPageNumber(this.page);
                List<Criterion> lCriteria= lov.getCriteria();
                for (Criterion criterion : lCriteria) {
                    if(this.param.containsKey(criterion.getName())){
                              criterion.setValue(this.param.get(criterion.getName()));
                    }
                }
                for (Criterion criterion : lCriteria) {
                    if(criterion.getCondition().compareTo("like")==0&&(criterion.getValue()==null||criterion.getValue().toString().trim().compareTo("")==0)){
                        criterion.setValue("%");
                    }
                }
                BussinessDelegate bd=new BussinessDelegate();
                this.detail=bd.process(detail);
	}
	public JSONData(Map<String,Object>pParam){
		this.param=pParam;
	}

	@SuppressWarnings("unchecked")
	public String getJsonData() throws Exception {
		 Table lov= detail.findTableByAlias(table);
		return this.formatData(lov.getRecords());
	}
    private String formatData(Iterable<Record> pData){
       String data="{identifier:\""+identifier+"\",";
       data+="items: [";
       boolean first=true;
       for (Record record : pData) {
    	   if(first){
    		   first=false;
    	   }else{
    		   data+=",";
    	   }
		data+="{";
		data+=this.record2Jason(record);
		data+="}";
	}
       return data+"]}";
    }
    private String record2Jason(Record pRecord){
    	String data="";
    	boolean first=true;
    	for(String key:pRecord.keySet()){
    		if(first){
     		   first=false;
     	   }else{
     		   data+=",";
     	   }
    		data+=key+":\""+((Field)pRecord.get(key)).getValue()+"\"";
    	}
    	return data;
    }
 

}
