/*******************************************************************************
 * Copyright (c) 2009 Shane Clarke.
 * 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:
 *    Shane Clarke - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.ws.internal.jaxws.ui.annotations.correction;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
import org.eclipse.jdt.core.dom.rewrite.ListRewrite;
import org.eclipse.jdt.internal.corext.codemanipulation.CodeGenerationSettings;
import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility2;
import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
import org.eclipse.jdt.ui.SharedASTProvider;
import org.eclipse.jdt.ui.text.java.IInvocationContext;
import org.eclipse.jst.ws.annotations.core.utils.AnnotationUtils;
import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIPlugin;
import org.eclipse.ltk.core.refactoring.TextFileChange;
import org.eclipse.swt.graphics.Image;

@SuppressWarnings("restriction")
public class AddUnimplementedMethodCorrectionProposal extends AbstractJavaCorrectionPropsoal {

    private ASTNode typeDeclaration;
    private String endpointInterface;

    public AddUnimplementedMethodCorrectionProposal(IInvocationContext invocationContext, ASTNode typeDeclaration, 
            String endpointInterface, String displayString, int relevance, Image image) {
        super(invocationContext, displayString, relevance, image);
        this.endpointInterface = endpointInterface;
        this.typeDeclaration = typeDeclaration;
    }

    @Override
    public void addEdits(TextFileChange textChange) throws CoreException {
        IMethodBinding[] unimplementedMethods = getUnimplementedMethods(typeDeclaration, endpointInterface);
        if (unimplementedMethods.length == 0) {
            return;
        }

        ICompilationUnit compilationUnit = invocationContext.getCompilationUnit();
        
        CompilationUnit astRoot = invocationContext.getASTRoot();
        
        AST ast = astRoot.getAST();
        ASTRewrite rewriter = ASTRewrite.create(ast);
        
        CodeGenerationSettings settings = JavaPreferencesSettings.getCodeGenerationSettings(compilationUnit.getJavaProject());
        settings.overrideAnnotation = false;
        
        AbstractTypeDeclaration abstractTypeDeclaration = (AbstractTypeDeclaration) typeDeclaration;
        ListRewrite listRewrite = rewriter.getListRewrite(abstractTypeDeclaration, 
                abstractTypeDeclaration.getBodyDeclarationsProperty());
 
        ImportRewrite importRewrite = ImportRewrite.create(astRoot, true);

        for (int i = 0; i < unimplementedMethods.length; i++) {
            IMethodBinding methodBinding = unimplementedMethods[i];
            MethodDeclaration methodDeclaration = StubUtility2.createImplementationStub(compilationUnit, rewriter,
                    importRewrite, importRewrite.getDefaultImportRewriteContext(), methodBinding,
                    methodBinding.getDeclaringClass().getName(), settings, false);
            listRewrite.insertLast(methodDeclaration, null);
        }
        textChange.addEdit(rewriter.rewriteAST());
        if (importRewrite.hasRecordedChanges()) {
            textChange.addEdit(importRewrite.rewriteImports(null));
        }
    }
    
    public IMethodBinding[] getMethodsToImplement() {
        return getUnimplementedMethods(typeDeclaration, endpointInterface);
    }
    
    private IMethodBinding[] getUnimplementedMethods(ASTNode typeDeclaration, String endpointInterface) {
        List<IMethodBinding> methodBindings = new ArrayList<IMethodBinding>();
        if (typeDeclaration.getParent() instanceof CompilationUnit) {
            CompilationUnit implementationCompilationUnit = (CompilationUnit) typeDeclaration.getParent();
            if (implementationCompilationUnit.getJavaElement() instanceof ICompilationUnit) {
                try {
                    IJavaProject javaProject = implementationCompilationUnit.getJavaElement().getJavaProject();
                    IType seiType = javaProject.findType(endpointInterface);
                    
                    if (seiType != null) {
                        ICompilationUnit sei = seiType.getCompilationUnit();
                        CompilationUnit seiCompilationUnit = SharedASTProvider.getAST(sei, SharedASTProvider.WAIT_YES, null);
                        
                        List<MethodDeclaration> implementationMethods = getMethodDeclarations(
                                implementationCompilationUnit);
                        List<MethodDeclaration> seiMethods = getMethodDeclarations(seiCompilationUnit);
                        for (MethodDeclaration seiMethod : seiMethods) {
                            boolean implemented = false;
                            for (MethodDeclaration implMethod : implementationMethods) {                                
                                if (AnnotationUtils.compareMethods(seiMethod, implMethod)) {
                                    implemented = true;
                                    break;
                                }                   
                            }
                            if (!implemented) {
                                methodBindings.add(seiMethod.resolveBinding());
                            }
                        }
                    }
                } catch (JavaModelException jme) {
                    JAXWSUIPlugin.log(jme.getStatus());
                }
            }
            
        }
        return methodBindings.toArray(new IMethodBinding[methodBindings.size()]);
    }
    
    private List<MethodDeclaration> getMethodDeclarations(CompilationUnit compilationUnit) {
        final List<MethodDeclaration> methodDeclarations = new ArrayList<MethodDeclaration>();
        
        compilationUnit.accept(new ASTVisitor() {
            @Override
            public boolean visit(MethodDeclaration methodDeclaration) {
                methodDeclarations.add(methodDeclaration);
                return false;
            }
        });
        return methodDeclarations;
    }

}
