package com.k_int.ciim;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
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.ValidationResultJSON;
import com.k_int.ciim.kernel.CIIMDataManager;
import com.sun.jersey.api.view.ImplicitProduces;

/**
 * REST Web Service
 *
 * @author Mark Johnson
 * curl -s -H 'Accept: application/json' http://localhost:8080/Template/CIIM/ErrorBundle
 * ImplicitProduces("text/html;qs=5")   
 */

@XmlRootElement
@ImplicitProduces("application/json;qs=5")
@XmlAccessorType(XmlAccessType.FIELD)
@Path("/CIIM/ErrorBundle/")
@Component
public class ErrorBundle implements ApplicationContextAware
{
	  @XmlTransient
	  private static Log log = LogFactory.getLog(ErrorBundle.class);
	 
	  @XmlTransient
	  private ApplicationContext ctx;
	  
	  public void setApplicationContext(ApplicationContext ctx) 
	  {
		  this.ctx = ctx;
	  }
	  
	  @javax.annotation.PreDestroy
	  public void destroy() 
	  {
		  
	  }
	  
	  public ErrorBundle() 
	  {
		  
	  }
	  
	  @javax.annotation.PostConstruct
	  public void init() 
	  {  
		  
	  }
	  
	  @Path("/errors")
	  @GET
	  @Produces({MediaType.APPLICATION_JSON})
	  public List<ValidationResultJSON> getJSON(@QueryParam("publicationErrors") String publication_errors,
			  									@QueryParam("mimsyId") String mimsy_id)
	  {
		  CIIMDataManager cdm = (CIIMDataManager) ctx.getBean("CIIMDataManager"); 
		  
		  List<ValidationResultJSON> retval = new ArrayList<ValidationResultJSON>(); 
		     
		  if(publication_errors != null && publication_errors.equalsIgnoreCase("true"))
		  {
			  if(mimsy_id != null)
			  {
				  retval = cdm.getPublicationValidationResults(mimsy_id);
			  }
		  }
		  else
		  {
			  // Set up new list of validation results
			  retval = cdm.getMimsyValidationResults();
		  }
			  
		  return retval;
	}  
	  
	  @Path("/messages")
	  @GET
	  @Produces({MediaType.APPLICATION_JSON})
	  public ValidationResultJSON getValidationResultDTOJSON(@DefaultValue("") @QueryParam("id") String id)
	  {		  
		  ValidationResultJSON retval = null;
		  
		  if(id != null && id.length() > 0)
		  {
			  CIIMDataManager cdm = (CIIMDataManager) ctx.getBean("CIIMDataManager"); 
			  
			  retval = cdm.getValidationResult(id);
			  
			  /*// Querying the database for specific result proved too slow and also unnecessary
			  
			  // GroupCore gc = (GroupCore) ctx.getBean("GroupCore");
			  // retrieve specific Validation Result from the DB+
			  // lReturn = gc.getValidationResult(id);				 
			  
			  // Instead iterate through list of results and find the selected one we need
			  for(ValidationResultJSON lResult : validation_results)
			  {
				  if(lResult.id.equalsIgnoreCase(id))
				  {
					  //DEBUG System.out.println("We have found the result");
					  lReturn = lResult;
					  break;
				  }
			  }*/
		  }
		  
		  return retval;
	  }
}
