#pragma once

#ifndef GEODE_FWKLIB_TIMESYNC_H_
#define GEODE_FWKLIB_TIMESYNC_H_

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "fwklib/PerfFwk.hpp"

#include <ace/Time_Value.h>
#include "ace/OS.h"
#include "ace/Task.h"

namespace apache {
namespace geode {
namespace client {
namespace testframework {

// Some useful conversion constants
#define NANOS_PER_MICRO 1000
#define MICROS_PER_MILLI 1000
#define NANOS_PER_MILLI NANOS_PER_MICRO* MICROS_PER_MILLI

#define MILLIS_PER_SECOND 1000
#define MICROS_PER_SECOND MICROS_PER_MILLI* MILLIS_PER_SECOND
#define NANOS_PER_SECOND NANOS_PER_MICRO* MICROS_PER_SECOND

#define TIME_SYNC_PAUSE_SECONDS 1

class TimeSync : public ACE_Task_Base {
 private:
  int32_t* m_delta;
  bool volatile m_done;
  int32_t m_port;
  bool m_report;
  bool m_logged;

  int32_t svc();

  void sendTimeSync();

  void recvTimeSync();

 public:
  inline explicit TimeSync(int32_t port, int32_t* delta = nullptr,
                           bool report = false)
      : m_delta(delta),
        m_done(false),
        m_port(port),
        m_report(report),
        m_logged(false) {
    activate();
  }

  inline void stop() {
    m_done = true;
    sendTimeSync();
    perf::sleepSeconds(1 + TIME_SYNC_PAUSE_SECONDS);
    wait();
  }

  inline int64_t adjustedNowMicros() {
    int64_t retVal;
    ACE_Time_Value tv = ACE_OS::gettimeofday();
    retVal = timevalMicros(tv);
    if (m_delta != nullptr) {
      retVal += *m_delta;
    }
    return retVal;
  }

  inline static int64_t timevalMicros(const ACE_Time_Value& tv) {
    return ((tv.sec() * static_cast<int64_t>(MICROS_PER_SECOND)) + tv.usec());
  }
};

}  // namespace testframework
}  // namespace client
}  // namespace geode
}  // namespace apache

#endif  // GEODE_FWKLIB_TIMESYNC_H_
