/*******************************************************************************
 * Copyright (c) 2008 IONA Technologies PLC
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * IONA Technologies PLC - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.ws.internal.cxf.creation.ui.widgets;

import javax.jws.WebService;

import org.eclipse.jdt.core.IAnnotation;
import org.eclipse.jdt.core.IMemberValuePair;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.ws.internal.cxf.core.CXFCorePlugin;
import org.eclipse.jst.ws.internal.cxf.core.model.CXFContext;
import org.eclipse.jst.ws.internal.cxf.core.model.Java2WSDataModel;
import org.eclipse.jst.ws.internal.cxf.creation.core.commands.Java2WSDefaultingCommand;
import org.eclipse.jst.ws.internal.cxf.creation.ui.CXFCreationUIMessages;
import org.eclipse.jst.ws.internal.cxf.creation.ui.CXFCreationUIPlugin;
import org.eclipse.wst.command.internal.env.core.data.DataMappingRegistry;
import org.eclipse.wst.command.internal.env.ui.widgets.INamedWidgetContributor;
import org.eclipse.wst.command.internal.env.ui.widgets.INamedWidgetContributorFactory;
import org.eclipse.wst.command.internal.env.ui.widgets.SimpleWidgetContributor;
import org.eclipse.wst.command.internal.env.ui.widgets.WidgetContributor;
import org.eclipse.wst.command.internal.env.ui.widgets.WidgetContributorFactory;

@SuppressWarnings("restriction")
public class Java2WSSelectSEIWidgetFactory implements INamedWidgetContributorFactory {
    private static final String ENDPOINT_INTERFACE = "endpointInterface";
    
    private SimpleWidgetContributor classWidgetContributor;
    private SimpleWidgetContributor interfaceWidgetContributor;
    
    private Java2WSClassConfigWidget java2WSClassConfigWidget = new Java2WSClassConfigWidget();
    private Java2WSInterfaceConfigWidget java2WSInterfaceConfigWidget = new Java2WSInterfaceConfigWidget();

    private Java2WSDataModel model;
    private IType startingPointType;

    public INamedWidgetContributor getFirstNamedWidget() {
        if (startingPointType == null) {
            return null;
        }
        
        if (interfaceWidgetContributor == null || classWidgetContributor == null) {
            init();
        }

        try {
            if (startingPointType.isInterface()) {
                return interfaceWidgetContributor;
            } else if (startingPointType.isClass()) {
                checkForServiceEndpointInterface();
                return classWidgetContributor;
            }
        } catch (JavaModelException jme) {
            CXFCreationUIPlugin.log(jme.getStatus());
        }

        return null;
    }
    
    private void checkForServiceEndpointInterface() throws JavaModelException {
        IAnnotation[] annotations = startingPointType.getAnnotations();
        for (IAnnotation annotation : annotations) {
            if (annotation.getElementName().equals(WebService.class.getSimpleName())) {
                IMemberValuePair[] memberValuePairs = annotation.getMemberValuePairs();
                for (IMemberValuePair memberValuePair : memberValuePairs) {
                    if (memberValuePair.getMemberName().equals(ENDPOINT_INTERFACE)) {
                        String endpointInterface = memberValuePair.getValue().toString();
                        IType seiType = startingPointType.getJavaProject().findType(endpointInterface);
                        if (seiType != null && seiType.exists()) {
                            model.setUseServiceEndpointInterface(true);
                            model.setServiceEndpointInterfaceName(endpointInterface);
                        }
                    }
                }
            }
        }
    }

    public INamedWidgetContributor getNextNamedWidget(INamedWidgetContributor widgetContributor) {
        return null;
    }

    public void registerDataMappings(DataMappingRegistry dataRegistry) {
        dataRegistry.addMapping(Java2WSDefaultingCommand.class,
                "Java2WSDataModel", Java2WSSelectSEIWidgetFactory.class); //$NON-NLS-1$
        dataRegistry.addMapping(Java2WSDefaultingCommand.class,
                "JavaStartingPointType", Java2WSSelectSEIWidgetFactory.class); //$NON-NLS-1$
    }

    public void setJava2WSDataModel(Java2WSDataModel model) {
        this.model = model;
        java2WSClassConfigWidget.setJava2WSDataModel(model);
        java2WSInterfaceConfigWidget.setJava2WSDataModel(model);
    }

    public void setJavaStartingPointType(IType startingPointType) {
        this.startingPointType = startingPointType;
        java2WSClassConfigWidget.setJavaStartingPointType(startingPointType);
        java2WSInterfaceConfigWidget.setJavaStartingPointType(startingPointType);
    }

    private void init() {
        classWidgetContributor = new SimpleWidgetContributor();
        CXFContext context = CXFCorePlugin.getDefault().getJava2WSContext();
        String classConfigTitle = CXFCreationUIMessages.bind(
                CXFCreationUIMessages.JAVA2WS_CLASS_CONFIG_PAGE_TITLE, 
                new Object[]{context.getCxfRuntimeEdition(), context.getCxfRuntimeVersion()});
        classWidgetContributor.setTitle(classConfigTitle);
        classWidgetContributor
                .setDescription(CXFCreationUIMessages.JAVA2WS_CLASS_CONFIG_PAGE_DESCRIPTION);
        classWidgetContributor.setFactory(new WidgetContributorFactory() {
            public WidgetContributor create() {
                return java2WSClassConfigWidget;
            }
        });

        interfaceWidgetContributor = new SimpleWidgetContributor();
        String interfaceConfigTitle = CXFCreationUIMessages.bind(
                CXFCreationUIMessages.JAVA2WS_INTERFACE_CONFIG_PAGE_TITLE,
                new Object[]{context.getCxfRuntimeEdition(), context.getCxfRuntimeVersion()});
        interfaceWidgetContributor.setTitle(interfaceConfigTitle);
        interfaceWidgetContributor
                .setDescription(CXFCreationUIMessages.JAVA2WS_INTERFACE_CONFIG_PAGE_DESCRIPTION);
        interfaceWidgetContributor.setFactory(new WidgetContributorFactory() {
            public WidgetContributor create() {
                return java2WSInterfaceConfigWidget;
            }
        });
    }

}
