// Copyright 2021 The Chromium OS 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 <string>

#include <base/logging.h>
#include <base/strings/stringprintf.h>

#include "timberslide/string_transformer.h"

namespace timberslide {

// Matching lines look like: [1234.5678 EC message goes here] .
std::string StringTransformer::AddHostTs(const std::string& s) {
  const base::Time logline_ts = GetLineTimestamp(s);
  return FormatTime(logline_ts).append(" ").append(s);
}

void StringTransformer::UpdateTimestamps(int64_t ec_uptime_ms,
                                         const base::Time& now) {
  ec_current_uptime_ms_ = ec_uptime_ms;
  timestamp_ = now;
}

std::string StringTransformer::FormatTime(const base::Time& time) {
  base::Time::Exploded e;

  // This format matches the syslog format used by default in ChromeOS logs
  time.UTCExplode(&e);
  return base::StringPrintf("%04d-%02d-%02dT%02d:%02d:%02d.%06dZ", e.year,
                            e.month, e.day_of_month, e.hour, e.minute, e.second,
                            e.millisecond * 1000);
}

// Some lines doesn't contain EC timestamp. In this case we just add
// timestamp from previous line in block. When first line in block
// doesn't contain timestamp, we add current time which is better than
// adding nothing
base::Time StringTransformer::GetLineTimestamp(const std::string& s) {
  // Check if EC uptime is initialized, if not use current time
  if (ec_current_uptime_ms_ < 0) {
    LOG(WARNING) << "Cannot obtain precise line timestamp - EC uptime is "
                    "not initialized";
    return base::Time::UnixEpoch();
  }

  double ec_ts;

  if (!RE2::PartialMatch(s, ec_timestamp_pattern_, &ec_ts))
    return logline_tm_;

  // Calculate delta from EC's uptime.
  const base::TimeDelta ec_sync(
      base::TimeDelta::FromMilliseconds(ec_current_uptime_ms_));
  const base::TimeDelta logline_tm(base::TimeDelta::FromSecondsD(ec_ts));
  const base::TimeDelta logline_delta(ec_sync - logline_tm);
  logline_tm_ = timestamp_ - logline_delta;

  return logline_tm_;
}

}  // namespace timberslide
