// Copyright 2013 The Flutter 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 "flutter/fml/time/dart_timestamp_provider.h"

#include "dart_tools_api.h"

namespace fml {

DartTimestampProvider::DartTimestampProvider() = default;

DartTimestampProvider::~DartTimestampProvider() = default;

int64_t DartTimestampProvider::ConvertToNanos(int64_t ticks,
                                              int64_t frequency) {
  int64_t nano_seconds = (ticks / frequency) * kNanosPerSecond;
  int64_t leftover_ticks = ticks % frequency;
  int64_t leftover_nanos = (leftover_ticks * kNanosPerSecond) / frequency;
  return nano_seconds + leftover_nanos;
}

fml::TimePoint DartTimestampProvider::Now() {
  const int64_t ticks = Dart_TimelineGetTicks();
  const int64_t frequency = Dart_TimelineGetTicksFrequency();
  // optimization for the most common case.
  if (frequency != kNanosPerSecond) {
    return fml::TimePoint::FromTicks(ConvertToNanos(ticks, frequency));
  } else {
    return fml::TimePoint::FromTicks(ticks);
  }
}

fml::TimePoint DartTimelineTicksSinceEpoch() {
  return DartTimestampProvider::Instance().Now();
}

}  // namespace fml
