// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/developer/forensics/utils/time.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("%ldd%ldh%ldm%lds", d, h, m, s);
}

std::optional<zx::time_utc> CurrentUtcTimeRaw(timekeeper::Clock* clock) {
  zx::time_utc now_utc;
  if (const zx_status_t status = clock->Now(&now_utc); status != ZX_OK) {
    return std::nullopt;
  }

  return now_utc;
}

std::optional<std::string> CurrentUtcTime(timekeeper::Clock* clock) {
  auto now_utc = CurrentUtcTimeRaw(clock);
  if (!now_utc.has_value()) {
    return std::nullopt;
  }
  // std::gmtime expects epoch in seconds.
  const int64_t now_utc_seconds = now_utc.value().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
