// 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 "chromecast/crash/app_state_tracker.h"

#include "base/lazy_instance.h"
#include "chromecast/crash/cast_crash_keys.h"

namespace {

struct CurrentAppState {
  std::string previous_app;
  std::string current_app;
  std::string last_launched_app;
};

base::LazyInstance<CurrentAppState>::DestructorAtExit g_app_state =
    LAZY_INSTANCE_INITIALIZER;

CurrentAppState* GetAppState() {
  return g_app_state.Pointer();
}

}  // namespace

namespace chromecast {

// static
std::string AppStateTracker::GetLastLaunchedApp() {
  return GetAppState()->last_launched_app;
}

// static
std::string AppStateTracker::GetCurrentApp() {
  return GetAppState()->current_app;
}

// static
std::string AppStateTracker::GetPreviousApp() {
  return GetAppState()->previous_app;
}

// static
void AppStateTracker::SetLastLaunchedApp(const std::string& app_id) {
  GetAppState()->last_launched_app = app_id;

  // TODO(slan): Currently SetCrashKeyValue is a no-op on chromecast until
  // we add call to InitCrashKeys
  base::debug::SetCrashKeyValue(crash_keys::kLastApp, app_id);
}

// static
void AppStateTracker::SetCurrentApp(const std::string& app_id) {
  CurrentAppState* app_state = GetAppState();
  app_state->previous_app = app_state->current_app;
  app_state->current_app = app_id;

  base::debug::SetCrashKeyValue(crash_keys::kCurrentApp, app_id);
  base::debug::SetCrashKeyValue(crash_keys::kPreviousApp,
                                app_state->previous_app);
}

}  // namespace chromecast
