package com.fp.dto.save;

import java.util.ArrayList;
import java.util.List;

import com.fp.dto.AbstractData;
import com.fp.dto.AbstractDataTransport;

public class SaveBean extends AbstractData {

    private static final long serialVersionUID = 1L;

    /** Alias del bean, utilizado como key en los map, si no llega el alias, el key es el nombre del bean. */
    private String beanAlias;

    /** Clase asociada al bean. */
    private String beanName;

    /** Lista de registros modificados de un bean asociado a una tabla. */
    private List<Object> modifiedRecords = new ArrayList<Object>();

    /** Lista de registros a eliminar de la basse de datos. */
    private List<Object> deletedRecords = new ArrayList<Object>();

    /** Objeto asociado a un registro de una tabla a insertar o actualizar en la base de datos. */
    private Object modifiedObject;

    /** Objeto asociado a un registro de una tabla a eliminar la base de datos. */
    private Object deletedObject;

    /** Orden del insert o update del objeto cuando se envia la base de datos. */
    private Integer position;

    /** true, indica que el registro se almacena en la base de datos, false no se almacena. */
    private boolean save = true;

    /**
     * Crea una instancia de SaveBean.
     */
    public SaveBean() {
    }

    /**
     * Crea una instancia de SaveBean, dado el alias del bean.
     * 
     * @param beanName Alias del bean.
     */
    public SaveBean(String beanName) {
        this.beanName = beanName;
        this.beanAlias = beanName;
    }

    /**
     * Entrega el valor de: beanAlias
     * 
     * @return String
     */
    public String getBeanAlias() {
        if (beanAlias == null) {
            return this.getBeanName();
        }
        return beanAlias;
    }

    /**
     * Fija el valor de: beanAlias
     * 
     * @param beanAlias
     */
    public void setBeanAlias(String beanAlias) {
        this.beanAlias = beanAlias;
    }

    /**
     * Entrega el valor de: beanName
     * 
     * @return String
     */
    public String getBeanName() {
        return beanName;
    }

    /**
     * Fija el valor de: beanName
     * 
     * @param beanName
     */
    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }

    /**
     * Adiciona un elemento a la lista de objetos modificados.
     * 
     * @param pObject Objeto a adicionar a la lista de registros modificados a enviar a almacenar en la base de datos.
     * @throws Exception
     */
    public void addModifiedObject(Object pObject) throws Exception {
        modifiedRecords.add(pObject);
    }

    public void addModifiedObject(List<AbstractDataTransport> ldata) throws Exception {
    	if(!ldata.isEmpty() && ldata.size() == 1){
    		modifiedObject = ldata.get(0) ;
    		return;
    	}
        for (AbstractDataTransport obj : ldata) {
            obj.addAddtionalInfo("isnew", "Y");
            modifiedRecords.add(obj);
        }
    }

    public void addModified(List<Object> ldata, boolean isForm) throws Exception {
    	if(!ldata.isEmpty() && ldata.size() == 1 && isForm){
    		modifiedObject = ldata.get(0) ;
    		return;
    	}
        for (Object object : ldata) {
        	AbstractDataTransport obj = (AbstractDataTransport)object;
            modifiedRecords.add(obj);
        }
    }
    
    public void addInsertObject(List<AbstractDataTransport> ldata, boolean isForm) throws Exception {
    	if(!ldata.isEmpty() && ldata.size() == 1 && isForm){
    		modifiedObject = ldata.get(0) ;
    		return;
    	}
        for (AbstractDataTransport obj : ldata) {
        	obj.addAddtionalInfo("isnew", "Y");	        	
            modifiedRecords.add(obj);
        }
    }

    /**
     * Entrega el valor de: modifiedRecords
     * 
     * @return List<Object>
     */
    public List<Object> getModifiedRecords() {
        return modifiedRecords;
    }

    /**
     * Fija el valor de: modifiedRecords
     * 
     * @param modifiedRecords
     */
    public void setModifiedRecords(List<Object> modifiedRecords) {
        this.modifiedRecords = modifiedRecords;
    }

    /**
     * Entrega el valor de: deletedRecords
     * 
     * @return List<Object>
     */
    public List<Object> getDeletedRecords() {
        return deletedRecords;
    }

    /**
     * Fija el valor de: deletedRecords
     * 
     * @param deletedRecords
     */
    public void setDeletedRecords(List<Object> deletedRecords) {
        this.deletedRecords = deletedRecords;
    }

    /**
     * Entrega el valor de: modifiedObject
     * 
     * @return Object
     */
    public Object getModifiedObject() {
        return modifiedObject;
    }

    /**
     * Fija el valor de modifiedObject
     * 
     * @param modifiedObject value to set
     */
    public void setModifiedObject(Object modifiedObject) {
        this.modifiedObject = modifiedObject;
    }

    /**
     * Entrega el valor de: deletedObject
     * 
     * @return Object
     */
    public Object getDeletedObject() {
        return deletedObject;
    }

    /**
     * Fija el valor de deletedObject
     * 
     * @param deletedObject value to set
     */
    public void setDeletedObject(Object deletedObject) {
        this.deletedObject = deletedObject;
    }

    /**
     * Entrega el valor de: position
     * 
     * @return Integer
     */
    public Integer getPosition() {
        return position;
    }

    /**
     * Fija el valor de: position
     * 
     * @param position
     */
    public void setPosition(Integer position) {
        this.position = position;
    }

    /**
     * Entrega el valor de: save
     * 
     * @return the save
     */
    public boolean isSave() {
        return save;
    }

    /**
     * Fija el valor de: save
     * 
     * @param save the save to set
     */
    public void setSave(boolean save) {
        this.save = save;
    }

    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "SaveBean:" + this.beanName + " d:" + this.deletedRecords.size() + " m:" + this.modifiedRecords.size();
    }

}
