// Copyright 2019 The Fuchsia 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 "src/developer/debug/shared/logging/debug.h"

#include <set>

#include "src/lib/fxl/logging.h"
#include "src/lib/fxl/strings/string_printf.h"
#include "src/lib/fxl/time/time_point.h"
#include "src/lib/files/path.h"

namespace debug_ipc {

namespace {

bool kDebugMode = false;

// This marks the moment SetDebugMode was called.
fxl::TimePoint kStartTime = fxl::TimePoint::Now();

std::set<LogCategory>& GetLogCategories() {
  static std::set<LogCategory> categories = {LogCategory::kAll};
  return categories;
}

}  // namespace

bool IsDebugModeActive() { return kDebugMode; }

void SetDebugMode(bool activate) { kDebugMode = activate; }

double SecondsSinceStart() {
  return (fxl::TimePoint::Now() - kStartTime).ToSecondsF();
}

const std::set<LogCategory>& GetActiveLogCategories() {
  return GetLogCategories();
}

void SetLogCategories(std::initializer_list<LogCategory> categories) {
  auto& active_categories = GetLogCategories();
  active_categories.clear();
  for (LogCategory category : categories) {
    active_categories.insert(category);
  }
}

bool IsLogCategoryActive(LogCategory category) {
  if (category == LogCategory::kAll)
    return true;

  const auto& active_categories = GetLogCategories();
  if (active_categories.count(LogCategory::kAll) > 0)
    return true;

  return active_categories.count(category) > 0;
}

std::string LogPreamble(LogCategory category, const FileLineFunction& origin) {
  auto basename = files::GetBaseName(origin.file());
  return fxl::StringPrintf("[%.3fs][%10s][%s:%d][%s]", SecondsSinceStart(),
                           LogCategoryToString(category), basename.c_str(),
                           origin.line(), origin.function().c_str());
}

const char* LogCategoryToString(LogCategory category) {
  switch (category) {
    case LogCategory::kAgent:
      return "Agent";
    case LogCategory::kArchArm64:
      return "arm64";
    case LogCategory::kArchx64:
      return "x64";
    case LogCategory::kBreakpoint:
      return "Breakpoint";
    case LogCategory::kJob:
      return "Job";
    case LogCategory::kMessageLoop:
      return "Loop";
    case LogCategory::kProcess:
      return "Process";
    case LogCategory::kRemoteAPI:
      return "DebugAPI";
    case LogCategory::kSetting:
      return "Setting";
    case LogCategory::kTiming:
      return "Timing";
    case LogCategory::kTest:
      return "Test";
    case LogCategory::kThread:
      return "Thread";
    case LogCategory::kAll:
      return "All";
  }

  FXL_NOTREACHED();
  return nullptr;
}

}  // namespace debug_ipc
