package es.uv.saic.domain;

import java.io.Serializable;
import jakarta.persistence.*;
import java.util.List;
import java.util.stream.Collectors;

@Entity
@Table(name="organs")
@NamedQuery(name="Organ.findAll", query="SELECT o FROM Organ o")
public class Organ implements Serializable {
	private static final long serialVersionUID = 1L;

	@EmbeddedId
	private OrganPK id;

	private Boolean actiu;

	@Column(name="nom_cas")
	private String nomCas;

	@Column(name="nom_val")
	private String nomVal;

	private Integer ruct;
	
	private String tambit;

	//bi-directional many-to-one association to Instancia
	@OneToMany(mappedBy="organ")
	private List<Instancia> instancias;
	
	//bi-directional many-to-one association to Organ
	@ManyToOne
	@JoinColumns({
		@JoinColumn(name="lugar2", referencedColumnName="lugar"),
		@JoinColumn(name="tlugar2", referencedColumnName="tlugar")
		})
	private Organ organ;

	//bi-directional many-to-one association to Organ
	@OneToMany(mappedBy="organ")
	private List<Organ> organsFill;
	
	@OneToMany()
	@JoinColumns({
		@JoinColumn(name="lugar", referencedColumnName="lugar"),
		@JoinColumn(name="tlugar", referencedColumnName="tlugar")
		})
	private List<OrganEquivalent> organsEquivalents;

	//bi-directional many-to-one association to UsuarisRol
	@OneToMany(mappedBy="organ")
	
	private List<UsuarisRol> usuarisRols;
	
	@OneToOne()
	@JoinColumns({
		@JoinColumn(name="lugar", referencedColumnName="lugar"),
		@JoinColumn(name="tlugar", referencedColumnName="tlugar")
	})
	private Acreditacio acreditacio;
	
	@Transient
	private String codis;

	public Organ() {}

	public OrganPK getId() {
		return this.id;
	}

	public void setId(OrganPK id) {
		this.id = id;
	}

	public Boolean getActiu() {
		return this.actiu;
	}

	public void setActiu(Boolean actiu) {
		this.actiu = actiu;
	}

	public String getNomCas() {
		return this.nomCas;
	}

	public void setNomCas(String nomCas) {
		this.nomCas = nomCas;
	}

	public String getNomVal() {
		return this.nomVal;
	}

	public void setNomVal(String nomVal) {
		this.nomVal = nomVal;
	}

	public Integer getRuct() {
		return this.ruct;
	}

	public void setRuct(Integer ruct) {
		this.ruct = ruct;
	}
	
	public String getTambit() {
		return this.tambit;
	}

	public void setTambit(String tambit) {
		this.tambit = tambit;
	}

	public Organ getOrgan() {
		return this.organ;
	}

	public void setOrgan(Organ organ) {
		this.organ = organ;
	}

	public List<Organ> getOrgansFill() {
		return organsFill;
	}
	
	public Organ addOrganFill(Organ o) {
		this.getOrgansFill().add(o);
		return o;
	}
	
	public Organ removeOrganFill(Organ o) {
		this.getOrgansFill().remove(o);
		return o;
	}

	public void setOrgansFill(List<Organ> organsFill) {
		this.organsFill = organsFill;
	}

	public List<Instancia> getInstancies() {
		return this.instancias;
	}

	public void setInstancies(List<Instancia> instancias) {
		this.instancias = instancias;
	}

	public Instancia addInstancia(Instancia instancia) {
		this.getInstancies().add(instancia);
		instancia.setOrgan(this);

		return instancia;
	}

	public Instancia removeInstancia(Instancia instancia) {
		this.getInstancies().remove(instancia);
		instancia.setOrgan(null);

		return instancia;
	}

	public List<UsuarisRol> getUsuarisRols() {
		return this.usuarisRols;
	}

	public void setUsuarisRols(List<UsuarisRol> usuarisRols) {
		this.usuarisRols = usuarisRols;
	}

	public UsuarisRol addUsuarisRol(UsuarisRol usuarisRol) {
		getUsuarisRols().add(usuarisRol);
		usuarisRol.setOrgan(this);

		return usuarisRol;
	}

	public UsuarisRol removeUsuarisRol(UsuarisRol usuarisRol) {
		getUsuarisRols().remove(usuarisRol);
		usuarisRol.setOrgan(null);

		return usuarisRol;
	}
	
	public Acreditacio getAcreditacio() {
		return acreditacio;
	}

	public void setAcreditacio(Acreditacio acreditacio) {
		this.acreditacio = acreditacio;
	}

	@Transient
	public String getCodis() {
		return codis;
	}
	
	@Transient
	public void setCodis() {
		this.codis = organsEquivalents.stream()
									  .map(i->i.getLugarEq().toString())
									  .collect(Collectors.joining(", "));
		if(this.codis.isEmpty()) {
			this.codis = this.getId().getLugar().toString();
		}
		else {
			this.codis = this.getId().getLugar().toString() +", "+ this.codis;
		}
	}
}