/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Eclipse Public License, Version 1.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.eclipse.org/org/documents/epl-v10.php
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.ide.eclipse.ndk.internal.launch;

import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.internal.launch.AndroidLaunchController;
import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.ide.eclipse.ndk.internal.NdkHelper;

import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.ILaunchShortcut;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IEditorPart;

@SuppressWarnings("restriction") // for adt.internal classes
public class NdkGdbLaunchShortcut implements ILaunchShortcut {
    @Override
    public void launch(ISelection selection, String mode) {
        if (!(selection instanceof IStructuredSelection)) {
            return;
        }

        Object s = ((IStructuredSelection) selection).getFirstElement();
        if (!(s instanceof IAdaptable)) {
            return;
        }

        IResource r = (IResource) ((IAdaptable) s).getAdapter(IResource.class);
        if (r == null) {
            return;
        }

        IProject project = r.getProject();
        if (project == null) {
            return;
        }

        // verify that this is a non library Android project
        ProjectState state = Sdk.getProjectState(project);
        if (state == null || state.isLibrary()) {
            return;
        }

        // verify that this project has C/C++ nature
        if (!CoreModel.hasCCNature(project) && !CoreModel.hasCNature(project)) {
            AdtPlugin.printErrorToConsole(project,
                    String.format("Selected project (%s) does not have C/C++ nature. "
                            + "To add native support, right click on the project, "
                            + "Android Tools -> Add Native Support",
                            project.getName()));
            return;
        }

        debugProject(project, mode);
    }

    @Override
    public void launch(IEditorPart editor, String mode) {
    }

    private void debugProject(IProject project, String mode) {
        // obtain existing native debug config for project
        ILaunchConfiguration config = AndroidLaunchController.getLaunchConfig(project,
                NdkGdbLaunchDelegate.LAUNCH_TYPE_ID);
        if (config == null) {
            return;
        }

        // Set the ndk gdb specific launch attributes in the config (if necessary)
        if (!hasNdkAttributes(config)) {
            try {
                config = setNdkDefaults(config, project);
            } catch (CoreException e) {
                AdtPlugin.printErrorToConsole(project,
                        "Unable to create launch configuration for project.");
                return;
            }
        }

        // launch
        DebugUITools.launch(config, mode);
    }

    private boolean hasNdkAttributes(ILaunchConfiguration config) {
        try {
            // All NDK launch configurations have ATTR_REMOTE_TCP set to true
            boolean isRemote = config.getAttribute(IGDBLaunchConfigurationConstants.ATTR_REMOTE_TCP,
                    false);
            return isRemote;
        } catch (CoreException e) {
            return false;
        }
    }

    private ILaunchConfiguration setNdkDefaults(ILaunchConfiguration config, IProject project)
            throws CoreException {
        ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
        NdkHelper.setLaunchConfigDefaults(wc);
        wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, project.getName());
        return wc.doSave();
    }
}
