package it.micegroup.gestioneferie.configurazionepf.entity;

import java.io.Serializable;

import javax.validation.constraints.NotNull;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Id;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.FetchType;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonProperty.Access;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.annotation.JsonBackReference;
import javax.persistence.ManyToOne;
import javax.validation.constraints.NotNull;

import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.Getter;
import lombok.AllArgsConstructor;

import javax.persistence.Table;

import org.apache.commons.lang3.StringUtils;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.hibernate.Hibernate;
import java.util.Objects;

import it.micegroup.gestioneferie.libs.entity.BaseEntity;
import it.micegroup.voila2runtime.utils.EntityUtils;

@NoArgsConstructor

@Getter
@Setter
@Entity
@Table(name = "D_REGOLE_PIANI_FERIE_H")
public class DregolePianiFerieH extends BaseEntity implements Serializable {

	// Generated SERIAL VERSION UID
	private static final long serialVersionUID = 976188501L;

	@SuppressWarnings("unused")
	private static final Logger LOGGER = LogManager.getLogger(DregolePianiFerieH.class);

	// ATTRIBUTES
	@Id

	@Column(name = "SEQU_ID_REGOLE_PIANI_FERIE_H", columnDefinition = "NUMBER(15)")
	private Long sequIdRegolePianiFerieH;
	@NotNull

	@Column(name = "NUME_MIN_GG_DA_PIANIFICARE", columnDefinition = "NUMBER(15)")
	private Long numMinGgDaPianificare;
	@NotNull

	@Column(name = "NUME_MAX_GG_DA_PIANIFICARE", columnDefinition = "NUMBER(15)")
	private Long numMaxGgDaPianificare;
	@NotNull

	@Column(name = "NUME_PERC_MIN_GIORNI_PRESENZA", columnDefinition = "NUMBER(15)")
	private Long numePercMinGiorniPresenza;
	@NotNull

	@Column(name = "FLAG_VALIDO_UO_SUBORDINATE", columnDefinition = "VARCHAR(1)")
	private String flagValidoUoSubordinate;
	@NotNull

	@Column(name = "FK_AMMINISTRAZIONE", columnDefinition = "NUMBER(15)")
	private Long fkAmministrazione;
	@NotNull

	@Column(name = "FK_REGOLA_PIANO_FERIE_PK", columnDefinition = "NUMBER(15)")
	private Long fkRegolaPianoFeriePk;
	@NotNull

	@Column(name = "FK_TIPO_ORGANIGRAMMA", columnDefinition = "NUMBER(15)")
	private Long fkTipoOrganigramma;
	@Column(name = "FK_UNITA_FUNZIONALE", columnDefinition = "NUMBER(15)")
	private Long fkUnitaFunzionale;
	@Column(name = "FK_UNITA_ORGANIZZATIVA_PK", columnDefinition = "NUMBER(15)")
	private Long fkUnitaOrganizzativaPk;
	@NotNull

	@Column(name = "FLAG_ELIMINATO", columnDefinition = "VARCHAR(1)")
	private String flagEliminato;
	@NotNull

	@Column(name = "UTENTE_ULTIMA_MODIFICA", columnDefinition = "VARCHAR(50)")
	private String utenteUltimaModifica;
	@NotNull

	@Column(name = "DATA_ULTIMA_MODIFICA", columnDefinition = "DATE")
	private Date dataUltimaModifica;
	@NotNull

	@Column(name = "DATA_INIZIO_VALIDITA", columnDefinition = "DATE")
	private Date dataInizioValidita;
	@NotNull

	@Column(name = "DATA_FINE_VALIDITA", columnDefinition = "DATE")
	private Date dataFineValidita;

	// IMPORTED PARENTS

	// CONSTRUCTORS
	public DregolePianiFerieH(String objectKey) {
		super();
		setObjectKey(objectKey);
	}

	public DregolePianiFerieH(Long numMinGgDaPianificare, Long numMaxGgDaPianificare, Long numePercMinGiorniPresenza,
			String flagValidoUoSubordinate, Long fkAmministrazione, Long fkRegolaPianoFeriePk, Long fkTipoOrganigramma,
			Long fkUnitaFunzionale, Long fkUnitaOrganizzativaPk, String flagEliminato, String utenteUltimaModifica,
			Date dataUltimaModifica, Date dataInizioValidita, Date dataFineValidita, Long sequIdRegolePianiFerieH) {
		super();

		this.numMinGgDaPianificare = numMinGgDaPianificare;
		this.numMaxGgDaPianificare = numMaxGgDaPianificare;
		this.numePercMinGiorniPresenza = numePercMinGiorniPresenza;
		this.flagValidoUoSubordinate = flagValidoUoSubordinate;
		this.fkAmministrazione = fkAmministrazione;
		this.fkRegolaPianoFeriePk = fkRegolaPianoFeriePk;
		this.fkTipoOrganigramma = fkTipoOrganigramma;
		this.fkUnitaFunzionale = fkUnitaFunzionale;
		this.fkUnitaOrganizzativaPk = fkUnitaOrganizzativaPk;
		this.flagEliminato = flagEliminato;
		this.utenteUltimaModifica = utenteUltimaModifica;
		this.dataUltimaModifica = dataUltimaModifica;
		this.dataInizioValidita = dataInizioValidita;
		this.dataFineValidita = dataFineValidita;
		this.sequIdRegolePianiFerieH = sequIdRegolePianiFerieH;
	}

	// CHILDREN

	// PARENTS
	@NotNull
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "FK_REGOLA_PIANO_FERIE_PK", referencedColumnName = "SEQU_ID_REGOLE_PIANI_FERIE_PK", nullable = false)
	@JsonBackReference("theDregolePianiFeriePk")
	@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" }, allowSetters = true)
	private DregolePianiFeriePk theDregolePianiFeriePk;

	// GETTER/SETTER
	/**
	 * @return the sequIdRegolePianiFerieH
	 */
	public Long getSequIdRegolePianiFerieH() {
		return this.sequIdRegolePianiFerieH;
	}

	/**
	 * @param sequIdRegolePianiFerieH to set
	 */
	public void setSequIdRegolePianiFerieH(Long sequIdRegolePianiFerieH) {
		this.sequIdRegolePianiFerieH = sequIdRegolePianiFerieH;
	}

	/**
	 * @return the numMinGgDaPianificare
	 */
	public Long getNumMinGgDaPianificare() {
		return this.numMinGgDaPianificare;
	}

	/**
	 * @param numMinGgDaPianificare to set
	 */
	public void setNumMinGgDaPianificare(Long numMinGgDaPianificare) {
		this.numMinGgDaPianificare = numMinGgDaPianificare;
	}

	/**
	 * @return the numMaxGgDaPianificare
	 */
	public Long getNumMaxGgDaPianificare() {
		return this.numMaxGgDaPianificare;
	}

	/**
	 * @param numMaxGgDaPianificare to set
	 */
	public void setNumMaxGgDaPianificare(Long numMaxGgDaPianificare) {
		this.numMaxGgDaPianificare = numMaxGgDaPianificare;
	}

	/**
	 * @return the numePercMinGiorniPresenza
	 */
	public Long getNumePercMinGiorniPresenza() {
		return this.numePercMinGiorniPresenza;
	}

	/**
	 * @param numePercMinGiorniPresenza to set
	 */
	public void setNumePercMinGiorniPresenza(Long numePercMinGiorniPresenza) {
		this.numePercMinGiorniPresenza = numePercMinGiorniPresenza;
	}

	/**
	 * @return the flagValidoUoSubordinate
	 */
	public String getFlagValidoUoSubordinate() {
		return this.flagValidoUoSubordinate;
	}

	/**
	 * @param flagValidoUoSubordinate to set
	 */
	public void setFlagValidoUoSubordinate(String flagValidoUoSubordinate) {
		this.flagValidoUoSubordinate = flagValidoUoSubordinate;
	}

	/**
	 * @return the fkAmministrazione
	 */
	public Long getFkAmministrazione() {
		return this.fkAmministrazione;
	}

	/**
	 * @param fkAmministrazione to set
	 */
	public void setFkAmministrazione(Long fkAmministrazione) {
		this.fkAmministrazione = fkAmministrazione;
	}

	/**
	 * @return the fkRegolaPianoFeriePk
	 */
	public Long getFkRegolaPianoFeriePk() {
		return this.fkRegolaPianoFeriePk;
	}

	/**
	 * @param fkRegolaPianoFeriePk to set
	 */
	public void setFkRegolaPianoFeriePk(Long fkRegolaPianoFeriePk) {
		this.fkRegolaPianoFeriePk = fkRegolaPianoFeriePk;
	}

	/**
	 * @return the fkTipoOrganigramma
	 */
	public Long getFkTipoOrganigramma() {
		return this.fkTipoOrganigramma;
	}

	/**
	 * @param fkTipoOrganigramma to set
	 */
	public void setFkTipoOrganigramma(Long fkTipoOrganigramma) {
		this.fkTipoOrganigramma = fkTipoOrganigramma;
	}

	/**
	 * @return the fkUnitaFunzionale
	 */
	public Long getFkUnitaFunzionale() {
		return this.fkUnitaFunzionale;
	}

	/**
	 * @param fkUnitaFunzionale to set
	 */
	public void setFkUnitaFunzionale(Long fkUnitaFunzionale) {
		this.fkUnitaFunzionale = fkUnitaFunzionale;
	}

	/**
	 * @return the fkUnitaOrganizzativaPk
	 */
	public Long getFkUnitaOrganizzativaPk() {
		return this.fkUnitaOrganizzativaPk;
	}

	/**
	 * @param fkUnitaOrganizzativaPk to set
	 */
	public void setFkUnitaOrganizzativaPk(Long fkUnitaOrganizzativaPk) {
		this.fkUnitaOrganizzativaPk = fkUnitaOrganizzativaPk;
	}

	/**
	 * @return the flagEliminato
	 */
	public String getFlagEliminato() {
		return this.flagEliminato;
	}

	/**
	 * @param flagEliminato to set
	 */
	public void setFlagEliminato(String flagEliminato) {
		this.flagEliminato = flagEliminato;
	}

	/**
	 * @return the utenteUltimaModifica
	 */
	public String getUtenteUltimaModifica() {
		return this.utenteUltimaModifica;
	}

	/**
	 * @param utenteUltimaModifica to set
	 */
	public void setUtenteUltimaModifica(String utenteUltimaModifica) {
		this.utenteUltimaModifica = utenteUltimaModifica;
	}

	/**
	 * @return the dataUltimaModifica
	 */
	public Date getDataUltimaModifica() {
		return this.dataUltimaModifica;
	}

	/**
	 * @param dataUltimaModifica to set
	 */
	public void setDataUltimaModifica(Date dataUltimaModifica) {
		this.dataUltimaModifica = dataUltimaModifica;
	}

	/**
	 * @return the dataInizioValidita
	 */
	public Date getDataInizioValidita() {
		return this.dataInizioValidita;
	}

	/**
	 * @param dataInizioValidita to set
	 */
	public void setDataInizioValidita(Date dataInizioValidita) {
		this.dataInizioValidita = dataInizioValidita;
	}

	/**
	 * @return the dataFineValidita
	 */
	public Date getDataFineValidita() {
		return this.dataFineValidita;
	}

	/**
	 * @param dataFineValidita to set
	 */
	public void setDataFineValidita(Date dataFineValidita) {
		this.dataFineValidita = dataFineValidita;
	}

	// CHILD GETTER/SETTER

	/// ADD CHILD

	// PARENT GETTER/SETTER
	/**
	 * @return the DregolePianiFeriePk
	 */
	@JsonProperty(access = Access.WRITE_ONLY)
	public DregolePianiFeriePk getTheDregolePianiFeriePk() {
		return theDregolePianiFeriePk;
	}

	/**
	 * @param aDregolePianiFeriePkList to set
	 */
	public void setTheDregolePianiFeriePk(DregolePianiFeriePk aDregolePianiFeriePk) {
		theDregolePianiFeriePk = aDregolePianiFeriePk;
	}

	// PARENT ID GETTER/SETTER
	/**
	 * Return the sequIdRegolePianiFeriePk from theDregolePianiFeriePk.
	 * 
	 * @return sequIdRegolePianiFeriePk from theDregolePianiFeriePk.
	 */
	@JsonProperty
	public Long getSequIdRegolePianiFeriePk() {
		// If the parent entity object is null, then return null
		if (getTheDregolePianiFeriePk() == null) {
			return null;
		}
		// Return requested attribute
		return theDregolePianiFeriePk.getSequIdRegolePianiFeriePk();
	}

	// PARENT OBJECT TITLE
	/**
	 * Return the object title of theDregolePianiFeriePk.
	 * 
	 * @return the object title of theDregolePianiFeriePk.
	 */
	@JsonProperty
	public String getTheDregolePianiFeriePkObjectTitle() {
		return getTheDregolePianiFeriePk() != null ? getTheDregolePianiFeriePk().getObjectTitle() : null;
	}

	// PARENT OBJECT KEY
	/**
	 * Return the object key of theDregolePianiFeriePk.
	 * 
	 * @return the object key of theDregolePianiFeriePk.
	 */
	@JsonProperty
	public String getTheDregolePianiFeriePkObjectKey() {
		return getTheDregolePianiFeriePk() != null ? getTheDregolePianiFeriePk().getObjectKey() : null;
	}

	/**
	 * Set object key of theDregolePianiFeriePk.
	 * 
	 */
	@JsonProperty
	public void setTheDregolePianiFeriePkObjectKey(String objectKey) {
		if (EntityUtils.isValueChanged(getTheDregolePianiFeriePkObjectKey(), objectKey, false)) {
			DregolePianiFeriePk dregolePianiFeriePk = new DregolePianiFeriePk();
			dregolePianiFeriePk.setObjectKey(objectKey);
			setTheDregolePianiFeriePk(dregolePianiFeriePk);
		}
	}

	// IMPORTED PARENT OBJECT KEY

	// OPERATIONS

	// OBJECT KEY
	/**
	 * Restituisce l'identificativo della chiave in formato stringa. Ritorna
	 * conveniente nelle selezioni da lista.
	 * 
	 * @return L'identificativo della chiave in formato pk1||pk2||pk3...
	 */
	public String getObjectKey() {
		return getObjectKeyById(getSequIdRegolePianiFerieH());
	}

	public String getObjectKeyById(Long identification) {
		if (identification == null) {
			return null;
		}
		StringBuilder output = new StringBuilder();
		output.append(identification);
		return output.toString();
	}

	/**
	 * Inizializza la parte identificativa del bean in base alla stringa tokenizzata
	 * da "||" fornita in input.
	 * 
	 * @param key L'identificativo della chiave in formato pk1||pk2||pk3...
	 */
	public void setObjectKey(String key) {
		if (key == null || key.trim().length() == 0) {
			return;
		}
		String[] array = StringUtils.splitByWholeSeparatorPreserveAllTokens(key, getRowIdFieldDelimiter());
		int ctr = 0;

		setSequIdRegolePianiFerieH(getLongCheckedAgainstNullContent(array[ctr]));
	}

	// OBJECT TITLE
	public String getObjectTitle() {
		StringBuilder output = new StringBuilder();
		output.append(getFlagValidoUoSubordinate());
		return output.toString();
	}

	// PREPERSIST

	@PrePersist
	public void prePersist() {
	}

	@PreUpdate
	public void PreUpdate() {
	}

	// Equals / HashCode
	@Override
	public boolean equals(Object o) {
		if (this == o)
			return true;
		if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o))
			return false;
		DregolePianiFerieH that = (DregolePianiFerieH) o;
		return sequIdRegolePianiFerieH != null && Objects.equals(sequIdRegolePianiFerieH, that.sequIdRegolePianiFerieH);
	}

	@Override
	public int hashCode() {
		return Objects.hash(sequIdRegolePianiFerieH);
	}
}
