/*
 * Copyright 2016 The Bazel Authors. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
 *
 * 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.google.idea.blaze.android.run.runner;

import com.android.tools.idea.run.ValidationError;
import com.android.tools.idea.run.editor.AndroidDebugger;
import com.android.tools.idea.run.editor.AndroidDebuggerState;
import com.android.tools.idea.run.editor.AndroidJavaDebugger;
import com.android.tools.ndk.run.editor.NativeAndroidDebuggerState;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import com.google.idea.blaze.android.cppapi.BlazeNativeDebuggerIdProvider;
import com.google.idea.blaze.android.run.BlazeAndroidRunConfigurationCommonState;
import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.JDOMExternalizable;
import com.intellij.openapi.util.WriteExternalException;
import org.jdom.Element;
import org.jetbrains.android.facet.AndroidFacet;

import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * Manages android debugger state for the run configurations.
 */
public class BlazeAndroidRunConfigurationDebuggerManager implements JDOMExternalizable {
  private final Project project;
  private final Map<String, AndroidDebuggerState> androidDebuggerStates = Maps.newHashMap();
  private final BlazeAndroidRunConfigurationCommonState commonState;

  BlazeAndroidRunConfigurationDebuggerManager(Project project,
                                              BlazeAndroidRunConfigurationCommonState commonState) {
    this.project = project;
    this.commonState = commonState;
    for (AndroidDebugger androidDebugger: getAndroidDebuggers()) {
      this.androidDebuggerStates.put(androidDebugger.getId(), androidDebugger.createState());
    }
  }

  List<ValidationError> validate(AndroidFacet facet) {
    // All of the AndroidDebuggerState classes implement a validate that either does nothing or is specific to gradle so there is no point
    // in calling validate on our AndroidDebuggerState.
    return ImmutableList.of();
  }

  @Nullable
  AndroidDebugger getAndroidDebugger() {
    String debuggerID = getDebuggerID();
    for (AndroidDebugger androidDebugger: getAndroidDebuggers()) {
      if (androidDebugger.getId().equals(debuggerID)) {
        return androidDebugger;
      }
    }
    return null;
  }

  @Nullable
  final <T extends AndroidDebuggerState> T getAndroidDebuggerState() {
    T androidDebuggerState = getAndroidDebuggerState(getDebuggerID());
    // Set our working directory to our workspace root for native debugging.
    if (androidDebuggerState instanceof NativeAndroidDebuggerState) {
      NativeAndroidDebuggerState nativeState = (NativeAndroidDebuggerState)androidDebuggerState;
      String workingDirPath = WorkspaceRoot.fromProject(project).directory().getPath();
      nativeState.setWorkingDir(workingDirPath);
    }
    return androidDebuggerState;
  }

  private static List<AndroidDebugger> getAndroidDebuggers() {
    // This includes the native debugger(s).
    return Arrays.asList(AndroidDebugger.EP_NAME.getExtensions());
  }

  private String getDebuggerID() {
    BlazeNativeDebuggerIdProvider blazeNativeDebuggerIdProvider = BlazeNativeDebuggerIdProvider.getInstance();
    return (blazeNativeDebuggerIdProvider != null && commonState.isNativeDebuggingEnabled())
           ? blazeNativeDebuggerIdProvider.getDebuggerId()
           : AndroidJavaDebugger.ID;
  }

  @Nullable
  private final <T extends AndroidDebuggerState> T getAndroidDebuggerState(String androidDebuggerId) {
    AndroidDebuggerState state = androidDebuggerStates.get(androidDebuggerId);
    return (state != null) ? (T)state : null;
  }

  @Override
  public void readExternal(Element element) throws InvalidDataException {
    for (Map.Entry<String, AndroidDebuggerState> entry: androidDebuggerStates.entrySet()) {
      Element optionElement = element.getChild(entry.getKey());
      if (optionElement != null) {
        entry.getValue().readExternal(optionElement);
      }
    }
  }

  @Override
  public void writeExternal(Element element) throws WriteExternalException {
    for (Map.Entry<String, AndroidDebuggerState> entry: androidDebuggerStates.entrySet()) {
      Element optionElement = new Element(entry.getKey());
      element.addContent(optionElement);
      entry.getValue().writeExternal(optionElement);
    }
  }
}
