/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.entidad;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.apache.commons.lang.BooleanUtils;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;

import br.com.rjconsultores.auditador.annotations.AuditarAtributo;
import br.com.rjconsultores.auditador.annotations.AuditarClasse;
import br.com.rjconsultores.auditador.annotations.AuditarLista;
import br.com.rjconsultores.auditador.annotations.NaoAuditar;
import br.com.rjconsultores.auditador.interfaces.Auditavel;

/**
 *
 * @author Administrador
 */
@Entity
@SequenceGenerator(name = "CATEGORIA_CTRL_SEQ", sequenceName = "CATEGORIA_CTRL_SEQ", allocationSize = 1)
@AuditarClasse(nome = "CategoriaCtrl", tela = "auditarClasse.CategoriaCtrl")
@Table(name = "CATEGORIA_CTRL")
public class CategoriaCtrl implements Serializable, Cloneable, Auditavel<CategoriaCtrl>{

    public final static Integer[] idsCategoriasNoVisible = {1};
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "CATEGORIA_CTRL_SEQ")
    @Column(name = "CATEGORIACTRL_ID")
    private Integer categoriactrlId;
    @JoinColumn(name = "EMPRESA_ID")
    @OneToOne
    private Empresa empresa;
    @Column(name = "ACTIVO")
    private Boolean activo;
    @Column(name = "DESCRICAO")
    private String descricao;
    @AuditarAtributo(nome = "Ult.Modif")
    @Basic(optional = false)
    @Column(name = "FECMODIF")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecmodif;
    @Column(name = "USUARIO_ID")
    private Integer usuarioId;
    @AuditarLista(auditarEntidades = true, nome = "categoriaDescuentoList")
    @OneToMany(mappedBy = "categoriaCtrl", cascade = CascadeType.ALL)
    private List<CategoriaDescuento> categoriaDescuentoList;
    @AuditarLista(auditarEntidades = true, nome = "categoriaClaseList")
    @OneToMany(mappedBy = "categoriaCtrl", cascade = CascadeType.ALL)
    private List<CategoriaClase> categoriaClaseList;
    @AuditarLista(auditarEntidades = true, nome = "categoriaMarcaList")
    @OneToMany(mappedBy = "categoriaCtrl", cascade = CascadeType.ALL)
    private List<CategoriaMarca> categoriaMarcaList;
    @AuditarLista(auditarEntidades = true, nome = "categoriaCorridaList")
    @OneToMany(mappedBy = "categoriaCtrl", cascade = CascadeType.ALL)
    @NotFound(action=NotFoundAction.IGNORE)
    private List<CategoriaCorrida> categoriaCorridaList;
    @AuditarLista(auditarEntidades = true, nome = "categoriaMercadoList")
    @OneToMany(mappedBy = "categoriaCtrl", cascade = CascadeType.ALL)
    private List<CategoriaMercado> categoriaMercadoList;
    @AuditarLista(auditarEntidades = true, nome = "categoriaOrgaoList")
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "categoriaCtrl")
    private List<CategoriaOrgao> categoriaOrgaoList;
    @AuditarLista(auditarEntidades = true, nome = "categoriaRutaList")
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "categoriaCtrl")
    private List<CategoriaRuta> categoriaRutaList;
    @AuditarLista(auditarEntidades = true, nome = "categoriaRutaExcecaoList")
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "categoriaCtrl")
    private List<CategoriaRutaExcecao> categoriaRutaExcecaoList;
    
	@Transient
	@NaoAuditar
	private CategoriaCtrl categoriaCtrlClone;
    public CategoriaCtrl() {

    }

    public CategoriaCtrl(Integer categoriactrlId) {
        this.categoriactrlId = categoriactrlId;
    }

    public CategoriaCtrl(Integer categoriactrlId, Date fecmodif) {
        this.categoriactrlId = categoriactrlId;
        this.fecmodif = fecmodif;
    }

    public Integer getCategoriactrlId() {
        return categoriactrlId;
    }

    public void setCategoriactrlId(Integer categoriactrlId) {
        this.categoriactrlId = categoriactrlId;
    }

    public Empresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }

    public Boolean getActivo() {
        return activo;
    }

    public void setActivo(Boolean activo) {
        this.activo = activo;
    }

    public Date getFecmodif() {
        return fecmodif;
    }

    public void setFecmodif(Date fecmodif) {
        this.fecmodif = fecmodif;
    }

    public Integer getUsuarioId() {
        return usuarioId;
    }

    public void setUsuarioId(Integer usuarioId) {
        this.usuarioId = usuarioId;
    }
    public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public List<CategoriaDescuento> getCategoriaDescuentoList() {
        List<CategoriaDescuento> tmp = new ArrayList<CategoriaDescuento>();
        if (categoriaDescuentoList != null) {
            for (CategoriaDescuento cm : this.categoriaDescuentoList) {
                if (cm.getActivo()) {
                    tmp.add(cm);
                }
            }
        }

        return tmp;
    }

    public void setCategoriaDescuentoList(List<CategoriaDescuento> categoriaDescuentoList) {
        this.categoriaDescuentoList = categoriaDescuentoList;
    }

    public List<CategoriaClase> getCategoriaClaseList() {
        //return categoriaClaseList;
        List<CategoriaClase> tmp = new ArrayList<CategoriaClase>();
        if (categoriaClaseList != null) {
            for (CategoriaClase cm : this.categoriaClaseList) {
                if (cm.getActivo()) {
                    tmp.add(cm);
                }
            }
        }

        return tmp;
    }

    public void setCategoriaClaseList(List<CategoriaClase> categoriaClaseList) {
        this.categoriaClaseList = categoriaClaseList;
    }

    public List<CategoriaOrgao> getCategoriaOrgaoList() {
        //return categoriaMarcaList;
        List<CategoriaOrgao> tmp = new ArrayList<CategoriaOrgao>();
        if (categoriaMercadoList != null) {
            for (CategoriaOrgao cm : this.categoriaOrgaoList) {
                if (cm.getActivo()) {
                    tmp.add(cm);
                }
            }
        }

        return tmp;
    }

    public List<CategoriaRuta> getCategoriaRutaList() {
        List<CategoriaRuta> tmp = new ArrayList<CategoriaRuta>();
        if (categoriaRutaList != null) {
            for (CategoriaRuta cm : this.categoriaRutaList) {
                if (cm.getActivo()) {
                    tmp.add(cm);
                }
            }
        }

        return tmp;
    }
    
    public List<CategoriaRutaExcecao> getCategoriaRutaExcecaoList() {
        List<CategoriaRutaExcecao> tmp = new ArrayList<CategoriaRutaExcecao>();
        if (categoriaRutaExcecaoList != null) {
            for (CategoriaRutaExcecao cm : categoriaRutaExcecaoList) {
                if (cm.getActivo()) {
                    tmp.add(cm);
                }
            }
        }

        return tmp;
    }

    public void setCategoriaorgaoList(List<CategoriaOrgao> categoriaOrgaoList) {
        this.categoriaOrgaoList = categoriaOrgaoList;
    }

    public void setCategoriarutaList(List<CategoriaRuta> categoriaRutaList) {
        this.categoriaRutaList = categoriaRutaList;
    }
    
    public void setCategoriarutaExcecaoList(List<CategoriaRutaExcecao> categoriaRutaExcecaoList) {
        this.categoriaRutaExcecaoList = categoriaRutaExcecaoList;
    }

    public List<CategoriaMarca> getCategoriaMarcaList() {
        //return categoriaMarcaList;
        List<CategoriaMarca> tmp = new ArrayList<CategoriaMarca>();
        if (categoriaMercadoList != null) {
            for (CategoriaMarca cm : this.categoriaMarcaList) {
                if (cm.getActivo()) {
                    tmp.add(cm);
                }
            }
        }

        return tmp;
    }

    public void setCategoriaMarcaList(List<CategoriaMarca> categoriaMarcaList) {
        this.categoriaMarcaList = categoriaMarcaList;
    }

    public List<CategoriaCorrida> getCategoriaCorridaList() {
        //return categoriaCorridaList;
        List<CategoriaCorrida> tmp = new ArrayList<CategoriaCorrida>();
        if (categoriaCorridaList != null) {
            for (CategoriaCorrida cm : this.categoriaCorridaList) {
                if (cm.getActivo()) {
                    tmp.add(cm);
                }
            }
        }

        return tmp;
    }

    public void setCategoriaCorridaList(List<CategoriaCorrida> categoriaCorridaList) {
        this.categoriaCorridaList = categoriaCorridaList;
    }

    public List<CategoriaMercado> getCategoriaMercadoList() {
        List<CategoriaMercado> tmp = new ArrayList<CategoriaMercado>();
        if (categoriaMercadoList != null) {
            for (CategoriaMercado cm : this.categoriaMercadoList) {
                if (cm.getActivo()) {
                    tmp.add(cm);
                }
            }
        }

        return tmp;
    }

    public void setCategoriaMercadoList(List<CategoriaMercado> categoriaMercadoList) {
        this.categoriaMercadoList = categoriaMercadoList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (categoriactrlId != null ? categoriactrlId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof CategoriaCtrl)) {
            return false;
        }
        CategoriaCtrl other = (CategoriaCtrl) object;
        if ((this.categoriactrlId == null && other.categoriactrlId != null) || (this.categoriactrlId != null && !this.categoriactrlId.equals(other.categoriactrlId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.rjconsultores.ventaboletos.entidad.CategoriaCtrl[categoriactrlId=" + categoriactrlId + "]";
    }
    
	@Override
	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}

	public List<CategoriaMarca> addNuevoCloneCategoriaMarca(List<CategoriaMarca> lsCategoriaMarca, CategoriaCtrl nuevo) {

		for (CategoriaMarca categoriaMarca : lsCategoriaMarca) {
			categoriaMarca.setCategoriaCtrl(nuevo);
			categoriaMarca.setCategoriamarcaId(null);
		}
		return lsCategoriaMarca;
	}

	public List<CategoriaOrgao> addNuevoCloneCategoriaOrgao(List<CategoriaOrgao> lsCategoriaOrgao,  CategoriaCtrl nuevo) {
		
		for (CategoriaOrgao categoriaOrgao : lsCategoriaOrgao) {
			categoriaOrgao.setCategoriaCtrl(nuevo);
			categoriaOrgao.setCategoriaorgaoId(null);
		}
		return lsCategoriaOrgao;
	}

	public List<CategoriaRuta> addNuevoCloneCategoriaRuta(List<CategoriaRuta> lsCategoriaRuta, CategoriaCtrl nuevo) {
		for (CategoriaRuta categoriaRuta : lsCategoriaRuta)  {
			categoriaRuta.setCategoriaCtrl(nuevo);
			categoriaRuta.setCategoriarutaId(null);
		}
		return lsCategoriaRuta;
	}
	
	public List<CategoriaRutaExcecao> addNuevoCloneCategoriaRutaExcecao(List<CategoriaRutaExcecao> lsCategoriaRutaExcecao, CategoriaCtrl nuevo) {
		for (CategoriaRutaExcecao categoriaRutaExcecao : lsCategoriaRutaExcecao)  {
			categoriaRutaExcecao.setCategoriaCtrl(nuevo);
			categoriaRutaExcecao.setCategoriaRutaExcecaoId(null);
		}
		return lsCategoriaRutaExcecao;
	}

	public List<CategoriaCorrida> addNuevoCloneCategoriaCorrida(List<CategoriaCorrida> lsCategoriaCorrida, CategoriaCtrl nuevo) {
		for (CategoriaCorrida categoriaCorrida : lsCategoriaCorrida) {
			categoriaCorrida.setCategoriaCtrl(nuevo);
			categoriaCorrida.setCategoriaCorrida(null);
		}
		return lsCategoriaCorrida;
	}

	public List<CategoriaClase> addNuevoCloneCategoriaClase(List<CategoriaClase> lsCategoriaClase, CategoriaCtrl nuevo) {
		for (CategoriaClase categoriaClase : lsCategoriaClase)  {
			categoriaClase.setCategoriaCtrl(nuevo);
			categoriaClase.setCategoriaclaseId(null);
		}
		return lsCategoriaClase;
	}

	public List<CategoriaDescuento> addNuevoCloneCategoriaDescuento(List<CategoriaDescuento> lsCategoriaDescuento, CategoriaCtrl nuevo) {
		for (CategoriaDescuento categoriaDescuento : lsCategoriaDescuento)  {
			categoriaDescuento.setCategoriaCtrl(nuevo);
			categoriaDescuento.setCategoriadescuentoId(null);
		}
		return lsCategoriaDescuento;
	}

	public List<CategoriaMercado> addNuevoCloneCategoriaMercado(List<CategoriaMercado> lsCategoriaMercado, CategoriaCtrl nuevo) {
		for (CategoriaMercado categoriaMercado : lsCategoriaMercado) {
			categoriaMercado.setCategoriaCtrl(nuevo);
			categoriaMercado.setCategoriamercadoId(null);
		}
		return lsCategoriaMercado;
	}
	

	@Override
	public void clonar() throws CloneNotSupportedException {
		categoriaCtrlClone = new CategoriaCtrl();
		categoriaCtrlClone = (CategoriaCtrl) this.clone();
		
		if(this.getCategoriaDescuentoList() != null) {
			List<CategoriaDescuento> lsClones = new ArrayList<CategoriaDescuento>();
			for (CategoriaDescuento categoriaDescuento : this.getCategoriaDescuentoList()) {
				if(BooleanUtils.isTrue(categoriaDescuento.getActivo())) {
					categoriaDescuento.clonar();
					lsClones.add(categoriaDescuento.getCloneObject());
				}
			}
			categoriaCtrlClone.setCategoriaDescuentoList(lsClones);
		}
		if(this.getCategoriaOrgaoList() != null) {
			List<CategoriaOrgao> lsClones = new ArrayList<CategoriaOrgao>();
			for (CategoriaOrgao categoriaOrgao : this.getCategoriaOrgaoList()) {
				if(BooleanUtils.isTrue(categoriaOrgao.getActivo())) {
					categoriaOrgao.clonar();
					lsClones.add(categoriaOrgao.getCloneObject());
				}
			}
			categoriaCtrlClone.setCategoriaorgaoList(lsClones);
		}
		if(this.getCategoriaMarcaList() != null) {
			List<CategoriaMarca> lsClones = new ArrayList<CategoriaMarca>();
			for (CategoriaMarca categoriaMarca : this.getCategoriaMarcaList()) {
				if(BooleanUtils.isTrue(categoriaMarca.getActivo())) {
					categoriaMarca.clonar();
					lsClones.add(categoriaMarca.getCloneObject());
				}
			}
			categoriaCtrlClone.setCategoriaMarcaList(lsClones);
		}
		if(this.getCategoriaCorridaList() != null) {
			List<CategoriaCorrida> lsClones = new ArrayList<CategoriaCorrida>();
			for (CategoriaCorrida categoriaCorrida : this.getCategoriaCorridaList()) {
				if(BooleanUtils.isTrue(categoriaCorrida.getActivo())) {
					categoriaCorrida.clonar();
					lsClones.add(categoriaCorrida.getCloneObject());
				}
			}
			categoriaCtrlClone.setCategoriaCorridaList(lsClones);
		}
		
		if(this.getCategoriaClaseList() != null) {
			List<CategoriaClase> lsClones = new ArrayList<CategoriaClase>();
			for (CategoriaClase categoriaClase : this.getCategoriaClaseList()) {
				if(BooleanUtils.isTrue(categoriaClase.getActivo())) {
					categoriaClase.clonar();
					lsClones.add(categoriaClase.getCloneObject());
				}
			}
			categoriaCtrlClone.setCategoriaClaseList(lsClones);
		}
		
		if(this.getCategoriaRutaList() != null) {
			List<CategoriaRuta> lsClones = new ArrayList<CategoriaRuta>();
			for (CategoriaRuta categoriaRuta: this.getCategoriaRutaList()) {
				if(BooleanUtils.isTrue(categoriaRuta.getActivo())) {
					categoriaRuta.clonar();
					lsClones.add(categoriaRuta.getCloneObject());
				}
			}
			categoriaCtrlClone.setCategoriarutaList(lsClones);
		}
		
		if(this.getCategoriaRutaExcecaoList() != null) {
			List<CategoriaRutaExcecao> lsClones = new ArrayList<CategoriaRutaExcecao>();
			for (CategoriaRutaExcecao categoriaRutaExcecacao: this.getCategoriaRutaExcecaoList()) {
				if(BooleanUtils.isTrue(categoriaRutaExcecacao.getActivo())) {
					categoriaRutaExcecacao.clonar();
					lsClones.add(categoriaRutaExcecacao.getCloneObject());
				}
			}
			categoriaCtrlClone.setCategoriarutaExcecaoList(lsClones);
		}
		
		if(this.getCategoriaMercadoList() != null) {
			List<CategoriaMercado> lsClones = new ArrayList<CategoriaMercado>();
			for (CategoriaMercado categoriaMercado: this.getCategoriaMercadoList()) {
				if(BooleanUtils.isTrue(categoriaMercado.getActivo())) {
					categoriaMercado.clonar();
					lsClones.add(categoriaMercado.getCloneObject());
				}
			}
			categoriaCtrlClone.setCategoriaMercadoList(lsClones);
		}
	}

	@Override
	public CategoriaCtrl getCloneObject() throws CloneNotSupportedException {
		return categoriaCtrlClone;
	}

	@Override
	public String getTextoInclusaoExclusao() {
		return String.format("ID [%s]", getCategoriactrlId());
	}

}
