package com.k_int.aggr2.mimsy.data.hdo;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import com.k_int.aggr2.mimsy.data.MimsyDataDTO;
import com.k_int.aggr2.mimsy.data.MimsyObjectDataDTO;
import com.k_int.mimsy.ref.ObjectConformanceEnum;
import com.k_int.mimsy.ref.ValidationStatusEnum;



@Entity
@Table(name="CIIM_VALIDATION_RESULT")
public class ValidationResultHDO implements Serializable
{
	private static final long serialVersionUID = 1L;

	private ValidationStatusEnum 	status		= ValidationStatusEnum.VALID; // valid
	private ObjectConformanceEnum 	level		= ObjectConformanceEnum.UNKNOWN; // unknown
	private ErrorPersistenceBundleHDO 	owner;
	private Long 					id;
	
	
	private String object_id				= null;
	private String object_name				= null;
	private String date_made				= null;
	private String current_location_code 	= null;
	private String identifier				= null;
	private String title				    = null;
	private String messages					= null;	
	
	protected ValidationResultHDO()
	{;}
	
	public ValidationResultHDO(MimsyDataDTO data, ObjectConformanceEnum conformance)
	{
		this.identifier=data.getMimsyIdentifier();
		this.level=conformance;
		if(data instanceof MimsyObjectDataDTO)
		{
			MimsyObjectDataDTO object 	= (MimsyObjectDataDTO)data;
			date_made					= object.getDisplayDate();
			current_location_code		= object.getCurrentLocation();
			if(object.getNames().size()>0)
				object_name				    = object.getNames().iterator().next().getName();
			
			title						= object.getTitle();
			object_id					= object.getObjectId();
		}
		else
			title = data.getSummaryTitle();
	}
	
	public ValidationResultHDO(String identifier,ObjectConformanceEnum conformance)
	{
		this.identifier=identifier;
		this.level=conformance;
	}
	
	@ManyToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="OWNING_BUNDLE_FK")
	public ErrorPersistenceBundleHDO getOwner()
	{
		return owner;
	}
	
	public void setOwner(ErrorPersistenceBundleHDO owner)
	{
		this.owner=owner;
	}
	
	@Column(name="DATA_TITLE")
	public String getTitle()
	{
		return title;
	}
	
	protected void setTitle(String title)
	{
		this.title=title;
	}
	
	@Column(name="OBJECT_ID")
	public String getObjectId()
	{
		return object_id;
	}
	
	protected void setObjectId(String object_id)
	{
		this.object_id=object_id;
	}
	
	@Column(name="MADE_DATE")
	public String getMadeDate()
	{
		return date_made;
	}
	
	protected void setMadeDate(String date_made)
	{
		this.date_made=date_made;
	}
	
	@Column(name="OBJECT_NAME",length=256)
	public String getObjectName()
	{
		return object_name;
	}
	
	protected void setObjectName(String object_name)
	{
		this.object_name=object_name;
	}
	
	@Column(name="LOCATION_CODE")
	public String getLocationCode()
	{
		return current_location_code;
	}
	
	protected void setLocationCode(String code)
	{
		current_location_code=code;
	}
	
	@Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID")
    public Long getId() {
        return id;
    }

    protected void setId(Long id) {
        this.id = id;
    }
          
    protected void setMessages(String messages)
    {
    	this.messages = messages;
    }
    
	@Column(name="MESSAGES", length=4000)
	@Lob
    public String getMessages()
    {
    	return messages;
    }
	
	public void addError(String field,String message)
	{
		this.addMessage(field, message);
		
		status=ValidationStatusEnum.INVALID;
	}
	
	public void addMessage(String field, String message)
	{
		StringBuffer s = new StringBuffer();

		if(messages != null)
		{
			s.append(messages);
			s.append("|");
		}
		
		s.append(field);
		s.append(":");
		s.append(message);
		
		messages = s.toString();
	}
	
	@Column(name = "VALIDATION_STATUS")
	@Enumerated(EnumType.ORDINAL)
	public ValidationStatusEnum getStatus()
	{
		return status;
	}
	
	public void setStatus(ValidationStatusEnum status)
	{
		this.status=status;
	}
	
	protected void setConformance(ObjectConformanceEnum level)
	{
		this.level=level;
	}
	
	
	
	@Column(name = "CONF_LEVEL")
	@Enumerated(EnumType.ORDINAL)
	public ObjectConformanceEnum getConformance()
	{
		return level;
		
	}
	
	@Column(name="MIMSY_IDENTIFIER",length=128)
	public String getIdentifier()
	{
		return identifier;
	}

 
	protected void setIdentifier(String identifier) 
	{
		this.identifier=identifier;
	}
	
	
	public String toString()
	{
		if(level!=ObjectConformanceEnum.UNKNOWN)
		{
			if(status==ValidationStatusEnum.VALID)
				return "valid: "+ status+"; "+identifier+": "+messages;
			else
				return "invalid: "+ status+": "+identifier+": "+messages;
		}
		else
		{
			if(status==ValidationStatusEnum.VALID)
				return "valid: "+identifier+": "+messages;
			else
				return "invalid: "+identifier+": "+messages;
		}
	}
	
	public ValidationResultHDO clone()
	{
		ValidationResultHDO clone = new ValidationResultHDO();
		clone.status			  = this.status;
		clone.identifier		  = this.identifier;
		clone.level				  = this.level;
		clone.title				  = this.title;
		clone.object_id			  = this.object_id;
		clone.object_name	      = this.object_name;
		clone.current_location_code=this.current_location_code;
		clone.date_made			  = this.date_made;
		clone.messages			  = this.messages;
		return clone;
	}
	

}
