// 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/forensics/utils/time.h"

#include <lib/syslog/cpp/macros.h>
#include <lib/zx/time.h>

#include <ctime>

#include "src/lib/fxl/strings/string_printf.h"

namespace forensics {

std::optional<std::string> FormatDuration(zx::duration duration) {
  if (duration == zx::duration::infinite()) {
    return "inf";
  }

  if (duration < zx::sec(0)) {
    return std::nullopt;
  }

  int64_t d = duration.to_hours() / 24;
  duration -= zx::hour(d * 24);

  int64_t h = duration.to_hours();
  duration -= zx::hour(h);

  int64_t m = duration.to_mins();
  duration -= zx::min(m);

  int64_t s = duration.to_secs();

  return fxl::StringPrintf("%03ldd%02ldh%02ldm%02lds", d, h, m, s);
}

timekeeper::time_utc CurrentUtcTimeRaw(timekeeper::Clock* clock) {
  timekeeper::time_utc now_utc;
  // UtcNow returns a non-OK status only if the underlying handle is bad or we don't have sufficient
  // rights to read the clock. CHECK-FAIL if this happens because the C++ runtime is expected to
  // properly set up a clock.
  if (const zx_status_t status = clock->UtcNow(&now_utc); status != ZX_OK) {
    FX_PLOGS(FATAL, status) << "Failed to get current Utc time";
  }

  return now_utc;
}

std::string CurrentUtcTime(timekeeper::Clock* clock) {
  timekeeper::time_utc now_utc = CurrentUtcTimeRaw(clock);
  // std::gmtime expects epoch in seconds.
  const int64_t now_utc_seconds = now_utc.get() / zx::sec(1).get();
  char buffer[32];
  strftime(buffer, sizeof(buffer), "%Y-%m-%d %X %Z", std::gmtime(&now_utc_seconds));
  return std::string(buffer);
}

}  // namespace forensics
