// Copyright (c) 2011 The Chromium 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 "ppapi/shared_impl/time_conversion.h"

namespace ppapi {

namespace {

// Since WebKit doesn't use ticks for event times, we have to compute what
// the time ticks would be assuming the wall clock time doesn't change.
//
// This should only be used for WebKit times which we can't change the
// definition of.
double GetTimeToTimeTicksDeltaInSeconds() {
  static double time_to_ticks_delta_seconds = 0.0;
  if (time_to_ticks_delta_seconds == 0.0) {
    double wall_clock = TimeToPPTime(base::Time::Now());
    double ticks = TimeTicksToPPTimeTicks(base::TimeTicks::Now());
    time_to_ticks_delta_seconds = ticks - wall_clock;
  }
  return time_to_ticks_delta_seconds;
}

}  // namespace

PP_Time TimeToPPTime(base::Time t) {
  return t.ToDoubleT();
}

base::Time PPTimeToTime(PP_Time t) {
  // The time code handles exact "0" values as special, and produces
  // a "null" Time object. But calling code would expect t==0 to represent the
  // epoch (according to the description of PP_Time). Hence we just return the
  // epoch in this case.
  if (t == 0.0)
    return base::Time::UnixEpoch();
  return base::Time::FromDoubleT(t);
}

PP_TimeTicks TimeTicksToPPTimeTicks(base::TimeTicks t) {
  return static_cast<double>(t.ToInternalValue()) /
      base::Time::kMicrosecondsPerSecond;
}

PP_TimeTicks EventTimeToPPTimeTicks(double event_time) {
  return event_time + GetTimeToTimeTicksDeltaInSeconds();
}

double PPTimeTicksToEventTime(PP_TimeTicks t) {
  return t - GetTimeToTimeTicksDeltaInSeconds();
}

double PPGetLocalTimeZoneOffset(const base::Time& time) {
  // Explode it to local time and then unexplode it as if it were UTC. Also
  // explode it to UTC and unexplode it (this avoids mismatching rounding or
  // lack thereof). The time zone offset is their difference.
  base::Time::Exploded exploded = { 0 };
  base::Time::Exploded utc_exploded = { 0 };
  time.LocalExplode(&exploded);
  time.UTCExplode(&utc_exploded);
  if (exploded.HasValidValues() && utc_exploded.HasValidValues()) {
    base::Time adj_time = base::Time::FromUTCExploded(exploded);
    base::Time cur = base::Time::FromUTCExploded(utc_exploded);
    return (adj_time - cur).InSecondsF();
  }
  return 0.0;
}

}  // namespace ppapi
