package com.fp.dto.query;

import com.fp.dto.AbstractDataTransport;
import com.fp.dto.data.SaveData;

/**
 * Clase de transporte, que se asocia a un querybena con las restricciones a aplicar 
 * en una sentencia SQL.
 * @author Jorge Vaca
 * @version 2.1
 */
public class QueryCriteria extends AbstractDataTransport{
	/**Version de la clase.*/
	private static final long serialVersionUID = 1L;
	/**Nombrte del campo de la tabla*/
	private String property;
	/**Criterio de la restriccion, =, != , like, >=  etc.*/
	private String operation;
	/**Valor de la restriccion.*/
	private Object value;
	/**Indice del orden en las sentencias.*/
	private int order=0;
	
    @Override
    public Object cloneMe() throws CloneNotSupportedException {
    	QueryCriteria p = (QueryCriteria) this.clone();
    	return p;
    }	
	/**
	 * Entrega el valor de: property
	 * @return String
	 */
	public String getProperty() {
		return property;
	}
	/**
	 * Fija el valor de: property
	 * @param property 
	 */
	public void setProperty(String property) {
		this.property = property;
		if(this.value != null){
		    this.setLogData(property, value);
		}
	}
	/**
	 * Entrega el valor de: operation
	 * @return String
	 */
	public String getOperation() {
		return operation;
	}
	/**
	 * Fija el valor de: operation
	 * @param operation 
	 */
	public void setOperation(String operation) {
		this.operation = operation;
	}
	/**
	 * Entrega el valor de: value
	 * @return Object
	 */
	public Object getValue() {
		if(value instanceof Integer){
			return Long.parseLong(value.toString());
		}
		return value;
	}
	
	/**
	 * Fija el valor de: value
	 * @param value 
	 */
	public void setValue(Object value) {	
		this.value = value;
	      if(this.property != null){
	            this.setLogData(property, value);
	        }
	}
	/**
	 * Entrega el valor de: order
	 * @return int
	 */
	public int getOrder() {
		return order;
	}
	/**
	 * Fija el valor de: order
	 * @param order 
	 */
	public void setOrder(int order) {
		this.order = order;
	}
	public QueryCriteria(){
		
	}
	
	/**
	 * Crea una instancia de QueryCriteria.
	 * @param property  Nombre del campo a aplicar la restriccion.
	 * @param operation Condicion =, != , >, >=  etc
	 * @param value  Valor de la restriccion.
	 */
	public QueryCriteria(String property, String operation, Object value) {
		this(property,operation,value,0);
	}
	
	/**
	 * Crea una instancia de QueryCriteria, la condicion de la restriccion es like.
	 * @param property  Nombre del campo a aplicar la restriccion. 
	 * @param value  Valor de la restriccion.
	 */
	public QueryCriteria(String property, Object value) {
		this(property,"like",value,0);
	}
	
	/**
	 * Crea una instancia de QueryCriteria
	 * @param property  Nombre del campo.
	 * @param operation Condicion =, != , >, >=  etc
	 * @param value     Valor de la restriccion.
	 * @param order     Orden de presentacion en la consulta.
	 */
	public QueryCriteria(String property, String operation, Object value, int order) {		
		this.property = property;
		this.operation = operation;
		this.value = value;
		this.order = order;
		this.setLogData(property, value);
	}
	
	private void setLogData(String property,Object value) {
	    try {
	        this.setPersoncode(property, value);
	        this.setAccount(property, value);
	        this.setSolicitudenumber(property, value);            
        } catch (Exception e) {
            //no hacer nada
        }
	}
	
	/**
	 * Verifica que el nombre del campo sea PERSONCODE, y almacena en los datos de parametros del log el valor del campo.
	 * @param property  Nombre del campo a verificar. 
	 * @param value Valor del campo.
	 * @throws Exception
	 */
	private void setPersoncode(String property,Object value) throws Exception {	    
        String field = "PERSONCODE";
        if (!property.toUpperCase().contains(field) ){
            return;
        }
        this.setData(property, field, value);
    }

	   /**
     * Verifica que el nombre del campo sea PERSONCODE, y almacena en los datos de parametros del log el valor del campo.
     * @param property  Nombre del campo a verificar. 
     * @param value Valor del campo.
     * @throws Exception
     */
    private void setAccount(String property,Object value) throws Exception {
        String field = "ACCOUNT";
        if (!property.toUpperCase().contains(field) ){
            return;
        }
        this.setData(property, field, value);
    }
    
    /**
     * Verifica que el nombre del campo sea PERSONCODE, y almacena en los datos de parametros del log el valor del campo.
     * @param property  Nombre del campo a verificar. 
     * @param value Valor del campo.
     * @throws Exception
     */
    private void setSolicitudenumber(String property,Object value) throws Exception {
        String field = "SOLICITUDNUMBER";
        if (!property.toUpperCase().contains(field) ){
            return;
        }
        this.setData(property, field, value);
    }
    
    private void setData(String property,String field,Object value) throws Exception {
        if( SaveData.getMap().get(field) != null) {
            return;
        }
        if (property.indexOf('.') > 0) {
            property = property.substring(property.indexOf('.')+1);
        }
        if(property.toUpperCase().compareTo(field) == 0){
            SaveData.getMap().put(field, value);    
        }                
    }
    
}
