// Copyright 2015 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 "base/bind.h"
#include "base/logging.h"
#include "base/macros.h"
#include "base/threading/thread.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
#include "mojo/application/application_runner_chromium.h"
#include "mojo/common/tracing_impl.h"
#include "mojo/public/c/system/main.h"
#include "mojo/public/cpp/application/application_delegate.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/application/service_provider_impl.h"

// This is an example app that uses implementation of tracing from mojo/common
// to participate in the tracing ecosystem.
//
// To collect a startup trace, run:
//   `mojo_run mojo:trace_me --trace-startup [--android]
//
// You can also use `mojo_debug` to start and stop tracing interactively.

namespace examples {

static const base::TimeDelta kDoWorkDelay =
    base::TimeDelta::FromMilliseconds(100);
static const base::TimeDelta kSleepTime =
    base::TimeDelta::FromMilliseconds(100);

void NestedFunction() {
  TRACE_EVENT0("trace_me", "NestedFunction");
  base::PlatformThread::Sleep(kSleepTime);
}

void DoWork() {
  TRACE_EVENT0("trace_me", "DoWork");
  base::PlatformThread::Sleep(kSleepTime);
  NestedFunction();
  base::PlatformThread::Sleep(kSleepTime);
  base::MessageLoop::current()->PostDelayedTask(FROM_HERE, base::Bind(&DoWork),
                                                kDoWorkDelay);
}

class TraceMeApp : public mojo::ApplicationDelegate {
 public:
  TraceMeApp() {}
  ~TraceMeApp() override {}

  // mojo:ApplicationDelegate:
  void Initialize(mojo::ApplicationImpl* app) override {
    // Allow TracingImpl to connect to the central tracing service, advertising
    // its ability to provide trace events.
    tracing_.Initialize(app->shell(), &app->args());

    TRACE_EVENT0("trace_me", "initialized");

    base::MessageLoop::current()->PostDelayedTask(
        FROM_HERE, base::Bind(&DoWork), kDoWorkDelay);
  }

  // mojo:ApplicationDelegate:
  bool ConfigureIncomingConnection(
      mojo::ServiceProviderImpl* service_provider_impl) override {
    TRACE_EVENT0("trace_me", "connected");
    return true;
  }

 private:
  mojo::TracingImpl tracing_;
  DISALLOW_COPY_AND_ASSIGN(TraceMeApp);
};

}  // namespace examples

MojoResult MojoMain(MojoHandle application_request) {
  mojo::ApplicationRunnerChromium runner(new examples::TraceMeApp);
  return runner.Run(application_request);
}
