package com.k_int.aggr2.mimsy.data.hdo;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.Lob;
import javax.persistence.OneToMany;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

import org.hibernate.Session;

import com.k_int.aggr2.mimsy.data.util.MimsyHelper;
import com.k_int.mimsy.ref.MimsyDataTypeEnum;
import com.k_int.mimsy.ref.ObjectConformanceEnum;


@Entity
@Table(name="MIMSY_AGENT_DATA")
@PrimaryKeyJoinColumn(name="BASE_DATA_FK")
public class MimsyAgentDataHDO extends BaseMimsyDataHDO
{
	private static final long serialVersionUID = 1L;
	private Boolean 			individual = null;
    private String 				preferredName;
    private String 				titlePrefix;
    private String 				firstName;
    private String 				lastName;
    private String 				suffix;
    private String 				honorarySuffix;
    private String 				gender;
    private Boolean 			deceased 		= null;
    private String 				briefBio;
    private String 				birthDate;
    private String 				birthPlace;
    private String 				deathDate;
    private String 				deathPlace;
    private String 				causeOfDeath;
    private String 				nationality;
    private String 				occupation;
    private String 				description;
    private Set<TextTypePairHDO> 	variations 		= new HashSet<TextTypePairHDO>();
  
    protected MimsyAgentDataHDO()
    {
    	super();
    }
  
    private MimsyAgentDataHDO(String mimsy_identifier,Date last_updated,ObjectConformanceEnum conformance)
    {
    	super(mimsy_identifier,MimsyDataTypeEnum.AGENT,last_updated,conformance);
    }
    
    @Column(name="AGT_DESC", length=4000)
    @Lob
    public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	@Column(name="AGT_INDIVIDUAL")
	public Boolean isIndividual() {
		return individual;
	}

	public void setIndividual(Boolean individual) {
		this.individual = individual;
	}

	@Column(name="AGT_PREF_NAME")
	public String getPreferredName() {
		return preferredName;
	}

	public void setPreferredName(String preferredName) {
		this.preferredName = preferredName;
	}

	@Column(name="AGT_TITLE_PREFIX")
	public String getTitlePrefix() {
		return titlePrefix;
	}

	public void setTitlePrefix(String titlePrefix) {
		this.titlePrefix = titlePrefix;
	}

	@Column(name="AGT_FIRST_NAME")
	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	@Column(name="AGT_LAST_NAME")
	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	@Column(name="AGT_SUFFIX")
	public String getSuffix() {
		return suffix;
	}

	public void setSuffix(String suffix) {
		this.suffix = suffix;
	}

	@Column(name="AGT_HONORARY_SUFFIX")
	public String getHonorarySuffix() {
		return honorarySuffix;
	}

	public void setHonorarySuffix(String honorarySuffix) {
		this.honorarySuffix = honorarySuffix;
	}

	@Column(name="AGT_GENDER")
	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	@Column(name="AGT_DECEASED")
	public Boolean isDeceased() {
		return deceased;
	}

	public void setDeceased(Boolean deceased) {
		this.deceased = deceased;
	}

	@Column(name="AGT_BRIEF_BIO", length=1000)
	public String getBriefBio() {
		return briefBio;
	}

	public void setBriefBio(String briefBio) {
		this.briefBio = briefBio;
	}

	@Column(name="AGT_BIRTH_DATE")
	public String getBirthDate() {
		return birthDate;
	}

	public void setBirthDate(String birthDate) {
		this.birthDate = birthDate;
	}

	@Column(name="AGT_BIRTH_PLACE")
	public String getBirthPlace() {
		return birthPlace;
	}

	public void setBirthPlace(String birthPlace) {
		this.birthPlace = birthPlace;
	}

	@Column(name="AGT_DEATH_DATE")
	public String getDeathDate() {
		return deathDate;
	}

	public void setDeathDate(String deathDate) {
		this.deathDate = deathDate;
	}

	@Column(name="AGT_DEATH_PLACE")
	public String getDeathPlace() {
		return deathPlace;
	}

	public void setDeathPlace(String deathPlace) {
		this.deathPlace = deathPlace;
	}

	@Column(name="AGT_CAUSE_OF_DEATH")
	public String getCauseOfDeath() {
		return causeOfDeath;
	}

	public void setCauseOfDeath(String causeOfDeath) {
		this.causeOfDeath = causeOfDeath;
	}

	@Column(name="AGT_NATIONALITY")
	public String getNationality() {
		return nationality;
	}

	public void setNationality(String nationality) {
		this.nationality = nationality;
	}

	@Column(name="AGT_OCCUPATION")
	public String getOccupation() {
		return occupation;
	}

	public void setOccupation(String occupation) {
		this.occupation = occupation;
	}

	
	 @OneToMany(cascade=CascadeType.ALL)
	 @JoinTable(name="MIMSY_AGENT_VARIATION_LINK",
	         joinColumns=@JoinColumn(name="AGENT_FK", referencedColumnName="ID"),
	         inverseJoinColumns= @JoinColumn(name="VARIATION_FK", referencedColumnName="ID"))
	public Set<TextTypePairHDO> getVariations()
	{
		return variations;
	}
	
	public void setVariations(Set<TextTypePairHDO> variations) {
		this.variations = variations;
	}
	
	public static MimsyAgentDataHDO lookupDataOrCreateStub(Session sess,
			String mimsy_identifier) throws Exception 
	{
		MimsyAgentDataHDO retval = (MimsyAgentDataHDO)BaseMimsyDataHDO.lookup(sess, mimsy_identifier);
		 if(retval==null)
		 {
			 MimsyAgentDataHDO group = new MimsyAgentDataHDO(mimsy_identifier,new Date(), ObjectConformanceEnum.UNKNOWN);
			 group.setChecksum(MimsyHelper.getChecksum(mimsy_identifier));
			 retval=group;
			 sess.save(retval);
			 sess.flush();
		 }
		 return retval;		
	}
	
	public void clear()
	{	
		super.clear();
		
		individual = null;
		preferredName = null;
		titlePrefix = null;
		firstName = null;
		lastName = null;
		suffix = null;
		honorarySuffix = null;
		gender = null;
		deceased = null;
		briefBio = null;
		birthDate = null;
		birthPlace = null;
		deathDate = null;
		deathPlace = null;
		causeOfDeath = null;
		nationality = null;
		occupation = null;
		description = null;
		variations = null;		 	
	}
}
