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.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
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.MediaRecordTypeEnum;
import com.k_int.mimsy.ref.MimsyDataTypeEnum;
import com.k_int.mimsy.ref.ObjectConformanceEnum;
import com.k_int.mimsy.ref.OriginatorEnum;

@Entity
@Table(name="MIMSY_MEDIA_DATA")
@PrimaryKeyJoinColumn(name="BASE_DATA_FK")
public class MimsyMediaDataHDO  extends BaseMimsyDataHDO
{
	private static final long serialVersionUID = 1L;
	private String format;
	private String caption;
	private String credit_line;
	private String donor_location;
	private String donor_filename;
	private String donor_relative_path;
	private String large_donor_relative_path;
	private String large_donor_location;
	private String image_type;
	
	private MediaRecordTypeEnum type;
	private String medium;
	private String media_type;
	private String cabinet_image_number;
	
	// the image data we have synthesised
	private String large_synth_relative_path;
	private String large_synth_file_location;
	private String mid_synth_relative_path;
	private String mid_synth_file_location;
	private String preview_synth_relative_path;
	private String preview_synth_file_location;
	
	
	private Set<RightsHDO> rights = new HashSet<RightsHDO>();
	private String relationship;
	
	private OriginatorEnum originator;
	
	protected MimsyMediaDataHDO()
	{
		super();
	}
	
	private MimsyMediaDataHDO(String mimsy_identifier, Date last_modified) 
	{
		super(mimsy_identifier, MimsyDataTypeEnum.MEDIA,last_modified,ObjectConformanceEnum.CORE);
	}

	public void setFormat(String format)
	{
		this.format=format;
	}

	@Column(name="MEDIA_FORMAT")
	public String getFormat()
	{
		return format;
	}
	
	public void setCaption(String caption)
	{
		this.caption=caption;
	}
	
	@Column(name="LARGE_IMAGE_TYPE")
	public String getLargeImageType()
	{
		return image_type;
	}
	
	public void setLargeImageType(String image_type){
		this.image_type=image_type;
	}
	
	@Column(name="MEDIA_CAPTION")
	public String getCaption()
	{
		return caption;
	}
		
	@Column(name="MEDIA_RELATIONSHIP")
	public String getRelationship()
	{
		return relationship;
	}
	
	public void setRelationship(String relationship)
	{
		this.relationship=relationship;
	}
	
	public void setRights(Set<RightsHDO> rights)
	{
		this.rights=rights;
	}
	
	 @OneToMany(cascade=CascadeType.ALL)
	 @JoinTable(name="MIMSY_MEDIA_RIGHTS_LINK",
	         joinColumns=@JoinColumn(name="MEDIA_FK", referencedColumnName="ID"),
	         inverseJoinColumns= @JoinColumn(name="RIGHTS_FK", referencedColumnName="ID"))
	public Set<RightsHDO> getRights()
	{
		return rights;
	}
	
	public void setDonorRelativePath(String relative_path)
	{
		this.donor_relative_path=relative_path;
	}
	
	@Column(name="DONOR_RELATIVE_PATH")
	public String getDonorRelativePath()
	{
		return donor_relative_path;
	}
	
	public void setDonorLocation(String location)
	{
		this.donor_location=location;
	}
	
	@Column(name="DONOR_LOCATION")
	public String getDonorLocation()
	{
		return donor_location;
	}
	

	public void setDonorFilename(String filename)
	{
		this.donor_filename=filename;
	}
	
	@Column(name="DONOR_FILENAME")
	public String getDonorFilename()
	{
		return donor_filename;
	}
	
	
	public void setLargeDonorRelativePath(String larger_relative_path)
	{
		this.large_donor_relative_path=larger_relative_path;
	}
	
	@Column(name="LARGE_DONOR_RELATIVE_PATH", length=1000)
	public String getLargeDonorRelativePath()
	{
		return large_donor_relative_path;
	}
	
	public void setLargeDonorLocation(String location)
	{
		this.large_donor_location=location;
	}
	
	@Column(name="LARGE_DONOR_LOCATION", length=1000)
	public String getLargeDonorLocation()
	{
		return large_donor_location;
	}
	
		
	public void setMidRelativePath(String mid_relative_path)
	{
		this.mid_synth_relative_path=mid_relative_path;
	}
	
	@Column(name="MID_RELATIVE_PATH", length=1000)
	public String getMidRelativePath()
	{
		return mid_synth_relative_path;
	}
	
	public void setPreviewRelativePath(String preview_relative_path)
	{
		this.preview_synth_relative_path=preview_relative_path;
	}
	
	@Column(name="PREVIEW_RELATIVE_PATH", length=1000)
	public String getPreviewRelativePath()
	{
		return preview_synth_relative_path;
	}
	
	public void setLargeRelativePath(String large_relative_path)
	{
		this.large_synth_relative_path=large_relative_path;
	}
	
	@Column(name="LARGE_RELATIVE_PATH", length=1000)
	public String getLargeRelativePath()
	{
		return large_synth_relative_path;
	}
	
	public void setLargeFileLocation(String location)
	{
		this.large_synth_file_location=location;
	}
	
	@Column(name="LARGE_FILE_LOCATION", length=1000)
	public String getLargeFileLocation()
	{
		return large_synth_file_location;
	}
	
	public void setMidFileLocation(String location)
	{
		this.mid_synth_file_location=location;
	}
	
	@Column(name="MID_FILE_LOCATION", length=1000)
	public String getMidFileLocation()
	{
		return mid_synth_file_location;
	}
	
	public void setPreviewFileLocation(String location)
	{
		this.preview_synth_file_location=location;
	}
	
	@Column(name="PREVIEW_FILE_LOCATION", length=1000)
	public String getPreviewFileLocation()
	{
		return preview_synth_file_location;
	}
		
	
	public void setCreditLine(String credit_line)
	{
		this.credit_line=credit_line;
	}
	
	@Column(name="MEDIA_CREDIT_LINE", length=1000)
	public String getCreditLine()
	{
		return credit_line;
	}

	
	public void setCabinetImageNumber(String cabinet_image_number)
	{
		this.cabinet_image_number=cabinet_image_number;
	}
	
	@Column(name="CABINET_IMAGE_NUMBER")
	public String getCabinetImageNumber()
	{
		return cabinet_image_number;
	}

	public void setRecordType(MediaRecordTypeEnum type)
	{
		this.type=type;
	}
			
	@Column(name="MEDIA_RECORD_TYPE")
	@Enumerated(EnumType.ORDINAL)
	public MediaRecordTypeEnum getRecordType()
	{
		return type;
	}
	
	@Column(name="MEDIA_MEDIUM")
	public String getMedium()
	{
		return medium;
	}
	
	
	public void setMedium(String medium)
	{
		this.medium=medium;
	}
	
	public void setMediaType(String media_type)
	{
		this.media_type=media_type;
	}
	
	@Column(name="MEDIA_MEDIA_TYPE")
	public String getMediaType()
	{
		return media_type;
	}
	
	@Column(name = "ORIGINATOR")
	@Enumerated(EnumType.ORDINAL)
	public OriginatorEnum getOriginator() {
		return originator;
	}

	public void setOriginator(OriginatorEnum originator) {
		this.originator=originator;
	}
	
	public static MimsyMediaDataHDO lookupDataOrCreateStub(Session sess,
			String mimsy_identifier, OriginatorEnum originator) throws Exception 
	{
		MimsyMediaDataHDO retval = (MimsyMediaDataHDO)BaseMimsyDataHDO.lookup(sess, mimsy_identifier);
		 if(retval==null)
		 {
			 MimsyMediaDataHDO group = new MimsyMediaDataHDO(mimsy_identifier, new Date());
			 group.setConformance(ObjectConformanceEnum.UNKNOWN);
			 group.setChecksum(MimsyHelper.getChecksum(mimsy_identifier));
			 group.setOriginator(originator);
			 retval=group;
			 sess.save(retval);
			 sess.flush();
		 }
		 return retval;
		
	}
	
	public void clear()
	{
		super.clear();
		
		format = null;
		caption = null;
		credit_line = null;
		donor_location = null;
		donor_filename = null;
		donor_relative_path = null;
		large_donor_relative_path = null;
		large_donor_location = null;
		image_type = null;
		type = null;
		medium = null;
		media_type = null;
		cabinet_image_number = null;
		large_synth_relative_path = null;
		large_synth_file_location = null;
		mid_synth_relative_path = null;
		mid_synth_file_location = null;
		preview_synth_relative_path = null;
		preview_synth_file_location = null;		
		rights = null;
		relationship = null;
	}	
}
