package com.k_int.aggr2.mimsy.rdf;

import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
import java.util.Set;

import com.k_int.aggr2.mimsy.data.AttributionDTO;
import com.k_int.aggr2.mimsy.data.InstructionDTO;
import com.k_int.aggr2.mimsy.data.MimsyDataDTO;
import com.k_int.aggr2.mimsy.data.util.MimsyHelper;
import com.k_int.aggr2.mimsy.data.util.SerializationException;
import com.k_int.mimsy.ref.DataException;
import com.k_int.mimsy.ref.DataStatusEnum;
import com.k_int.mimsy.ref.MimsyRefData;

public class RDFHelper 
{
	 public static void writeElement(Writer writer, String element,String attribute,String content)throws IOException,DataException
	 {
    	if(content==null && attribute==null)
    		return;
    	writer.write("<");
    	writer.write(element);
    	if(attribute!=null)
    	{
    		writer.write(" ");
    		writer.write(attribute);
    	}
    	writer.write(">");
    	writer.write(MimsyHelper.encodeForXml(content));
    	writer.write("</");
    	writer.write(element);
    	writer.write(">");   	
    }
	 
	 public static void writePreamble(Writer writer, String type, String identifier)throws IOException
	 {
		 writer.write("<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" ");
         writer.write("xmlns:mo=\"urn://museums/ma/v1/ma-rdf-syntax-ns#\" ");
         writer.write("xmlns:dcterms=\"http://purl.org/dc/terms/\" ");
         writer.write("xmlns:dc=\"http://purl.org/dc/elements/1.1/\">");
         writer.write("<mo:");
         writer.write(type);
         writer.write(" rdf:about=\"urn://mol/");
         writer.write(identifier);
         writer.write("\">"); 	
	 }
	 
	 public static void writeEndAndFlush(Writer writer, String type)throws IOException
	 {
		  writer.write("</mo:");
		  writer.write(type);
		  writer.write(">");
          writer.write("</rdf:RDF>");
          writer.flush();  
	 }
	 
	public static void writeAttribution(Writer writer, String element_name_prefix, AttributionDTO attrib)throws SerializationException
	{
		if(attrib==null)
			return;
			try
			{ 
				//writer.write("<mo:attributionLink>");
				//writer.write("<mo:attribution>");
				if(attrib.getAttributor()!=null)
				{
					writer.write("<mo:"+element_name_prefix+"Attributor>");
					writer.write(MimsyHelper.encodeForXml(attrib.getAttributor()));
					writer.write("</mo:"+element_name_prefix+"Attributor>");
				}
				
				if(attrib.getCertainty()!=null)
				{
					writer.write("<mo:"+element_name_prefix+"AttributionCertainty>");
					writer.write(MimsyHelper.encodeForXml(attrib.getCertainty()));
					writer.write("</mo:"+element_name_prefix+"AttributionCertainty>");
				}
				
				if(attrib.getComment()!=null)
				{
					writer.write("<mo:"+element_name_prefix+"AttributionComment>");
					writer.write(MimsyHelper.encodeForXml(attrib.getComment()));
					writer.write("</mo:"+element_name_prefix+"AttributionComment>");
				}
				
				if(attrib.getDate()!=null)
				{
					writer.write("<mo:"+element_name_prefix+"AttributionDate>");
					writer.write(MimsyHelper.encodeForXml(attrib.getDate()));
					writer.write("</mo:"+element_name_prefix+"AttributionDate>");
				}
				
				if(attrib.getType()!=null)
				{
					writer.write("<mo:"+element_name_prefix+"AttributionType>");
					writer.write(MimsyHelper.encodeForXml(attrib.getType()));
					writer.write("</mo:"+element_name_prefix+"AttributionType>");
				}
				
				if(attrib.getSource()!=null)
				{
					writer.write("<mo:"+element_name_prefix+"AttributionSource>");
					writer.write(MimsyHelper.encodeForXml(attrib.getSource()));
					writer.write("</mo:"+element_name_prefix+"AttributionSource>");
				}	            		
				//writer.write("</mo:attribution>");
				//writer.write("</mo:attributionLink>");
			}
			catch(Exception e)
			{
				throw new SerializationException(e);
			}
			
		}
	 
	 public static void writeInstructions(Writer writer, Set<InstructionDTO> instructions) throws IOException,DataException,SerializationException
	 {
		 if(instructions.size()>0)
         {
			 writer.write("<mo:instructions>");
			 Iterator<InstructionDTO> j = instructions.iterator();
			 while(j.hasNext())
			 {
				 InstructionDTO ref = j.next();
            	 writer.write("<mo:instructionLink>");
        		 if(ref.getDate()!=null)
        		 {
    				writer.write("<dc:date>");
    				writer.write(MimsyHelper.getDateString(ref.getDate()));
    				//writer.write(MimsyHelper.encodeForXml(ref.getDate()));
    				writer.write("</dc:date>");
        		 }
        		
    			if(ref.getName()!=null)
    			{
    				writer.write("<mo:instructionBy>");
    				writer.write(MimsyHelper.encodeForXml(ref.getName()));
    				writer.write("</mo:instructionBy>");
    			}
        		
    			if(ref.getStatus()!=null)
    			{
    				writer.write("<mo:instructionStatus>");
    				writer.write(MimsyHelper.encodeForXml(ref.getStatus()));
    				writer.write("</mo:instructionStatus>");
    			}
    		
    			if(ref.getType()!=null)
    			{
    				writer.write("<mo:instructionType>");
    				writer.write(MimsyHelper.encodeForXml(ref.getType()));
    				writer.write("</mo:instructionType>");
    			}
    			if(ref.getInstruction()!=null)
    			{
    				writer.write("<mo:instruction>");
    				writer.write(MimsyHelper.encodeForXml(ref.getInstruction()));
    				writer.write("</mo:instruction>");
    			}           		
        		writer.write("</mo:instructionLink>");
        	      
            }
            writer.write("</mo:instructions>");     	 
         }
	 }
	 
	 public static void writeConfStatusAndLastUpdate(Writer writer, MimsyDataDTO data)throws DataException, IOException
	 {
		 writeElement(writer,"mo:conformance",null,data.getConformance().toString());
		 if(data.getStatus()!=null && data.getStatus()!=DataStatusEnum.LIVE)
			 writeElement(writer,"mo:status",null,data.getStatus().toString());
    	 writeElement(writer,"dcterms:modified",null,MimsyRefData.SOLR_DATE_FORMAT.format(data.getLastUpdated()));
	 }

}
