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

#include "extensions/shell/browser/default_shell_browser_main_delegate.h"

#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/strings/string_tokenizer.h"
#include "extensions/common/switches.h"
#include "extensions/shell/browser/shell_extension_system.h"

#if defined(USE_AURA)
#include "extensions/shell/browser/shell_desktop_controller_aura.h"
#endif

#if defined(OS_MACOSX)
#include "extensions/shell/browser/shell_desktop_controller_mac.h"
#endif

namespace extensions {

DefaultShellBrowserMainDelegate::DefaultShellBrowserMainDelegate() {
}

DefaultShellBrowserMainDelegate::~DefaultShellBrowserMainDelegate() {
}

void DefaultShellBrowserMainDelegate::Start(
    content::BrowserContext* browser_context) {
  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
  if (command_line->HasSwitch(switches::kLoadApps)) {
    ShellExtensionSystem* extension_system = static_cast<ShellExtensionSystem*>(
        ExtensionSystem::Get(browser_context));
    extension_system->Init();

    base::CommandLine::StringType path_list =
        command_line->GetSwitchValueNative(switches::kLoadApps);

    base::StringTokenizerT<base::CommandLine::StringType,
                           base::CommandLine::StringType::const_iterator>
        tokenizer(path_list, FILE_PATH_LITERAL(","));

    std::string launch_id;
    while (tokenizer.GetNext()) {
      base::FilePath app_absolute_dir =
          base::MakeAbsoluteFilePath(base::FilePath(tokenizer.token()));

      const Extension* extension = extension_system->LoadApp(app_absolute_dir);
      if (!extension)
        continue;
      if (launch_id.empty())
        launch_id = extension->id();
    }

    if (!launch_id.empty())
      extension_system->LaunchApp(launch_id);
    else
      LOG(ERROR) << "Could not load any apps.";
  } else {
    LOG(ERROR) << "--" << switches::kLoadApps
               << " unset; boredom is in your future";
  }
}

void DefaultShellBrowserMainDelegate::Shutdown() {
}

DesktopController* DefaultShellBrowserMainDelegate::CreateDesktopController() {
#if defined(USE_AURA)
  return new ShellDesktopControllerAura();
#elif defined(OS_MACOSX)
  return new ShellDesktopControllerMac();
#else
  return NULL;
#endif
}

}  // namespace extensions
