/*
 * 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.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.Type;

import com.rjconsultores.ventaboletos.enums.TipoDescontoBPe;
import com.rjconsultores.ventaboletos.enums.TipoDescontoMonitrip;

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_SEQ", sequenceName = "CATEGORIA_SEQ", allocationSize = 1)
@AuditarClasse(nome = "CATEGORIA", tela = "auditarClasse.Categoria")
@Table(name = "CATEGORIA")
public class Categoria implements Serializable, Auditavel<Categoria>{
	
	public static Integer CATEGORIA_NORMAL = 1;
	private static final long serialVersionUID = 1L;
	@Id
	@Basic(optional = false)
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "CATEGORIA_SEQ")
	@Column(name = "CATEGORIA_ID")
	private Integer categoriaId;
	@Column(name = "DESCCATEGORIA")
	private String desccategoria;
	@Column(name = "ACTIVO")
	private Boolean activo;
	// CAmpos retirados
	// @Column(name = "INDVENDEINTERNET")
	// private Boolean vendeInternet;
	// @Column(name = "INDVENDEAGENCIAWEB")
	// private Boolean vendeAgenciaWeb;
	@Column(name = "FECMODIF")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fecmodif;
	@Column(name = "USUARIO_ID")
	private Integer usuarioId;
	@AuditarLista(auditarEntidades = true, nome = "CategoriaDescuento")
	@OneToMany(mappedBy = "categoria", cascade = CascadeType.ALL)
	private List<CategoriaDescuento> categoriaDescuentoList;
	@AuditarLista(auditarEntidades = true, nome = "reservacionCategoriaList")
	@OneToMany(mappedBy = "categoria", cascade = CascadeType.ALL)
	private List<ReservacionCategoria> reservacionCategoriaList;
	
	@JoinColumn(name = "GRUPOCATEGORIA_ID", referencedColumnName = "GRUPOCATEGORIA_ID")
	@ManyToOne()
	private GrupoCategoria grupoCategoria;
	
	@OneToMany(mappedBy = "categoria", cascade = CascadeType.ALL)
	@AuditarLista(auditarEntidades = true, nome = "Categoria Orgao")
	private List<OrgaoConcedente> orgaosConcedentes;
	
	@Column(name = "INDCONFERENCIAFISICACOMISSAO")
	private Boolean indconferenciafisicacomissao;

	@Column(name = "INDEMITETERMORECUSA")
	private Boolean indemitetermorecusa;
	
	@Column(name = "CVECATEGORIA")
	private String cvecategoria;
	
	@Column(name = "DESCIMPRESIONGRATUIDADE")
	private String descImpresionGratuidade;
	
	@Column(name = "INDNAOUSAASSENTO")
	private Boolean indnaousaassento;
	
	@Column(name = "CVESISTEMA")
	private String cvesistema;
	
	@Type(type = "com.rjconsultores.ventaboletos.constantes.CustomEnumTypeHibernate", parameters = {
			@Parameter(name = "type", value = "com.rjconsultores.ventaboletos.constantes.CustomEnumTypeHibernate"),
			@Parameter(name = "class", value = "com.rjconsultores.ventaboletos.enums.TipoDescontoMonitrip"),
			@Parameter(name = "sqlType", value = "12")/*Types.VARCHAR*/,
			@Parameter(name = "enumName", value = "true")})
	@Column(name = "desconto_monitrip")
	private com.rjconsultores.ventaboletos.enums.TipoDescontoMonitrip tipoDescontoMonitrip;
	
	@Type(type = "com.rjconsultores.ventaboletos.constantes.CustomEnumTypeHibernate", parameters = {
			@Parameter(name = "type", value = "com.rjconsultores.ventaboletos.constantes.CustomEnumTypeHibernate"),
			@Parameter(name = "class", value = "com.rjconsultores.ventaboletos.enums.TipoDescontoBPe"), 
			@Parameter(name = "sqlType", value = "12")/*Types.VARCHAR*/,
			@Parameter(name = "enumName", value = "true")})
	@Column(name = "DESCONTOBPE")
	private com.rjconsultores.ventaboletos.enums.TipoDescontoBPe tipoDescontoBPe;
	
	@Column(name = "INDVENDEAPI")
	private Boolean indvendeapi;
	
	@Column(name = "INDEXIGEIDENTIDADE")
	private Boolean indExigeIdentidade;
	
	@Transient
	@NaoAuditar
	private Categoria categoriaClone;
	
	@Column(name = "INDINTEGRACAOAGR")
	private Boolean indIntegracaoAGR;
	
	@Column(name = "INDEMITEFORMAUTORIZACAO")
	private Boolean indEmiteFormularioAutorizacao;
	
	@OneToMany(mappedBy = "categoria", cascade = CascadeType.ALL)
	private List<CategoriaFormAutorizacao> formsAutorizacao = new ArrayList<CategoriaFormAutorizacao>();
	
	public Categoria() {
	}

	public Categoria(Integer categoriaId) {
		this.categoriaId = categoriaId;
	}

	public Integer getCategoriaId() {
		return categoriaId;
	}

	public void setCategoriaId(Integer categoriaId) {
		this.categoriaId = categoriaId;
	}

	public String getDesccategoria() {
		return desccategoria;
	}

	public void setDesccategoria(String desccategoria) {
		this.desccategoria = desccategoria;
	}

	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 GrupoCategoria getGrupoCategoria() {
		return grupoCategoria;
	}

	public void setGrupoCategoria(GrupoCategoria grupoCategoria) {
		this.grupoCategoria = grupoCategoria;
	}

	public List<CategoriaDescuento> getCategoriaDescuentoList() {
		// return categoriaDescuentoList;
		List<CategoriaDescuento> rcList = new ArrayList<CategoriaDescuento>();
		for (CategoriaDescuento rc : this.categoriaDescuentoList) {
			if (rc.getActivo() == Boolean.TRUE) {
				rcList.add(rc);
			}
		}
		return rcList;
	}

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

	public List<ReservacionCategoria> getReservacionCategoriaList() {
		// return reservacionCategoriaList;
		List<ReservacionCategoria> rcList = new ArrayList<ReservacionCategoria>();
		for (ReservacionCategoria rc : this.reservacionCategoriaList) {
			if (rc.getActivo() == Boolean.TRUE) {
				rcList.add(rc);
			}
		}
		return rcList;
	}

	public void setReservacionCategoriaList(List<ReservacionCategoria> reservacionCategoriaList) {
		this.reservacionCategoriaList = reservacionCategoriaList;
	}

	@Override
	public int hashCode() {
		int hash = 0;
		hash += (categoriaId != null ? categoriaId.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 Categoria)) {
			return false;
		}
		Categoria other = (Categoria) object;
		if ((this.categoriaId == null && other.categoriaId != null) || (this.categoriaId != null && !this.categoriaId.equals(other.categoriaId))) {
			return false;
		}
		return true;
	}

	@Override
	public String toString() {
		return this.getDesccategoria();
	}

	public Boolean getIndconferenciafisicacomissao() {
		return indconferenciafisicacomissao;
	}

	public void setIndconferenciafisicacomissao(Boolean indconferenciafisicacomissao) {
		this.indconferenciafisicacomissao = indconferenciafisicacomissao;
	}

	public Boolean getIndemitetermorecusa() {
		return indemitetermorecusa;
	}

	public void setIndemitetermorecusa(Boolean indemitetermorecusa) {
		this.indemitetermorecusa = indemitetermorecusa;
	}

	public String getCvecategoria() {
		return cvecategoria;
	}

	public void setCvecategoria(String cvecategoria) {
		this.cvecategoria = cvecategoria;
	}

	public String getDescImpresionGratuidade() {
		return descImpresionGratuidade;
	}

	public void setDescImpresionGratuidade(String descImpresionGratuidade) {
		this.descImpresionGratuidade = descImpresionGratuidade;
	}

	public Boolean getIndnaousaassento() {
		return indnaousaassento;
	}

	public void setIndnaousaassento(Boolean indnaousaassento) {
		this.indnaousaassento = indnaousaassento;
	}

	public List<OrgaoConcedente> getOrgaosConcedentes() {
		return orgaosConcedentes;
	}

	public void setOrgaosConcedentes(List<OrgaoConcedente> orgaosConcedentes) {
		this.orgaosConcedentes = orgaosConcedentes;
	}
		
	public String getCvesistema() {
		return cvesistema;
	}
	
	public void setCvesistema(String cvesistema) {
		this.cvesistema = cvesistema;
	}

	public TipoDescontoMonitrip getTipoDescontoMonitrip() {
		return tipoDescontoMonitrip;
	}

	public void setTipoDescontoMonitrip(TipoDescontoMonitrip tipoDescontoMonitrip) {
		this.tipoDescontoMonitrip = tipoDescontoMonitrip;
	}

	public TipoDescontoBPe getTipoDescontoBPe() {
		return tipoDescontoBPe;
	}

	public void setTipoDescontoBPe(TipoDescontoBPe tipoDescontoBPe) {
		this.tipoDescontoBPe = tipoDescontoBPe;
	}

	public Boolean getIndvendeapi() {
		return indvendeapi;
	}

	public void setIndvendeapi(Boolean indvendeapi) {
		this.indvendeapi = indvendeapi;
	}

	public Boolean getIndExigeIdentidade() {
		return indExigeIdentidade;
		
	}

	public void setIndExigeIdentidade(Boolean indExigeIdentidade) {
		this.indExigeIdentidade = indExigeIdentidade;
		
	}
	
	@Override
	public void clonar() throws CloneNotSupportedException {
		
		categoriaClone = new Categoria();
		categoriaClone = (Categoria) this.clone();
		
	}

	@Override
	public Categoria getCloneObject() throws CloneNotSupportedException {
		return categoriaClone;
	}

	@Override
	public String getTextoInclusaoExclusao() {
		return String.format("ID [%s]", getCategoriaId());
	}
	
	public Boolean getIndIntegracaoAGR() {
		return indIntegracaoAGR == null ? false : indIntegracaoAGR;
	}

	public void setIndIntegracaoAGR(Boolean indIntegracaoAGR) {
		this.indIntegracaoAGR = indIntegracaoAGR;
	}

	public Boolean getIndEmiteFormularioAutorizacao() {
		return indEmiteFormularioAutorizacao == null ? false : indEmiteFormularioAutorizacao;
	}

	public void setIndEmiteFormularioAutorizacao(Boolean indEmiteFormularioAutorizacao) {
		this.indEmiteFormularioAutorizacao = indEmiteFormularioAutorizacao;
	}

	public List<CategoriaFormAutorizacao> getFormsAutorizacao() {
		return formsAutorizacao;
	}

	public void setFormsAutorizacao(List<CategoriaFormAutorizacao> formsAutorizacao) {
		this.formsAutorizacao = formsAutorizacao;
	}
	
	
}
