package com.k_int.ciim.ui.resources;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.k_int.ciim.data.hdo.CIIMMediaDataHDO;
import com.k_int.ciim.ui.exceptions.NotAuthorisedException;
import com.k_int.ciim.ui.exceptions.ResourceCreationException;
import com.k_int.ciim.ui.json.MediaJSON;
import com.k_int.ciim.ui.kernel.MediaQueryCore;
import com.k_int.ciim.ui.kernel.MediaTransactionCore;
import com.k_int.ciim.ui.ref.RoleDefinitionEnum;
import com.sun.jersey.api.view.ImplicitProduces;
import com.sun.jersey.api.view.Viewable;

@XmlRootElement
@ImplicitProduces("text/html;qs=5") //for FireFox?
@XmlAccessorType(XmlAccessType.FIELD)
@Path("/resources/media")
public class MediaResources extends AbstractResource
{
	@SuppressWarnings("unused")
	@XmlTransient
	private static Log log = LogFactory.getLog(MediaResources.class);
	@XmlTransient
	private MediaQueryCore mqc;
	@XmlTransient
	private MediaTransactionCore mtc;

	/* App Context setters */
	public void setMediaQueryCore(MediaQueryCore mqc) { this.mqc = mqc;	}
	public void setMediaTransactionCore(MediaTransactionCore mtc) { this.mtc = mtc;	}
	 
	public MediaResources(){;}
	
	@GET
	@Produces({MediaType.TEXT_HTML,MediaType.APPLICATION_XHTML_XML})
	public Viewable getHtml() 
	{
		return new Viewable("index",this);
	}
	
	@GET
	@Produces("application/json")
	public List<MediaJSON> getJson() 
	{		
		return convertToJSON(mqc.getAll());
	}
	
	@POST
	@Consumes("application/x-www-form-urlencoded")
	@Produces("application/json")
	public MediaJSON create(@QueryParam("attachment_id") Long attachment_id,
						 	MultivaluedMap<String, String> form_params)
	{
		MediaJSON retval = null;
	
		if(this.meetsRoleRequirement(RoleDefinitionEnum.CONFIGURED.toString()))
		{
			try
			{
				CIIMMediaDataHDO hdo = mtc.create(attachment_id, form_params);
				
				if(hdo != null)
				{
					retval = new MediaJSON(hdo);
				}
			}
			catch(ResourceCreationException rce)
			{
				throw new WebApplicationException(Response.status(Status.CONFLICT).entity(rce.getMessage()).type("text/plain").build());
			}
		}
		else
		{
			throw new NotAuthorisedException();
		}  
		
		return retval;
	}

	/*
	 * Converts a list of CIIMMediaDataHDO objects to a list of MediaJSON objects
	 */
	private List<MediaJSON> convertToJSON(List<CIIMMediaDataHDO> media)
	{
		List<MediaJSON> retval = new ArrayList<MediaJSON>();
		
		if(media != null && media.size() > 0)
		{
			// Iterate through hdo's ...
			for(CIIMMediaDataHDO hdo : media)
			{
				// ...and convert them to JSON
				retval.add(new MediaJSON(hdo));
			}
		}
		
		return retval;
	}
}
