package net.sf.taverna.t2.ui.perspectives.biocatalogue.integration.contextual_views;

import java.awt.Component;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URI;
import java.rmi.activation.UnknownObjectException;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import net.sf.taverna.biocatalogue.model.BioCataloguePluginConstants;
import net.sf.taverna.biocatalogue.model.ResourceManager;
import net.sf.taverna.biocatalogue.model.SoapOperationIdentity;
import net.sf.taverna.biocatalogue.model.connectivity.BioCatalogueClient;
import net.sf.taverna.t2.lang.ui.DeselectingButton;
import net.sf.taverna.t2.lang.ui.ReadOnlyTextArea;
import net.sf.taverna.t2.ui.perspectives.biocatalogue.MainComponentFactory;
import net.sf.taverna.t2.ui.perspectives.biocatalogue.integration.Integration;
import net.sf.taverna.t2.ui.perspectives.biocatalogue.integration.health_check.ServiceHealthChecker;
import net.sf.taverna.t2.ui.perspectives.biocatalogue.integration.health_check.ServiceMonitoringStatusInterpreter;
import net.sf.taverna.t2.workbench.ui.views.contextualviews.ContextualView;
import net.sf.taverna.t2.workflowmodel.Processor;

import org.apache.log4j.Logger;
import org.biocatalogue.x2009.xml.rest.Service;
import org.biocatalogue.x2009.xml.rest.SoapOperation;


public class ProcessorView extends ContextualView {
	private final Processor processor;
	private JPanel jPanel;
	
	private static Logger logger = Logger.getLogger(ProcessorView.class);
	


	public ProcessorView(Processor processor) {
		this.processor = processor;
		
		jPanel = new JPanel();
		
		// this is required to have the body of this contextual
		// view added to the main view; otherwise, body will be
		// blank
		initView();
	}
	

	
	@Override
	public JComponent getMainFrame()
	{
	  Thread t = new Thread("loading processor data") {
      public void run() {
        final SoapOperationIdentity operationDetails = Integration.extractSoapOperationDetailsFromProcessor(processor);
        
        if (operationDetails.hasError()) {
        	SwingUtilities.invokeLater(new RefreshThread(new JLabel(operationDetails.getErrorDetails().toString(),
                    UIManager.getIcon("OptionPane.warningIcon"), JLabel.CENTER)));
           return;
        }
        else {
          BioCatalogueClient client = BioCatalogueClient.getInstance();
          
          if (client != null) {
            try {
              final SoapOperation soapOperation = client.lookupSoapOperation(operationDetails);
              if (soapOperation == null) {
            	  SwingUtilities.invokeLater(new RefreshThread(new JLabel("This service is not registered in the Service Catalogue",
                          UIManager.getIcon("OptionPane.warningIcon"), JLabel.CENTER)));
                 return;
              }
              
              Service parentService = client.getBioCatalogueService(soapOperation.getAncestors().getService().getHref());
              if (parentService == null) {
               	  SwingUtilities.invokeLater(new RefreshThread(new JLabel("Problem while fetching monitoring data from the Service Catalogue",
                          UIManager.getIcon("OptionPane.warningIcon"), JLabel.CENTER)));
                 return;
              }
              
              
              // *** managed to get all necessary data successfully - present it ***
              
              // create status update panel
              JButton jclServiceStatus = new DeselectingButton(
                  new AbstractAction("Check monitoring status") {
                    public void actionPerformed(ActionEvent e) {
                      ServiceHealthChecker.checkWSDLProcessor(operationDetails);
                    }
                  });
              jclServiceStatus.setAlignmentX(Component.LEFT_ALIGNMENT);
              JLabel jlStatusMessage = new JLabel(parentService.getLatestMonitoringStatus().getMessage());
              jlStatusMessage.setAlignmentX(Component.LEFT_ALIGNMENT);             
              
              // operation description
              String operationDescription = (soapOperation.getDescription().length() > 0 ?
                      soapOperation.getDescription() :
                      "No description is available for this service");

              ReadOnlyTextArea jlOperationDescription = new ReadOnlyTextArea(operationDescription);
 
              jlOperationDescription.setAlignmentX(Component.LEFT_ALIGNMENT);              
              
              // a button to open preview of the service
              JButton jbLaunchProcessorPreview = new DeselectingButton("Show on the Service Catalogue",
            		  new ActionListener() {
                  public void actionPerformed(ActionEvent e) {
                    if (!operationDetails.hasError()) {
                  	  String hrefString = soapOperation.getHref();
     				   try {
  						Desktop.getDesktop().browse(new URI(hrefString));
  					    }
  					    catch (Exception ex) {
  					      logger.error("Failed while trying to open the URL in a standard browser; URL was: " +
  					           hrefString, ex);
  					    };
                    }
                    else {
                      // this error message comes from Integration class extracting SOAP operation details from the contextual selection
                      JOptionPane.showMessageDialog(null, operationDetails.getErrorDetails(), "Service Catalogue Error", JOptionPane.WARNING_MESSAGE);
                    }
                  }
                },
                "View this service on the Service Catalogue");
              
              JPanel jpPreviewButtonPanel = new JPanel();
              jpPreviewButtonPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
              jbLaunchProcessorPreview.setAlignmentX(Component.LEFT_ALIGNMENT);
 //             jpPreviewButtonPanel.add(jbLaunchProcessorPreview);
             // put everything together
              JPanel jpInnerPane = new JPanel();
              jpInnerPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
              jpInnerPane.setLayout(new BoxLayout(jpInnerPane, BoxLayout.Y_AXIS));
              jpInnerPane.add(jlOperationDescription);
              jpInnerPane.add(Box.createVerticalStrut(10));
              jpInnerPane.add(jlStatusMessage);
              jpInnerPane.add(Box.createVerticalStrut(10));
              jpInnerPane.add(jclServiceStatus);
              jpInnerPane.add(Box.createVerticalStrut(10));
              jpInnerPane.add(jbLaunchProcessorPreview);
             
              JScrollPane spInnerPane = new JScrollPane(jpInnerPane);
              
              SwingUtilities.invokeLater(new RefreshThread(spInnerPane));
              return;
           }
            catch (UnknownObjectException e) {
            	SwingUtilities.invokeLater(new RefreshThread(new JLabel(e.getMessage(),
                        UIManager.getIcon("OptionPane.informationIcon"), JLabel.CENTER)));
            	return;
             }
            catch (Exception e) {
              // a real error occurred while fetching data about selected processor
             logger.error("ERROR: unexpected problem while trying to ", e);
             SwingUtilities.invokeLater(new RefreshThread(new JLabel("An unknown problem has prevented Taverna from loading this preview",
                     UIManager.getIcon("OptionPane.errorIcon"), JLabel.CENTER)));
             return;
            }
          }
          else {
        	  SwingUtilities.invokeLater(new RefreshThread(new JLabel("Service Catalogue integration has not initialised yet. Please wait and try again.",
                                  UIManager.getIcon("OptionPane.warningIcon"), JLabel.CENTER)));
        	  return;
         }
        }
      }
	  };
		
	  jPanel.removeAll();
    jPanel.setPreferredSize(new Dimension(200,200));
    jPanel.setLayout(new GridLayout());
    jPanel.add(new JLabel(ResourceManager.getImageIcon(ResourceManager.BAR_LOADER_ORANGE), JLabel.CENTER));
	  t.start();
		return jPanel;
	}

	@Override
	public String getViewTitle() {
		return "Service Catalogue Information";
	} 

	@Override
	public void refreshView()
	{
	  // this actually causes the parent container to validate itself,
	  // which is what is needed here
	  this.revalidate();
	  this.repaint();
	}
	
	@Override
	public int getPreferredPosition() {
		return BioCataloguePluginConstants.CONTEXTUAL_VIEW_PREFERRED_POSITION;
	}
	
	class RefreshThread extends Thread {
		private final Component component;

		public RefreshThread (Component component) {
			this.component = component;		
		}
		
		public void run() {
			jPanel.removeAll();
			if (component != null) {
				jPanel.add(component);
			}
			refreshView();
		}
	}

}
