// 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/application_runner.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);

    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);
}
