package org.bndtools.builder.handlers.activator;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.bndtools.build.api.AbstractBuildErrorDetailsHandler;
import org.bndtools.build.api.MarkerData;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.ui.IMarkerResolution;

import aQute.bnd.build.Project;
import aQute.bnd.osgi.Verifier.BundleActivatorError;
import aQute.service.reporter.Report.Location;

public class BundleActivatorErrorHandler extends AbstractBuildErrorDetailsHandler {

    @Override
    public List<MarkerData> generateMarkerData(IProject project, Project model, Location location) throws Exception {
        List<MarkerData> result = new ArrayList<MarkerData>();

        BundleActivatorError baError = (BundleActivatorError) location.details;

        IJavaProject javaProject = JavaCore.create(project);

        Map<String, Object> attribs = createMessageMarkerAttributes(baError, location.message);
        // Eclipse line numbers are 1 indexed
        attribs.put(IMarker.LINE_NUMBER, location.line + 1);

        // Add a marker to the bnd file on the BundleActivator line
        result.add(new MarkerData(getDefaultResource(project), attribs, false));

        MarkerData md;
        switch (baError.errorType) {
            case NO_SUITABLE_CONSTRUCTOR :
                md = createMethodMarkerData(javaProject, baError.activatorClassName, "<init>", "()V", createMessageMarkerAttributes(baError, location.message), false);
                if (md != null) {
                    result.add(md);
                    break;
                }
                //$FALL-THROUGH$
            case IS_INTERFACE :
            case IS_ABSTRACT :
            case NOT_PUBLIC :
            case NOT_AN_ACTIVATOR :
            case DEFAULT_PACKAGE :
            case IS_IMPORTED :
                md = createTypeMarkerData(javaProject, baError.activatorClassName, createMessageMarkerAttributes(baError, location.message), false);
                if (md != null)
                    result.add(md);
                break;
            case NOT_ACCESSIBLE :
            default :
                // No file to mark
                break;
        }

        return result;
    }

    private Map<String, Object> createMessageMarkerAttributes(BundleActivatorError baError, String message) {
        Map<String, Object> attribs = new HashMap<String, Object>();
        attribs.put("BundleActivatorError.activatorClassName", baError.activatorClassName);
        attribs.put("BundleActivatorError.errorType", baError.errorType.toString());
        attribs.put(IMarker.MESSAGE, message.trim());
        return attribs;
    }

    @Override
    public List<IMarkerResolution> getResolutions(IMarker marker) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public List<ICompletionProposal> getProposals(IMarker marker) {
        // TODO Auto-generated method stub
        return null;
    }

}
