/*
 * Copyright 2016 Google Inc. 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 "base/file_path.h"
#include "base/path_service.h"
#include "base/string_number_conversions.h"
#include "cobalt/base/wrap_main.h"
#include "cobalt/speech/sandbox/speech_sandbox.h"
#include "googleurl/src/gurl.h"

namespace cobalt {
namespace speech {
namespace sandbox {

SpeechSandbox* g_speech_sandbox = NULL;

// The application takes an audio url or path, and a timeout in second.
// The timeout is optional. If it is not set or set to 0, the application
// doesn't shut down.
void StartApplication(int argc, char** argv, const char* /*link*/,
                      const base::Closure& quit_closure) {
  if (argc != 3 && argc != 2) {
    LOG(ERROR) << "Usage: " << argv[0]
               << " <audio url|path> [timeout in seconds]";
    return;
  }

  int timeout = 0;
  if (argc == 3) {
    base::StringToInt(argv[2], &timeout);
  }

  DCHECK(!g_speech_sandbox);
  g_speech_sandbox = new SpeechSandbox(
      std::string(argv[1]),
      FilePath(FILE_PATH_LITERAL("speech_sandbox_trace.json")));

  if (timeout != 0) {
    MessageLoop::current()->PostDelayedTask(
        FROM_HERE, quit_closure, base::TimeDelta::FromSeconds(timeout));
  }
}

void StopApplication() {
  DCHECK(g_speech_sandbox);
  delete g_speech_sandbox;
  g_speech_sandbox = NULL;
}

}  // namespace sandbox
}  // namespace speech
}  // namespace cobalt

COBALT_WRAP_BASE_MAIN(cobalt::speech::sandbox::StartApplication,
                      cobalt::speech::sandbox::StopApplication);
