package com.k_int.aggr2.mimsy.solr;

import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.apache.solr.common.SolrInputDocument;

import com.k_int.aggr2.mimsy.data.CIIMContextDataDTO;
import com.k_int.aggr2.mimsy.data.CIIMMasterDataDTO;
import com.k_int.aggr2.mimsy.data.ControlledReferenceDTO;
import com.k_int.aggr2.mimsy.data.DataContextDTO;
import com.k_int.aggr2.mimsy.data.ExtensionFieldDTO;
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.MimsyObjectDataDTO;
import com.k_int.aggr2.mimsy.data.conversion.AbstractDataContextFormatConverter;
import com.k_int.mimsy.ref.DataException;
import com.k_int.mimsy.ref.MediaRecordTypeEnum;
import com.k_int.mimsy.ref.MimsyDataTypeEnum;

public class SolrDataContextConverter extends
		AbstractDataContextFormatConverter {
	private SolrInputDocument doc;
	private Properties solr_props;
	
	public SolrDataContextConverter(SolrInputDocument doc, Properties solr_props)
	{
		this.doc=doc;
		this.solr_props=solr_props;
	}
	@Override
	protected void convertCIIMData(CIIMContextDataDTO data)
			throws DataException {
		if(data==null)
			return;
		 convert("mo:boost",Integer.toString(data.getBoostValue()));
		 if(data.getFeatured()!=null)
			 convert("mo:featured",Boolean.toString(data.getFeatured()));
		 if(data.getExtensionFields() != null && data.getExtensionFields().size() > 0)
		 {
			 for(ExtensionFieldDTO field : data.getExtensionFields())
			 {
				 if(field.getValues() != null && field.getValues().size() > 0)
				 {
					 for(String value : field.getValues())
					 {
						 convert("mo:"+field.getIndexName(), value);
					 }
				 }
			 }
		 }
	}

	@Override
	protected void convertMasterData(CIIMMasterDataDTO data)
			throws DataException {
		if(data==null)
			return;
		convert("mo:summaryTitle",data.getMaster().getSummaryTitle());
		if(data.getMaster().getDataType()==MimsyDataTypeEnum.OBJECT)
		{
			 MimsyObjectDataDTO master_object = (MimsyObjectDataDTO) data.getMaster();
			 convertSimpleElements(master_object);
			 convertControlledRefs("mo:maker",  master_object.getLinkedMakers());
			 convertControlledRefs("mo:agent",master_object.getLinkedAgents());
			 convertControlledRefs("mo:event",master_object.getLinkedEvents());
			 Iterator<String> i = master_object.getBoroughs().iterator();
			 while(i.hasNext())
			 {
				 convert("mo:borough",i.next());
			 }
			 convertMediaLinks(master_object.getLinkedMedia());
			 convertControlledRefs("mo:place",master_object.getLinkedPlaces());
			 convertControlledRefs("mo:publication",master_object.getLinkedPublications());
			 convertControlledRefs("mo:site",master_object.getLinkedSites());
			 convertControlledRefs("mo:subject",master_object.getLinkedSubjects());
			 convertControlledRefs("mo:object",master_object.getLinkedObjects());
		}
		//TODO implement for other data types
	}
	
	// copied from Object solr converter
	protected void convertMediaLinks(Map<Integer, MimsyMediaDataDTO> linked_media)
			throws DataException {
		if(linked_media.size()==0)
			return;
        
        	Iterator<Map.Entry<Integer, MimsyMediaDataDTO>> i = linked_media.entrySet().iterator();
        	while(i.hasNext())
        	{
        		Map.Entry<Integer, MimsyMediaDataDTO> entry =i.next();
        		MimsyMediaDataDTO ref = entry.getValue();
        		Integer key=entry.getKey();        		
        		convertReference("mo:mediaReference","urn://mol/"+ref.getMimsyIdentifier());
	            convert("mo:mediaIndex",key.toString());
                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);
        	}
        
	}
	private void convertSimpleElements(MimsyObjectDataDTO data)throws  DataException
	{
		 convert("mo:idNumber",data.getObjectId());		
		 convert("mo:summary",data.getSummary());
		/* convert("dc:publisher",data.getPublisher());
		 convert("mo:acquisition",data.getAcquisition()); 
		 convert("mo:addInfoOffsite",data.getAdditionalInformation());
		 convert("mo:conservationAction",data.getConservationAction());*/
		 convert("mo:creditLine",data.getCreditLine());
		 convert("mo:currentLocation",data.getCurrentLocationDescription());
		 convert("mo:currentLocationCode",data.getCurrentLocation());
		 //convert("mo:intendedUse",data.getIntendedUse());
                 
		// if(data.getItemCount()!=null)            
		//	 convert("mo:itemCount",Integer.toString(data.getItemCount()));

		// if(data.isLoanAllowed()!=null)
		//	 convert("mo:loanAllowed",Boolean.toString(data.isLoanAllowed()));
           
		 convert("mo:measurements",data.getMeasurements());
		// convert("mo:note",data.getNote());
		 //convert("mo:ownerStatus",data.getOwnerStatus());
		 //convert("mo:pagination",data.getPagination());
		 convert("mo:permanentLocation",data.getPermanentLocation());
		 //convert("mo:projectNotes",data.getProjectNotes());
                
		 if(data.getRecordType()!=null)
			 convert("mo:recordType",data.getRecordType().toString());
		 
		 convert("mo:section",data.getSection());
		 //convert("mo:site",data.getSite());           
		 //convert("mo:title",data.getTitle());  
		 convert("mo:primaryMaterial",data.getPrimaryMaterial());
		 convert("mo:displayDate",data.getDisplayDate());
	}
	
	
	// copied from the object solr converter
	protected void convertControlledRefs(String prefix,
			Set<ControlledReferenceDTO> controlled_refs) throws DataException {
		if(controlled_refs.size()==0)
			return;
			       
    	Iterator<ControlledReferenceDTO> i = controlled_refs.iterator();
    	while(i.hasNext())
    	{
    		ControlledReferenceDTO ref = i.next();
    		if(ref.getIdentifier()==null)
    			continue;
    		
    		convertReference(prefix+"Reference","urn://mol/"+ref.getIdentifier());
    	
            String rel ="undefined";
            if(ref.getRelationship()!=null)
            	rel=ref.getRelationship();
            
            convert(prefix+"Relation",rel);
    	}
	}
	
	// copied from the object solr converter
	public void convertReference(String element, String val) throws DataException {
		
		SolrHelper.addField(solr_props,doc,element, null, val,false);
	}

	@Override
	protected void convert(String elementVal, String val) throws DataException {
		SolrHelper.addField(solr_props,doc,elementVal, null, val,true);

	}

	@Override
	protected void convertConfAndLastUpdate(MimsyDataDTO data)
			throws DataException {
		SolrHelper.addConfAndLastUpdate(solr_props,doc,data);

	}

	@Override
	protected void convertInstructions(Set<InstructionDTO> instructions)
			throws DataException {
		// not used

	}

	@Override
	public void prefix(DataContextDTO Type) throws DataException {
		// not used

	}

	@Override
	public void suffix(DataContextDTO Type) throws DataException {
		// not used

	}

}
