// Copyright 2016 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 "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);
