/*
 * Copyright (C) 2016 Google Inc.
 *
 * 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.googlecode.android_scripting.interpreter;

import android.content.Context;

import java.io.File;
import java.util.List;
import java.util.Map;

/**
 * Provides interpreter-specific info for execution/installation/removal purposes.
 * 
 * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
 */
public interface InterpreterDescriptor {

  /**
   * Returns unique name of the interpreter.
   */
  public String getName();

  /**
   * Returns display name of the interpreter.
   */
  public String getNiceName();

  /**
   * Returns supported script-file extension.
   */
  public String getExtension();

  /**
   * Returns interpreter version number.
   */
  public int getVersion();

  /**
   * Returns the binary as a File object. Context is the InterpreterProvider's {@link Context} and
   * is provided to find the interpreter installation directory.
   */
  public File getBinary(Context context);

  /**
   * Returns execution parameters in case when script name is not provided (when interpreter is
   * started in a shell mode);
   */
  public String getInteractiveCommand(Context context);

  /**
   * Returns command line arguments to execute a with a given script (format string with one
   * argument).
   */
  public String getScriptCommand(Context context);

  /**
   * Returns an array of command line arguments required to execute the interpreter (it's essential
   * that the order in the array is consistent with order of arguments in the command line).
   */
  public List<String> getArguments(Context context);

  /**
   * Should return a map of environment variables names and their values (or null if interpreter
   * does not require any environment variables).
   */
  public Map<String, String> getEnvironmentVariables(Context context);

  /**
   * Returns true if interpreter has an archive.
   */
  public boolean hasInterpreterArchive();

  /**
   * Returns true if interpreter has an extras archive.
   */
  public boolean hasExtrasArchive();

  /**
   * Returns true if interpreter comes with a scripts archive.
   */
  public boolean hasScriptsArchive();

  /**
   * Returns file name of the interpreter archive.
   */
  public String getInterpreterArchiveName();

  /**
   * Returns file name of the extras archive.
   */
  public String getExtrasArchiveName();

  /**
   * Returns file name of the scripts archive.
   */
  public String getScriptsArchiveName();

  /**
   * Returns URL location of the interpreter archive.
   */
  public String getInterpreterArchiveUrl();

  /**
   * Returns URL location of the scripts archive.
   */
  public String getScriptsArchiveUrl();

  /**
   * Returns URL location of the extras archive.
   */
  public String getExtrasArchiveUrl();

  /**
   * Returns true if interpreter can be executed in interactive mode.
   */
  public boolean hasInteractiveMode();
}
