package org.jetbrains.debugger;

import com.intellij.openapi.util.ActionCallback;
import com.intellij.openapi.util.AsyncResult;
import com.intellij.util.CommonProcessors;
import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.debugger.values.FunctionValue;

public interface ScriptManager {
  String VM_SCHEME = "vm";

  @NotNull
  AsyncResult<String> getSource(@NotNull Script script);

  boolean hasSource(Script script);

  boolean containsScript(Script script);

  /**
   * Demands that script text should be replaced with a new one if possible. VM may get resumed after this command
   */
  @NotNull
  AsyncResult<?> setSourceOnRemote(@NotNull Script script, @NotNull CharSequence newSource, boolean preview);

  void forEachScript(@NotNull Processor<Script> scriptProcessor);

  @Nullable
  Script forEachScript(@NotNull CommonProcessors.FindProcessor<Script> scriptProcessor);

  @NotNull
  AsyncResult<Script> getScript(@NotNull FunctionValue function);

  @Nullable("if call frame script is native (at least in Google Chrome)")
  Script getScript(@NotNull CallFrame frame);

  @Nullable
  Script findScriptByUrl(@NotNull String rawUrl);

  @Nullable
  ActionCallback getScriptSourceMapLoadCallback(@NotNull Script script);
}