// Copyright 2013 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.

#ifndef APPS_LAUNCHER_H_
#define APPS_LAUNCHER_H_

#include <memory>
#include <string>
#include <vector>

#include "extensions/common/api/app_runtime.h"
#include "extensions/common/constants.h"

class GURL;

namespace base {
class CommandLine;
class FilePath;
}

namespace content {
class BrowserContext;
}

namespace extensions {
class Extension;
namespace api {
namespace app_runtime {
struct ActionData;
}
}
}

namespace apps {

// Launches the platform app |app|. Creates appropriate launch data for the
// |command_line| fields present. |app| and |context| must not be NULL. An empty
// |command_line| means there is no launch data. If non-empty,
// |current_directory| is used to expand any relative paths on the command line.
// |source| is one of the enumerated values which trace how the app is launched.
void LaunchPlatformAppWithCommandLine(content::BrowserContext* context,
                                      const extensions::Extension* app,
                                      const base::CommandLine& command_line,
                                      const base::FilePath& current_directory,
                                      extensions::AppLaunchSource source);

// As above but includes |launch_id|, an id that can be passed to
// an app when launched in order to support multiple shelf items per app.
void LaunchPlatformAppWithCommandLineAndLaunchId(
    content::BrowserContext* context,
    const extensions::Extension* app,
    const std::string& launch_id,
    const base::CommandLine& command_line,
    const base::FilePath& current_directory,
    extensions::AppLaunchSource source);

// Launches the platform app |app| by issuing an onLaunched event with the
// contents of |file_path| available through the launch data.
void LaunchPlatformAppWithPath(content::BrowserContext* context,
                               const extensions::Extension* app,
                               const base::FilePath& file_path);

// Launches the platform app |app| by issuing an onLaunched event with the
// contents of |file_paths| available through the launch data.
void LaunchPlatformAppWithFilePaths(
    content::BrowserContext* context,
    const extensions::Extension* app,
    const std::vector<base::FilePath>& file_paths);

// Launches the platform app |app| with the specific |action_data|. |file_path|
// is an optional argument and if present contains the file that the app should
// open w.r.t. the given action.
void LaunchPlatformAppWithAction(
    content::BrowserContext* context,
    const extensions::Extension* app,
    std::unique_ptr<extensions::api::app_runtime::ActionData> action_data,
    const base::FilePath& file_path);

// Launches the platform app |app|. |source| tells us how the app is launched.
void LaunchPlatformApp(content::BrowserContext* context,
                       const extensions::Extension* app,
                       extensions::AppLaunchSource source);

// Launches the platform app |app| with |handler_id| and the contents of
// |file_paths| available through the launch data. |handler_id| corresponds to
// the id of the file_handlers item in the manifest that resulted in a match
// that triggered this launch.
void LaunchPlatformAppWithFileHandler(
    content::BrowserContext* context,
    const extensions::Extension* app,
    const std::string& handler_id,
    const std::vector<base::FilePath>& file_paths);

// Launches the platform app |app| with |handler_id|, |url| and |referrer_url|
// available through the launch data. |handler_id| corresponds to the id of the
// file_handlers item in the manifest that resulted in a match that triggered
// this launch.
void LaunchPlatformAppWithUrl(content::BrowserContext* context,
                              const extensions::Extension* app,
                              const std::string& handler_id,
                              const GURL& url,
                              const GURL& referrer_url);

void RestartPlatformApp(content::BrowserContext* context,
                        const extensions::Extension* app);

}  // namespace apps

#endif  // APPS_LAUNCHER_H_
