package com.rjconsultores.ventaboletos.entidad;

import java.io.Serializable;
import java.math.BigDecimal;
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.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.apache.commons.lang.BooleanUtils;
import org.hibernate.annotations.Where;

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

@AuditarClasse(nome = "OrgaoConcedente", tela = "auditarClasse.OrgaoConcedente")
@Entity
@SequenceGenerator(name = "ORGAO_CONCEDENTE_SEQ", sequenceName = "ORGAO_CONCEDENTE_SEQ", allocationSize = 1)
@Table(name = "ORGAO_CONCEDENTE")
public class OrgaoConcedente implements Serializable, Auditavel<OrgaoConcedente> {

	private static final long serialVersionUID = 1L;
	public final static Integer CODIGO_ARTESP = 21;
	public final static Integer CODIGO_ANTT = 3;
	@AuditarID
	@Id
	@Basic(optional = false)
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "ORGAO_CONCEDENTE_SEQ")
	@Column(name = "ORGAOCONCEDENTE_ID")
	private Integer orgaoConcedenteId;
	@AuditarAtributo(nome = "DESC ORGAO")
	@Column(name = "DESCORGAO")
	private String descOrgao;
	@Column(name = "INDDEFAULTSEGURO")
	private Boolean indDefaultSeguro;
	@Column(name = "INDSUBSEGURO")
	private Boolean indSubSeguro;
	@Column(name = "ACTIVO")
	private Boolean activo;
	@Column(name = "FECMODIF")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fecmodif;
	@Column(name = "USUARIO_ID")
	private Integer usuarioId;
	@AuditarLista(auditarEntidades = true, nome = "CategoriaOrgao")
	@OneToMany(mappedBy = "orgao")
	private List<CategoriaOrgao> categoriaOrgaoList;
	@Column(name = "INDNOMDOCOBLIGATORIO")
	private Boolean indNomDocObligatorio;
	@AuditarLista(auditarEntidades = true, nome = "OrgaoCancelacion")
	@OneToMany(mappedBy = "orgao")
	private List<OrgaoCancelacion> orgaoCancelacionList;
	@AuditarAtributo(nome = "INDICE PEDADIO")
	@Column(name = "INDICEPEAJE")
	private BigDecimal indicePeaje;
	@AuditarAtributo(nome = "Idade Idoso")
	@Column(name = "IDADE_IDOSO")
	private Integer idadeIdoso;
	@Column(name = "IDADE_MINIMA")
	private Integer idadeMinima;
	@JoinColumn(name = "CATEGORIA_ID", referencedColumnName = "CATEGORIA_ID")
	@ManyToOne()
	private Categoria categoria;
	@Column(name = "INDUTILIZAICMS")
	private Boolean indUtilizaICMS;
	@Column(name = "INDMULTATODASREMARCACOES")
	private Boolean indmultatodasremarcacoes;
	@Column(name = "INDVALDOCOBLIGATORIOMONITRIP")
	private Boolean indValDocObligatorioMonitrip;
	@Column(name = "INDVALDOCOBLIGATORIOEMBARCADA")
	private Boolean indValDocObligatorioEmbarcada;
	@Column(name = "TAXACONVENIENCIAPORC")
	private BigDecimal taxaConvenienciaPorc;
	@Column(name = "MAXTAXACONVENIENCIAPORTARIFA")
	private BigDecimal maximoTaxaConvenienciaPorTarifa;
	@Column(name = "MENSAGEMRECIBOTXCONVENIENCIA")
	private String mensagemReciboTaxaDeConveniencia;

	@OneToMany(mappedBy = "orgaoConcedente", cascade = CascadeType.ALL)
	@NaoAuditar
	private List<ClasseIndicePeaje> classesIndicePeaje;
	
	@AuditarLista(auditarEntidades = true, nome = "OrgaoEmpParam")
	@OneToMany(mappedBy = "orgaoConcedente", cascade = CascadeType.ALL)
	@Where(clause = "activo=1")
	private List<OrgaoEmpParam> orgaoEmpParams;
	
	@Column(name = "COEFICIENTETARIFA")
	private BigDecimal coeficiente;
	
	@Column(name = "MENSAGEM_INTRANSFERIVEL")
	private String mensagemPassagemIntrasferivel;
	
	@Column(name = "INDNAOIMPPOLCONSUMIDOR")
	private Boolean indNaoImprimirPoliticasConsumidor;
	
	@Column(name = "TAXA_CONVENIENCIA_SVI")
	private BigDecimal taxaConvenienciaSVI;
	
	@Transient
	@NaoAuditar
	private OrgaoConcedente orgaoConcedenteClone;
	
	@AuditarAtributo(nome = "Idade Minima Jovem")
	@Column(name = "IDADE_MIN_JOVEM")
	private Integer idadeMinimaJovem;
	
	@AuditarAtributo(nome = "Idade Maxima Jovem")
	@Column(name = "IDADE_MAX_JOVEM")
	private Integer idadeMaximaJovem;
	
	
	@Column(name = "CUSTOMIZARODAPECUPOMEMBARQUE")
    @NaoAuditar
	private String customizacaoRodapeCupomDeEmbarque;
	
	
	@Column(name = "CAMPOCUSTOMVOUCHER")
    @NaoAuditar
	private String campoCustomVoucher;
	
	@Column(name = "INDIMPRCUPOMVOUCHERCUSTOMIZADO")
    @NaoAuditar
	private Boolean indImprimeCupomVoucherCustomizado;
	

	public void addParametro(OrgaoCancelacion param) {
		this.orgaoCancelacionList.add(param);
	}

	public void removeParametro(OrgaoCancelacion param) {
		this.orgaoCancelacionList.remove(param);
	}

	public Integer getOrgaoConcedenteId() {
		return orgaoConcedenteId;
	}

	public void setOrgaoConcedenteId(Integer orgaoConcedenteId) {
		this.orgaoConcedenteId = orgaoConcedenteId;
	}

	public String getDescOrgao() {
		return descOrgao;
	}

	public void setDescOrgao(String descOrgao) {
		this.descOrgao = descOrgao;
	}

	public Boolean getIndSubSeguro() {
		return indSubSeguro;
	}

	public void setIndSubSeguro(Boolean indSubSeguro) {
		this.indSubSeguro = indSubSeguro;
	}

	public Boolean getIndDefaultSeguro() {
		return indDefaultSeguro;
	}

	public void setIndDefaultSeguro(Boolean indDefaultSeguro) {
		this.indDefaultSeguro = indDefaultSeguro;
	}

	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 List<CategoriaOrgao> getCategoriaOrgaoList() {
		return categoriaOrgaoList;
	}

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

	public Boolean getIndNomDocObligatorio() {
		return BooleanUtils.isTrue(indNomDocObligatorio);
	}

	public void setIndNomDocObligatorio(Boolean indNomDocObligatorio) {
		this.indNomDocObligatorio = indNomDocObligatorio;
	}

	public List<OrgaoCancelacion> getOrgaoCancelacionList() {
		return orgaoCancelacionList;
	}

	public void setOrgaoCancelacionList(List<OrgaoCancelacion> orgaoCancelacionList) {
		this.orgaoCancelacionList = orgaoCancelacionList;
	}

	public BigDecimal getIndicePeaje() {
		return indicePeaje;
	}

	public void setIndicePeaje(BigDecimal indicePeaje) {
		this.indicePeaje = indicePeaje;
	}

	public Integer getIdadeIdoso() {
		return idadeIdoso;
	}

	public void setIdadeIdoso(Integer idadeIdoso) {
		this.idadeIdoso = idadeIdoso;
	}

	public List<ClasseIndicePeaje> getClassesIndicePeaje() {
		List<ClasseIndicePeaje> lsClasseIndicePeaje = new ArrayList<ClasseIndicePeaje>();
		for (ClasseIndicePeaje classeIndicePeaje : this.classesIndicePeaje) {
			if (classeIndicePeaje.getActivo()) {
				lsClasseIndicePeaje.add(classeIndicePeaje);
			}
		}
		return this.classesIndicePeaje = lsClasseIndicePeaje;
	}

	public void setClassesIndicePeaje(List<ClasseIndicePeaje> classesIndicePeaje) {
		this.classesIndicePeaje = classesIndicePeaje;
	}

	public Integer getIdadeMinima() {
		return idadeMinima;
	}

	public void setIdadeMinima(Integer idadeMinima) {
		this.idadeMinima = idadeMinima;
	}

	public Categoria getCategoria() {
		return categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	@Override
	public String toString() {
		return descOrgao;
	}

	public Boolean getIndUtilizaICMS() {
		return indUtilizaICMS;
	}

	public void setIndUtilizaICMS(Boolean indUtilizaICMS) {
		this.indUtilizaICMS = indUtilizaICMS;
	}

	public List<OrgaoEmpParam> getOrgaoEmpParams() {
		return orgaoEmpParams;
	}

	public void setOrgaoEmpParams(List<OrgaoEmpParam> orgaoEmpParams) {
		this.orgaoEmpParams = orgaoEmpParams;
	}

	public Boolean getIndmultatodasremarcacoes() {
		return indmultatodasremarcacoes;
	}

	public void setIndmultatodasremarcacoes(Boolean indmultatodasremarcacoes) {
		this.indmultatodasremarcacoes = indmultatodasremarcacoes;
	}

	public Boolean getIndValDocObligatorioMonitrip() {
		return BooleanUtils.toBoolean(indValDocObligatorioMonitrip);
	}

	public void setIndValDocObligatorioMonitrip(Boolean indValDocObligatorioMonitrip) {
		this.indValDocObligatorioMonitrip = indValDocObligatorioMonitrip;
	}

	public BigDecimal getCoeficiente() {
		return coeficiente;
	}

	public void setCoeficiente(BigDecimal coeficiente) {
		this.coeficiente = coeficiente;
	}
	
	public String getMensagemPassagemIntrasferivel() {
		return mensagemPassagemIntrasferivel;
	}

	public void setMensagemPassagemIntrasferivel(String mensagemPassagemIntrasferivel) {
		this.mensagemPassagemIntrasferivel = mensagemPassagemIntrasferivel;
	}

	
	public Boolean getIndValDocObligatorioEmbarcada() {
		return indValDocObligatorioEmbarcada;
	}

	public void setIndValDocObligatorioEmbarcada(Boolean indValDocObligatorioEmbarcada) {
		this.indValDocObligatorioEmbarcada = indValDocObligatorioEmbarcada;
	}
	
	public BigDecimal getTaxaConvenienciaPorc() {
		return taxaConvenienciaPorc;
	}

	public void setTaxaConvenienciaPorc(BigDecimal taxaConvenienciaPorc) {
		this.taxaConvenienciaPorc = taxaConvenienciaPorc;
	}

	public BigDecimal getMaximoTaxaConvenienciaPorTarifa() {
		return maximoTaxaConvenienciaPorTarifa;
	}

	public void setMaximoTaxaConvenienciaPorTarifa(BigDecimal maximoTaxaConvenienciaPorTarifa) {
		this.maximoTaxaConvenienciaPorTarifa = maximoTaxaConvenienciaPorTarifa;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((orgaoConcedenteId == null) ? 0 : orgaoConcedenteId.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		OrgaoConcedente other = (OrgaoConcedente) obj;
		if (orgaoConcedenteId == null) {
			if (other.orgaoConcedenteId != null)
				return false;
		} else if (!orgaoConcedenteId.equals(other.orgaoConcedenteId))
			return false;
		return true;
	}

	public Boolean getIndNaoImprimirPoliticasConsumidor() {
		return indNaoImprimirPoliticasConsumidor;
	}

	public void setIndNaoImprimirPoliticasConsumidor(Boolean indNaoImprimirPoliticasConsumidor) {
		this.indNaoImprimirPoliticasConsumidor = indNaoImprimirPoliticasConsumidor;
	}

	public BigDecimal getTaxaConvenienciaSVI() {
		return taxaConvenienciaSVI;
	}

	public void setTaxaConvenienciaSVI(BigDecimal taxaConvenienciaSVI) {
		this.taxaConvenienciaSVI = taxaConvenienciaSVI;
	}

	public String getMensagemReciboTaxaDeConveniencia() {
		return mensagemReciboTaxaDeConveniencia;
	}

	public void setMensagemReciboTaxaDeConveniencia(String mensagemReciboTaxaDeConveniencia) {
		this.mensagemReciboTaxaDeConveniencia = mensagemReciboTaxaDeConveniencia;
	}

	@Override
	public void clonar() throws CloneNotSupportedException {
		
		orgaoConcedenteClone = new OrgaoConcedente();
		orgaoConcedenteClone = (OrgaoConcedente) this.clone();
		
		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());
				}
			}
			orgaoConcedenteClone.setCategoriaOrgaoList(lsClones);
		}
		
		if(this.getOrgaoCancelacionList() != null) {
			List<OrgaoCancelacion> lsClones = new ArrayList<OrgaoCancelacion>();
			for (OrgaoCancelacion orgaoCancelacion : this.getOrgaoCancelacionList()) {
				if(BooleanUtils.isTrue(orgaoCancelacion.getActivo())) {
					orgaoCancelacion.clonar();
					lsClones.add(orgaoCancelacion.getCloneObject());
				}
			}
			orgaoConcedenteClone.setOrgaoCancelacionList(lsClones);
		}
	}

	@Override
	public OrgaoConcedente getCloneObject() throws CloneNotSupportedException {
		return orgaoConcedenteClone;
	}

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

	public Integer getIdadeMinimaJovem() {
		return idadeMinimaJovem;
	}

	public void setIdadeMinimaJovem(Integer idadeMinimaJovem) {
		this.idadeMinimaJovem = idadeMinimaJovem;
	}

	public Integer getIdadeMaximaJovem() {
		return idadeMaximaJovem;
	}

	public void setIdadeMaximaJovem(Integer idadeMaximaJovem) {
		this.idadeMaximaJovem = idadeMaximaJovem;
	}
	
	public String getCustomizacaoRodapeCupomDeEmbarque() {
		return customizacaoRodapeCupomDeEmbarque;
	}

	public void setCustomizacaoRodapeCupomDeEmbarque(String customizacaoRodapeCupomDeEmbarque) {
		this.customizacaoRodapeCupomDeEmbarque = customizacaoRodapeCupomDeEmbarque;
	}

	public String getCampoCustomVoucher() {
		return campoCustomVoucher;
	}

	public void setCampoCustomVoucher(String campoCustomVoucher) {
		this.campoCustomVoucher = campoCustomVoucher;
	}

	public Boolean getIndImprimeCupomVoucherCustomizado() {
		return indImprimeCupomVoucherCustomizado;
	}

	public void setIndImprimeCupomVoucherCustomizado(Boolean indImprimeCupomVoucherCustomizado) {
		this.indImprimeCupomVoucherCustomizado = indImprimeCupomVoucherCustomizado;
	}  
	
	
}
