// Copyright 2018 The Cobalt 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.

#include "cobalt/browser/lifecycle_console_commands.h"

#include <string>

#include "base/bind.h"
#include "base/logging.h"
#include "starboard/system.h"

namespace cobalt {
namespace browser {

const char kPauseCommand[] = "pause";
const char kPauseCommandShortHelp[] = "Sends a request to pause Cobalt.";
const char kPauseCommandLongHelp[] =
    "Sends a request to the platform to pause Cobalt, indicating that it is "
    "not in focus and sending a blur event to the web application.";

const char kUnpauseCommand[] = "unpause";
const char kUnpauseCommandShortHelp[] = "Sends a request to unpause Cobalt.";
const char kUnpauseCommandLongHelp[] =
    "Sends a request to the platform to unpause Cobalt, resulting in a focus "
    "event being sent to the web application.";

const char kSuspendCommand[] = "suspend";
const char kSuspendCommandShortHelp[] = "Sends a request to suspend Cobalt.";
const char kSuspendCommandLongHelp[] =
    "Sends a request to the platform to suspend Cobalt, indicating that it is "
    "not visible and sending a hidden event to the web application.  Note that "
    "Cobalt may become unresponsive after this call and you will need to "
    "resume it in a platform-specific way.";

const char kQuitCommand[] = "quit";
const char kQuitCommandShortHelp[] = "Sends a request to stop Cobalt.";
const char kQuitCommandLongHelp[] =
    "Sends a request to the platform to stop Cobalt, shutting it down and "
    "ending the process (peacefully).";

namespace {
void OnPause(const std::string& /*message*/) { SbSystemRequestPause(); }

void OnUnpause(const std::string& /*message*/) { SbSystemRequestUnpause(); }

void OnSuspend(const std::string& /*message*/) {
  LOG(INFO) << "Suspending Cobalt through the console, but you will need to "
            << "resume Cobalt using a platform-specific method.";
  SbSystemRequestSuspend();
}

void OnQuit(const std::string& /*message*/) { SbSystemRequestStop(0); }
}  // namespace

LifecycleConsoleCommands::LifecycleConsoleCommands()
    : pause_command_handler_(kPauseCommand, base::Bind(&OnPause),
                             kPauseCommandShortHelp, kPauseCommandLongHelp),
      unpause_command_handler_(kUnpauseCommand, base::Bind(OnUnpause),
                               kUnpauseCommandShortHelp,
                               kUnpauseCommandLongHelp),
      suspend_command_handler_(kSuspendCommand, base::Bind(OnSuspend),
                               kSuspendCommandShortHelp,
                               kSuspendCommandLongHelp),
      quit_command_handler_(kQuitCommand, base::Bind(OnQuit),
                            kQuitCommandShortHelp, kQuitCommandLongHelp) {}

}  // namespace browser
}  // namespace cobalt
