package com.k_int.aggr2.mimsy.rdf;

import java.io.Writer;
import java.util.Iterator;
import java.util.Set;

import com.k_int.aggr2.mimsy.data.CIIMGroupDataDTO;
import com.k_int.aggr2.mimsy.data.ExtensionFieldDTO;
import com.k_int.aggr2.mimsy.data.MimsyCuratedGroupDTO;
import com.k_int.aggr2.mimsy.data.InstructionDTO;
import com.k_int.aggr2.mimsy.data.MimsyDataDTO;
import com.k_int.aggr2.mimsy.data.MimsyMediaDataDTO;
import com.k_int.aggr2.mimsy.data.conversion.AbstractCuratedGroupConverter;
import com.k_int.aggr2.mimsy.data.util.MimsyHelper;
import com.k_int.mimsy.ref.DataException;
import com.k_int.mimsy.ref.MediaRecordTypeEnum;

public class RDFCuratedGroupConverter extends AbstractCuratedGroupConverter {

	private Writer writer;
	
	public RDFCuratedGroupConverter(Writer writer)
	{
		this.writer=writer;
	}	
	protected void convert(String elementVal, String val) throws DataException {
		try
		{
			RDFHelper.writeElement(writer,elementVal, null, val);
		}
		catch(Exception e)
		{
			throw new DataException(e);
		}

	}

	@Override
	protected void convertConfAndLastUpdate(MimsyDataDTO data)
			throws DataException {
		try
		{
			RDFHelper.writeConfStatusAndLastUpdate(writer,data);
		}
		catch(Exception e)
		{
			throw new DataException(e);
		}

	}

	@Override
	protected void convertInstructions(Set<InstructionDTO> instructions)
			throws DataException {
		try
		{
			RDFHelper.writeInstructions(writer,instructions);
		}
		catch(Exception e)
		{
			throw new DataException(e);
		}

	}

	@Override
	public void prefix(MimsyCuratedGroupDTO data) throws DataException {
		try
        {          
           RDFHelper.writePreamble(writer, "group", data.getMimsyIdentifier());
        }
        catch(Exception ex)
        {
            throw new DataException(ex);
        }     

	}

	@Override
	public void suffix(MimsyCuratedGroupDTO data) throws DataException {
		try
		{
			RDFHelper.writeEndAndFlush(writer, "group");
		}
		catch(Exception e)
		{
			throw new DataException(e);
		}

	}
	@Override
	protected void convertCIIMData(CIIMGroupDataDTO data) throws DataException {
		if(data==null)
			return;
		if(data.getTop()!=null)
			convert("mo:topGroup","true");
		
		convert("mo:longDescription",data.getLongDescription());
		convertMediaLinks(data.getLinkedMedia());
		convertExtensionFields(data.getExtensionFields());
	}
	protected void convertMediaLinks(Set<MimsyMediaDataDTO> linked_media)
	throws DataException 
	{
		if(linked_media.size()==0)
			return;
        
		try
		{
        	writer.write("<mo:mediaLinks>");
        	Iterator<MimsyMediaDataDTO> i = linked_media.iterator();
        	while(i.hasNext())
        	{        		
        		MimsyMediaDataDTO ref = i.next();
        		
        		writer.write("<mo:mediaLink>");
        		writer.write("<mo:mediaReference rdf:resource=\"urn://mol/");
	            writer.write(MimsyHelper.encodeForXml(ref.getMimsyIdentifier()));
	            writer.write("\"/>"); 
	           
                if(ref.getRecordType()==MediaRecordTypeEnum.IMAGE)
                {
                	convert("mo:previewMediaLocation",ref.getPreviewRelativePath());
                	convert("mo:midMediaLocation",ref.getMidRelativePath());
                	convert("mo:largeMediaLocation",ref.getLargeRelativePath());
                	convert("mo:originalMediaLocation",ref.getLargeDonorRelativePath());	 	              
                }
                else if(ref.getDonorRelativePath()!=null)
                {
                	convert("mo:originalMediaLocation",ref.getDonorRelativePath());
                }
                String rel="undefined";
                if(ref.getRelationship()!=null)
                	rel=ref.getRelationship();
                convert("mo:mediaRelation",rel);
	                     
	            writer.write("</mo:mediaLink>");
        	}
        	writer.write("</mo:mediaLinks>");    
        	
        }
		catch(Exception e)
		{
			throw new DataException(e);
		}
	}
	
	protected void convertExtensionFields(Set<ExtensionFieldDTO> extension_fields)
	throws DataException 
	{
		if(extension_fields == null || extension_fields.size()==0)
			return;
        
		try
		{
			writer.write("<mo:extensions>");
			
			for(ExtensionFieldDTO field : extension_fields)
			{
				
				if(field.getValues() != null && field.getValues().size() > 0)
				{
					writer.write("<mo:extension>");
					for(String value : field.getValues())
					{
						convert("mo:"+field.getIndexName(), value);
					}
					writer.write("</mo:extension>");
				}
			}
			
			writer.write("</mo:extensions>");
		}
		catch(Exception e)
		{
			throw new DataException(e);
		}
	}
}
