// Copyright 2018 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 "shill/geolocation_info.h"

#include <inttypes.h>

#include <base/strings/string_number_conversions.h>
#include <base/strings/stringprintf.h>
#include <chromeos/dbus/service_constants.h>

namespace {

// This key is special, because we will look for it and transform it into
// an up-to-date age property when D-Bus calls are made asking for geolocation
// objects. It should not be exported outside of shill.
constexpr char kLastSeenKey[] = "lastSeen";

}  // namespace

namespace shill {

void AddLastSeenTime(GeolocationInfo* info, const base::TimeTicks& time) {
  if (time.is_null())
    return;

  DCHECK(info);
  (*info)[kLastSeenKey] =
      base::StringPrintf("%" PRId64, (time - base::TimeTicks()).InSeconds());
}

GeolocationInfo PrepareGeolocationInfoForExport(const GeolocationInfo& info) {
  const auto& it = info.find(kLastSeenKey);
  if (it == info.end())
    return info;

  int64_t last_seen;
  if (!base::StringToInt64(it->second, &last_seen)) {
    DLOG(ERROR) << "Invalid last seen time: " << it->second;
    return GeolocationInfo();
  }

  // Calculate the age based on the current time. We have to
  // reconstitute last_seen into a TimeTicks so we can get a TimeDelta.
  base::TimeDelta age =
      base::TimeTicks::Now() -
      (base::TimeTicks() + base::TimeDelta::FromSeconds(last_seen));

  GeolocationInfo new_info(info);
  new_info.erase(kLastSeenKey);
  new_info[kGeoAgeProperty] = base::StringPrintf("%" PRId64, age.InSeconds());
  return new_info;
}

}  // namespace shill
