package com.k_int.ciim;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.FormParam;
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.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
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 org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import com.k_int.ciim.json.CIIMBaseMimsyJSON;
import com.k_int.ciim.json.CIIMObjectJSON;
import com.k_int.ciim.kernel.CIIMDataManager;
import com.k_int.mimsy.ref.DataStatusEnum;
import com.sun.jersey.api.view.ImplicitProduces;

/**
 * REST Web Service
 *
 * @author Mark Johnson
 * curl -s -H 'Accept: application/json' http://localhost:8080/Template/CIIM/Objects
 * ImplicitProduces("text/html;qs=5")   
 */

@XmlRootElement
@ImplicitProduces("application/json;qs=5")
@XmlAccessorType(XmlAccessType.FIELD)
@Path("/CIIM/Objects")
@Component
public class GroupObjects implements ApplicationContextAware 
{
	 @XmlTransient
	 private ApplicationContext ctx;
	 
	 @XmlTransient
	 @Context HttpServletRequest request;
	 
	 @XmlTransient
	 private static Log log = LogFactory.getLog(GroupObjects.class);

	 public void setApplicationContext(ApplicationContext ctx) 
	 {
	    this.ctx = ctx;
	 }
	   
	 @javax.annotation.PreDestroy
	 public void destroy() 
	 {
	 }
	   
	 /** Creates a new instance */
	 public GroupObjects() 
	 {
		 //log.debug("*** new Objects class contructor");
	 }

	 @javax.annotation.PostConstruct
	 public void init() 
	 {
		 //log.debug("*** new Objects class init");
	 }	 
	 
	 @Path("/results")
	 @GET
	 @Produces({MediaType.APPLICATION_JSON})
	 public List<CIIMObjectJSON> getJSON(@DefaultValue("") @QueryParam("gid") String group_id)
	 {
		 List<CIIMObjectJSON> retval = new ArrayList<CIIMObjectJSON>();
		 
		 CIIMDataManager cdm = (CIIMDataManager) ctx.getBean("CIIMDataManager");
		 
		 retval = cdm.getGroupObjects(group_id);
		 
		 return retval;
	 }
	 
	 @Path("/search")
	 @GET
	 @Produces({MediaType.APPLICATION_JSON})
	 public List<CIIMObjectJSON> search(  	@QueryParam("gid") String gid,
			  								@QueryParam("sfield") Integer search_field,
			  								@QueryParam("svalue") String search_string)
	 {
		 List<CIIMObjectJSON> retval = null;
		  
		 if(gid != null && search_field != null && search_string != null)
		 {
			 retval = new ArrayList<CIIMObjectJSON>();
			  
			 CIIMDataManager cdm = (CIIMDataManager) ctx.getBean("CIIMDataManager");
		 
			 retval = cdm.getObjectsBySearchParams(gid, search_field, search_string);
		 }
		 return retval;
	 }
	 
	 @Path("/lookup")
	 @GET
	 @Produces({MediaType.APPLICATION_JSON})
	 public CIIMObjectJSON lookupObject(@QueryParam("gid") String gid,
			 							@QueryParam("id") String id)
	 {
		 CIIMObjectJSON retval = null;
		 
		 if(gid != null && id != null)
		 {
			 CIIMDataManager cdm = (CIIMDataManager) ctx.getBean("CIIMDataManager");
			 
			 retval = cdm.getMimsyObject(gid, id);
		 }
		 
		 return retval;
	 }
	  
	 @Path("/archivedData")
	 @GET
	 @Produces({MediaType.APPLICATION_JSON})
	 public  List<CIIMBaseMimsyJSON> getAllArchived()
	 {	 
		 CIIMDataManager cdm = (CIIMDataManager) ctx.getBean("CIIMDataManager");
		 
		 List<CIIMBaseMimsyJSON> lResults = cdm.getMimsyDataByStatus(DataStatusEnum.ARCHIVED);
		 
		 return lResults;
	 }
	 
	  @Path("/Feature")
	  @POST
	  @Produces({MediaType.TEXT_PLAIN})
	  public String featureObject(  @FormParam("gid") String gid,
			  						@FormParam("id") Long id,
			  						@FormParam("feature") boolean feature)
	  {
		  String lReturn = "false";
		  
		  if(id != null && gid != null)
		  {  
			  CIIMDataManager cdm = (CIIMDataManager) ctx.getBean("CIIMDataManager");
		  
			  if(cdm.featureObject(gid, id, feature, request))
			  {
				  lReturn = "true";
			  }
		  }
		  
		  return lReturn;
	  } 
	  
	  
	  @Path("/Boost")
	  @POST
	  @Produces({MediaType.TEXT_PLAIN})
	  public String boostObject(	@FormParam("gid") String gid,
			  						@FormParam("id") Long id,
			  						@FormParam("boost_value") int boost_value)
	  {
		  String lReturn = "false";
		  
		  if(id != null && gid != null)
		  {
			  CIIMDataManager cdm = (CIIMDataManager) ctx.getBean("CIIMDataManager");
		  
			  if(cdm.boostObject(gid, id, boost_value, request))
			  {
				  lReturn = "true";
			  }
		  }
		  
		  return lReturn;
	  } 
	  
	  @Path("/Archive")
	  @POST
	  @Produces({MediaType.TEXT_PLAIN})
	  public String archiveObject(	@FormParam("gid") String gid,
			  						@FormParam("id") Long id)
	  {
		  String lReturn = "false";
		  
		  if(id != null && gid != null)
		  {
			  CIIMDataManager cdm = (CIIMDataManager) ctx.getBean("CIIMDataManager");
		  
			  if(cdm.archiveObject(id, gid, request))
			  {
				  lReturn = "true";
			  }
		  }
		  
		  return lReturn;
	  }
	  
	  @Path("/Add")
	  @POST
	  @Produces({MediaType.APPLICATION_JSON})
	  public CIIMObjectJSON addObjectToGroup(	@FormParam("mimsy_id") String mimsy_id,
			  									@FormParam("gid") String gid)
	  {
		  CIIMObjectJSON lReturn = null;
		  
		  if(mimsy_id != null & gid != null)
		  {
			  CIIMDataManager cdm = (CIIMDataManager) ctx.getBean("CIIMDataManager");
		  
			  lReturn = cdm.addCIIMDataContextToGroup(mimsy_id, gid, request);
		  }
		  
		  return lReturn;
	  } 
	  
	  @Path("/Delete")
	  @POST
	  @Produces({MediaType.TEXT_PLAIN})
	  public String deleteArchivedData( @QueryParam("id") String id)
	  {
		  String retval = null;
		  
		  CIIMDataManager cdm = (CIIMDataManager) ctx.getBean("CIIMDataManager");
		  retval = cdm.deleteMimsyData(id, request);
		  
		  return retval;
	  }
	  
	  @Path("/UpdateObjectData")
	  @POST
	  @Consumes("application/x-www-form-urlencoded")
	  public void updateObjectData(MultivaluedMap<String, String> formParams)	
	  {	   	  
		  CIIMDataManager cdm = (CIIMDataManager) ctx.getBean("CIIMDataManager");
		  
		  cdm.updateObjectDataContext(formParams, request);
	  }  
}
