package net.sf.taverna.biocatalogue.ui.search_results;

import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JLabel;

import net.sf.taverna.biocatalogue.model.LoadingResource;
import net.sf.taverna.biocatalogue.model.Resource;
import net.sf.taverna.biocatalogue.model.ResourceManager;
import net.sf.taverna.biocatalogue.model.Util;
import net.sf.taverna.t2.lang.ui.ReadOnlyTextArea;
import net.sf.taverna.t2.ui.perspectives.biocatalogue.integration.health_check.ServiceMonitoringStatusInterpreter;

import org.apache.commons.lang.StringEscapeUtils;
import org.biocatalogue.x2009.xml.rest.RestMethod;
import org.biocatalogue.x2009.xml.rest.RestParameter;
import org.biocatalogue.x2009.xml.rest.RestRepresentation;
import org.biocatalogue.x2009.xml.rest.Service;
import org.biocatalogue.x2009.xml.rest.RestMethod.Ancestors;


/**
 * 
 * 
 * @author Sergejs Aleksejevs
 */
public class RESTMethodListCellRenderer extends ExpandableOnDemandLoadedListCellRenderer
{
  private JLabel jlTypeIcon = new JLabel();
  private JLabel jlItemStatus = new JLabel();
  private JLabel jlItemTitle = new JLabel("X");
  private JLabel jlPartOf = new JLabel("X");
  private ReadOnlyTextArea jtDescription = new ReadOnlyTextArea(5, 80);
  private JLabel jlMethodType = new JLabel("X");
  private JLabel jlUrlTemplate = new JLabel("X");
  private JLabel jlMethodParameters = new JLabel("X");
  private JLabel jlInputRepresentations = new JLabel("X");
  private JLabel jlOutputRepresentations = new JLabel("X");
  
  private GridBagConstraints c;
  
  private static Resource.TYPE resourceType = Resource.TYPE.RESTMethod;

  
  
  public RESTMethodListCellRenderer() {
	   jlItemTitle.setFont(jlItemTitle.getFont().deriveFont(Font.PLAIN, jlItemTitle.getFont().getSize() + 2));
	    jtDescription.setOpaque(false);
	    jtDescription.setLineWrap(true);
	    jtDescription.setWrapStyleWord(true);
  }
  
  
  
  /**
   * This entry can be in one of two states:
   * -- containing only the name of the resource and NOT loading further details;
   * -- containing only the name of the resource and LOADING further details.
   * 
   * @param itemToRender
   * @return
   */
  protected GridBagConstraints prepareInitiallyLoadingEntry(Object itemToRender)
  {
    LoadingResource resource = (LoadingResource)itemToRender;
    
    jlTypeIcon.setIcon(resourceType.getIcon());
    jlItemStatus.setIcon(ResourceManager.getImageIcon(ResourceManager.SERVICE_STATUS_UNCHECKED_ICON_LARGE));
    
    jlItemTitle.setText("<html>" + StringEscapeUtils.escapeHtml(Resource.getDisplayNameForResource(resource)) + "<font color=\"gray\"><i>- fetching more information</i></font></html>");
    
    jlPartOf.setText("");
    jtDescription.setText(" ");
    jlMethodType.setText(" ");
    jlUrlTemplate.setText(" ");
    jlMethodParameters.setText(" ");
    jlInputRepresentations.setText(" ");
    jlOutputRepresentations.setText(" ");
    
    return (arrangeLayout());
  }
  
  
  /**
   * 
   * @param itemToRender
   * @param expandedView <code>true</code> to indicate that this method generates the top
   *                     fragment of the expanded list entry for this SOAP operation / REST method.
   * @return
   */
  protected GridBagConstraints prepareLoadedEntry(Object itemToRender, boolean selected)
  {
    RestMethod restMethod = (RestMethod)itemToRender;;
    
    Ancestors ancestors = restMethod.getAncestors();
    Service service = ancestors.getService();
    String title = "<html>" + StringEscapeUtils.escapeHtml(Resource.getDisplayNameForResource(restMethod));

    if (restMethod.isSetArchived() || service.isSetArchived()) {
    	jlTypeIcon.setIcon(ResourceManager.getImageIcon(ResourceManager.WARNING_ICON));
    	title = title + "<i> - this operation is archived and probably cannot be used</i></html>";
    }
    else {
    	jlTypeIcon.setIcon(resourceType.getIcon());
    	title = title + "</html>";
    }
    
    // service status
    jlItemStatus.setIcon(ServiceMonitoringStatusInterpreter.getStatusIcon(service, false));
    jlItemTitle.setText(title);
     
    jlPartOf.setText("<html><b>Part of: </b>" + restMethod.getAncestors().getRestService().getResourceName() + "</html>");
    
    String strDescription = (restMethod.getDescription() == null || restMethod.getDescription().length() == 0 ?
                             "No description" :
                            	 Util.stripAllHTML(restMethod.getDescription()));
    jtDescription.setText(strDescription);
    
    jlMethodType.setText("<html><b>HTTP Method: </b>" + StringEscapeUtils.escapeHtml(restMethod.getHttpMethodType().toString()) + "</html>");
    jlUrlTemplate.setText("<html><b>URL Template: </b>" + StringEscapeUtils.escapeHtml(restMethod.getUrlTemplate()) + "</html>");
    
    List<String> names = new ArrayList<String>();
    for (RestParameter restParameter : restMethod.getInputs().getParameters().getRestParameterList()) {
      names.add(restParameter.getName() + (restParameter.getIsOptional() ? " (optional)" : ""));
    }
    
    String methodParameters = "<b>" + names.size() + " " + Util.pluraliseNoun("Parameter", names.size()) + "</b>";
    if(names.size() > 0) {
      methodParameters += ": " + StringEscapeUtils.escapeHtml(Util.ensureLineLengthWithinString(Util.join(names, ", "), LINE_LENGTH, false));
    }
    methodParameters = "<html>" + methodParameters + "</html>";
    jlMethodParameters.setText(methodParameters);
    
       names.clear();
      for (RestRepresentation restRepresentation : restMethod.getInputs().getRepresentations().getRestRepresentationList()) {
        names.add(restRepresentation.getContentType());
      }
      
      String inputRepresentations = "<b>" + names.size() + " " + Util.pluraliseNoun("Input representation", names.size()) + "</b>";
      if(names.size() > 0) {
        inputRepresentations += ": " + StringEscapeUtils.escapeHtml(Util.ensureLineLengthWithinString(Util.join(names, ", "), LINE_LENGTH, false));
      }
      inputRepresentations = "<html>" + inputRepresentations + "</html>";
      
      jlInputRepresentations.setText(inputRepresentations);

      // output representations
      names.clear();
      for (RestRepresentation restRepresentation : restMethod.getOutputs().getRepresentations().getRestRepresentationList()) {
        names.add(restRepresentation.getContentType());
      }
      
      String outputRepresentations = "<b>" + names.size() + " " + Util.pluraliseNoun("Output representation", names.size()) + "</b>";
      if(names.size() > 0) {
        outputRepresentations += ": " + StringEscapeUtils.escapeHtml(Util.ensureLineLengthWithinString(Util.join(names, ", "), LINE_LENGTH, false));
      }
      outputRepresentations = "<html>" + outputRepresentations + "</html>";
      
      jlOutputRepresentations.setText(outputRepresentations);
    
    return (arrangeLayout());
  }
  
  
  /**
   * @return Final state of the {@link GridBagConstraints} instance
   *         that was used to lay out components in the panel.
   */
  private GridBagConstraints arrangeLayout()
  {
    // POPULATE PANEL WITH PREPARED COMPONENTS
    this.setLayout(new GridBagLayout());
    c = new GridBagConstraints();
    c.anchor = GridBagConstraints.NORTHWEST;
    c.fill = GridBagConstraints.HORIZONTAL;
    
    c.gridx = 0;
    c.gridy = 0;
    c.weightx = 0;
    c.insets = new Insets(8, 6, 6, 3);
    this.add(jlTypeIcon, c);
    
    c.gridx++;
    c.weightx = 1.0;
    c.insets = new Insets(8, 3, 6, 3);
    this.add(jlItemTitle, c);
    
    c.gridx++;
    c.gridheight = 8;
    c.weightx = 0;
    c.weighty = 1.0;
    this.add(jlItemStatus, c);
    
    c.gridx = 1;
    c.gridy++;
    c.gridheight = 1;
    c.weightx = 1.0;
    c.weighty = 0;
    this.add(jlPartOf, c);
    
    c.fill = GridBagConstraints.NONE;
    c.gridy++;
    this.add(jtDescription, c);
    
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridy++;
    this.add(jlMethodType, c);
    
    c.gridy++;
    this.add(jlUrlTemplate, c);
    
    c.gridy++;
    this.add(jlMethodParameters, c);
    
    c.gridy++;
    this.add(jlInputRepresentations, c);
    
    c.gridy++;
    this.add(jlOutputRepresentations, c);
    return (c);
  }
  
@Override
boolean shouldBeHidden(Object itemToRender) {
	if (!(itemToRender instanceof RestMethod)) {
		return false;
	}
    RestMethod restMethod = (RestMethod)itemToRender;;
    
    Ancestors ancestors = restMethod.getAncestors();
    Service service = ancestors.getService();
    String title = Resource.getDisplayNameForResource(restMethod);

    if (restMethod.isSetArchived() || service.isSetArchived()) {
    	return true;
    }
    else {
    	return false;
    }

}
  
}
