// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.debug.ui.launcher;

import java.util.ArrayList;

import org.chromium.debug.ui.launcher.ChromiumRemoteTab.HostChecker;
import org.chromium.sdk.util.BasicUtil;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
import org.eclipse.debug.ui.CommonTab;
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
import org.eclipse.debug.ui.ILaunchConfigurationTab;
import org.eclipse.debug.ui.sourcelookup.SourceLookupTab;

/**
 * The Chromium JavaScript debugger launch configuration tab group.
 */
public abstract class LaunchTabGroup extends AbstractLaunchConfigurationTabGroup {
  public static class Chromium extends LaunchTabGroup {
    @Override protected ChromiumRemoteTab<?> createRemoteTab() {
      return new ChromiumRemoteTab.DevToolsProtocol();
    }

    @Override
    protected ArrayList<ILaunchConfigurationTab> createTabList(ILaunchConfigurationDialog dialog,
        String mode) {
      ArrayList<ILaunchConfigurationTab> res = super.createTabList(dialog, mode);
      res.add(0, new DevToolsProtocolDeprecationTab());
      return res;
    }
  }

  public static class StandaloneV8 extends LaunchTabGroup {
    @Override protected ChromiumRemoteTab<?> createRemoteTab() {
      return new ChromiumRemoteTab.Standalone();
    }
  }

  public static class Wip extends LaunchTabGroup {
    @Override protected ChromiumRemoteTab<?> createRemoteTab() {
      return new WipRemoteTab();
    }
  }

  public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
    setTabs(BasicUtil.toArray(createTabList(dialog, mode), ILaunchConfigurationTab.class));
  }

  protected ArrayList<ILaunchConfigurationTab> createTabList(ILaunchConfigurationDialog dialog,
      String mode) {
    ArrayList<ILaunchConfigurationTab> result = new ArrayList<ILaunchConfigurationTab>(4);
    ChromiumRemoteTab<?> remoteTab = createRemoteTab();
    result.add(remoteTab);
    result.add(new SourceLookupTab());
    result.add(new ScriptMappingTab(remoteTab.getParams()));
    result.add(new CommonTab());
    return result;
  }

  protected abstract ChromiumRemoteTab<?> createRemoteTab();

  static class Params {
    private final HostChecker hostChecker;
    private final String scriptNameDescription;
    private final boolean enableSourceWrapper;

    Params(HostChecker hostChecker, String scriptNameDescription,
        boolean enableSourceWrapper) {
      this.hostChecker = hostChecker;
      this.scriptNameDescription = scriptNameDescription;
      this.enableSourceWrapper = enableSourceWrapper;
    }

    HostChecker getHostChecker() {
      return hostChecker;
    }

    String getScriptNameDescription() {
      return scriptNameDescription;
    }

    boolean preEnableSourceWrapper() {
      return enableSourceWrapper;
    }
  }
}
