/*
 *
 *    Copyright (c) 2016-2017 Nest Labs, Inc.
 *    All rights reserved.
 *
 *    Licensed 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.
 */

/**
 *    @file
 *      This file defines the nl::Weave::System::Timer class and its
 *      related types used for representing an in-progress one-shot
 *      timer.
 */

#ifndef SYSTEMTIMER_H
#define SYSTEMTIMER_H

// Include configuration headers
#include <SystemLayer/SystemConfig.h>

// Include dependent headers
#include <Weave/Support/NLDLLUtil.h>

#include <SystemLayer/SystemError.h>
#include <SystemLayer/SystemObject.h>
#include <SystemLayer/SystemStats.h>

#if WEAVE_SYSTEM_CONFIG_PROVIDE_OBSOLESCENT_INTERFACES

namespace nl {
namespace Inet {

class InetLayer;

} // namespace Inet
} // namespace nl

#endif // WEAVE_SYSTEM_CONFIG_PROVIDE_OBSOLESCENT_INTERFACES

namespace nl {
namespace Weave {
namespace System {

class Layer;

enum {
    kTimerFactor_nano_per_micro     = 1000,         /** Number of nanoseconds in a microsecond. */
    kTimerFactor_micro_per_milli    = 1000,         /** Number of microseconds in a millisecond. */
    kTimerFactor_milli_per_unit     = 1000,         /** Number of milliseconds in a second. */

    kTimerFactor_nano_per_milli     = 1000000,      /** Number of nanoseconds in a millisecond. */
    kTimerFactor_micro_per_unit     = 1000000       /** Number of microseconds in a second. */
};

/**
 * @class Timer
 *
 * @brief
 *  This is an internal class to Weave System Layer, used to represent an in-progress one-shot timer. There is no real public
 *  interface available for the application layer. The static public methods used to acquire current system time are intended for
 *  internal use.
 *
 */
class NL_DLL_EXPORT Timer : public Object
{
    friend class Layer;

public:
    /**
     *  Represents an epoch in the local system timescale, usually the POSIX timescale.
     *
     *  The units are dependent on the context. If used with values returned by GetCurrentEpoch, the units are milliseconds.
     */
    typedef uint64_t Epoch;

    static Epoch GetCurrentEpoch(void);
    static bool IsEarlierEpoch(const Epoch &first, const Epoch &second);

    typedef void (*OnCompleteFunct)(Layer* aLayer, void* aAppState, Error aError);
    OnCompleteFunct OnComplete;

    Error Start(uint32_t aDelayMilliseconds, OnCompleteFunct aOnComplete, void* aAppState);
    Error Cancel(void);

    static void GetStatistics(nl::Weave::System::Stats::count_t& aNumInUse);

#if WEAVE_SYSTEM_CONFIG_PROVIDE_OBSOLESCENT_INTERFACES
    void AttachInetLayer(Inet::InetLayer& aInetLayer, void* aOnCompleteInetLayer, void* aAppStateInetLayer);
    Inet::InetLayer* InetLayer(void) const;
    void* OnCompleteInetLayer(void) const;
    void* AppStateInetLayer(void) const;
#endif // WEAVE_SYSTEM_CONFIG_PROVIDE_OBSOLESCENT_INTERFACES

private:
    static ObjectPool<Timer, WEAVE_SYSTEM_CONFIG_NUM_TIMERS> sPool;

    Epoch mAwakenEpoch;

#if WEAVE_SYSTEM_CONFIG_PROVIDE_OBSOLESCENT_INTERFACES
    Inet::InetLayer* mInetLayer;
    void* mOnCompleteInetLayer;
    void* mAppStateInetLayer;
#endif // WEAVE_SYSTEM_CONFIG_PROVIDE_OBSOLESCENT_INTERFACES

    void HandleComplete(void);

    Error ScheduleWork(OnCompleteFunct aOnComplete, void* aAppState);

#if WEAVE_SYSTEM_CONFIG_USE_LWIP
    Timer *mNextTimer;

    static Error HandleExpiredTimers(Layer& aLayer);
#endif // WEAVE_SYSTEM_CONFIG_USE_LWIP

    // Not defined
    Timer(const Timer&);
    Timer& operator =(const Timer&);
};

inline void Timer::GetStatistics(nl::Weave::System::Stats::count_t& aNumInUse)
{
    sPool.GetStatistics(aNumInUse);
}

#if WEAVE_SYSTEM_CONFIG_PROVIDE_OBSOLESCENT_INTERFACES
inline void Timer::AttachInetLayer(Inet::InetLayer& aInetLayer, void* aOnCompleteInetLayer, void* aAppStateInetLayer)
{
    this->mInetLayer = &aInetLayer;
    this->mOnCompleteInetLayer = aOnCompleteInetLayer;
    this->mAppStateInetLayer = aAppStateInetLayer;
}

inline Inet::InetLayer* Timer::InetLayer(void) const
{
    return this->mInetLayer;
}

inline void* Timer::OnCompleteInetLayer(void) const
{
    return this->mOnCompleteInetLayer;
}

inline void* Timer::AppStateInetLayer(void) const
{
    return this->mAppStateInetLayer;
}
#endif // WEAVE_SYSTEM_CONFIG_PROVIDE_OBSOLESCENT_INTERFACES

} // namespace System
} // namespace Weave
} // namespace nl

#endif // defined(SYSTEMTIMER_H)
