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.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.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.Where;

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

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

	private static final long serialVersionUID = 1L;
	
	@Id
	@Basic(optional = false)
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "OPERADOR_EMBARCADA_SEQ")
	@Column(name = "OPERADOR_EMBARCADA_ID")
	@AuditarID
	private Long operadorEmbarcadaId;
	
	@OneToOne
	@JoinColumn(name = "USUARIO_ID")
	private Usuario usuario;
	
	@OneToMany(mappedBy = "operadorEmbarcada", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@Fetch(FetchMode.SELECT)
	@Where(clause="activo=1")
	private List<OperadorEmbarcadaLinha> linhas;	
	
	@OneToMany(mappedBy = "operadorEmbarcada", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@Fetch(FetchMode.SELECT)
	@Where(clause="activo=1")
	private List<OperadorEmbarcadaServico> servicos;
	
	@Column(name = "FECMODIF")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fecmodif;
	
	@Column(name = "ACTIVO")
	private Boolean activo;
	
	@Transient
	@NaoAuditar
	private OperadorEmbarcada operadorClone;

	public Long getOperadorEmbarcadaId() {
		return operadorEmbarcadaId;
	}

	public void setOperadorEmbarcadaId(Long operadorEmbarcadaId) {
		this.operadorEmbarcadaId = operadorEmbarcadaId;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public List<OperadorEmbarcadaLinha> getLinhas() {
		List<OperadorEmbarcadaLinha> tmp = new ArrayList<OperadorEmbarcadaLinha>();

		if (linhas != null) {
			for (OperadorEmbarcadaLinha es : linhas) {
				if (es.getActivo()) {
					tmp.add(es);
				}
			}
		}

		return tmp;
	}

	public void setLinhas(List<OperadorEmbarcadaLinha> linhas) {
		this.linhas = linhas;
	}

	public List<OperadorEmbarcadaServico> getServicos() {
		List<OperadorEmbarcadaServico> tmp = new ArrayList<OperadorEmbarcadaServico>();

		if (servicos != null) {
			for (OperadorEmbarcadaServico es : servicos) {
				if (es.getActivo()) {
					tmp.add(es);
				}
			}
		}

		return tmp;
	}

	public void setServicos(List<OperadorEmbarcadaServico> servicos) {
		this.servicos = servicos;
	}

	public Boolean getActivo() {
		return activo == null ? false : 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 this.usuario.getUsuarioId();
	}

	public String getUsername() {
		return this.usuario.getClaveUsuario();
	}

	public String getName() {
		return usuario.getName();
	}

	@Override
	public void clonar() throws CloneNotSupportedException {
		operadorClone = new OperadorEmbarcada();
		operadorClone = (OperadorEmbarcada) this.clone();
	}

	@Override
	public OperadorEmbarcada getCloneObject() throws CloneNotSupportedException {
		return operadorClone;
	}

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