/**
 * 
 */
package info.oais.implementation.infomodel;

import java.util.ArrayList;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

import info.oais.interfaces.infomodel.*;

/**
 * JsonSerialiser - to keep all code in one place.
 * Usage: when the object on is to be serialised as JSON then <br/>
 *     js = new JsonSerialiser();<br/>
 *     JSONObject jo = new JSONObject();<br/>
 *     js.addElement(jo, obj);<br/>
 *     String str = jo.toJSONString();<br/>
 * Then write out str.
 * 
 * @author David
 *
 */
public class JsonSerialiser {

	/**
	 * JsonSerialiser constructor
	 */
	public JsonSerialiser() {
		super();
	}
	
	/**
	 * Add JSON components
	 * 
	 * @param jo The JSONObject to which to add
	 * @param ob Object to be serialised
	 * @return The JSONObject
	 */
	@SuppressWarnings("unchecked")
	public JSONObject addElement(JSONObject jo, Object ob){
		if (ob instanceof RepInfoGroup) {
			JSONObject jo2 = new JSONObject();
			JSONArray list = new JSONArray();
			ArrayList<RepresentationInformation> ar = ((RepInfoGroup)ob).getGroup();
			for (int i=0; i <= ar.size(); i++) {
				Object el = ar.get(i);
				list.add(el);
			}
			if (ob instanceof RepInfoAndGroup) {
				jo2.put("RepInfoAndGroup", list);
			} else if (ob instanceof RepInfoOrGroup) {
				jo2.put("RepInfoOrGroup", list);
			} else { 
				jo2.put("RepInfoGroup", list);
			}
			jo.putAll(jo2);
		} else if (ob instanceof BaseGroup) {
				JSONObject jo2 = new JSONObject();
				JSONArray list = new JSONArray();
				ArrayList<Object> ar = ((BaseGroup)ob).getGroup();
				for (int i=0; i <= ar.size(); i++) {
					Object el = ar.get(i);
					list.add(el);
				}
				if (ob instanceof AndGroup) {
					jo2.put("AndGroup", list);
				} else if (ob instanceof OrGroup) {
					jo2.put("OrGroup", list);
				} else { 
					jo2.put("BaseGroup", list);
				}
				jo.putAll(jo2);
		} else if (ob instanceof DataObject ) {
			jo.put("DataObject", ((DataObject)ob).getIdentifier().getURI());
		} else if (ob instanceof DigitalObject ) {
			jo.put("DigitalObject", ((DigitalObject)ob).getIdentifier().getURI());
		} else if (ob instanceof PhysicalObject ) {
			jo.put("PhysicalObject", ((PhysicalObject)ob).getIdentifier().getURI());
		} else if (ob instanceof AccessRightsInformation ) {
			jo.put("AccessRightsInformation", ((AccessRightsInformation)ob).getIdentifier().getURI());
		} else if (ob instanceof ContextInformation ) {
			jo.put("ContextInformation", ((ContextInformation)ob).getIdentifier().getURI());
		} else if (ob instanceof DescriptiveInformation ) {
			jo.put("DescriptiveInformation", ((DescriptiveInformation)ob).getIdentifier().getURI());
		} else if (ob instanceof OtherRepInfo ) {
			jo.put("OtherRepInfo", ((OtherRepInfo)ob).getIdentifier().getURI());
		} else if (ob instanceof SemanticRepInfo ) {
			jo.put("SemanticRepInfo", ((SemanticRepInfo)ob).getIdentifier().getURI());
		} else if (ob instanceof StructureRepInfo ) {
			jo.put("StructureRepInfo", ((StructureRepInfo)ob).getIdentifier().getURI());
		} else if (ob instanceof FixityInformation ) {
			jo.put("FixityInformation", ((FixityInformation)ob).getIdentifier().getURI());
		} else if (ob instanceof ReferenceInformation ) {
			jo.put("ReferenceInformation", ((ReferenceInformation)ob).getIdentifier().getURI());
		} else if (ob instanceof PackagingInformation ) {
			jo.put("PackagingInformation", ((PackagingInformation)ob).getIdentifier().getURI());
		} else if (ob instanceof PackageDescription ) {
			jo.put("PackageDescription", ((PackageDescription)ob).getIdentifier().getURI());
		} else if (ob instanceof CollectionDescription ) {
			jo.put("CollectionDescription", ((CollectionDescription)ob).getIdentifier().getURI());
		} else if (ob instanceof ArchivalInformationPackage ) {
			jo.put("ArchivalInformationPackage", ((ArchivalInformationPackage)ob).getIdentifier().getURI());
		} else if (ob instanceof DisseminationInformationPackage ) {
			jo.put("DisseminationInformationPackage", ((DisseminationInformationPackage)ob).getIdentifier().getURI());
		} else if (ob instanceof SubmissionInformationPackage ) {
			jo.put("SubmissionInformationPackage", ((SubmissionInformationPackage)ob).getIdentifier().getURI());
		} else if (ob instanceof InformationPackage ) {
			jo.put("InformationPackage", ((InformationPackage)ob).getIdentifier().getURI());
		}
		
		
		return jo;
		
	}

}
