#pragma once
#include "UVHandle.h"
#include <panda/unievent/backend/TimerImpl.h>

namespace panda { namespace unievent { namespace backend { namespace uv {

struct UVTimer : UVHandle<TimerImpl, uv_timer_t> {
    UVTimer (UVLoop* loop, ITimerImplListener* lst) : UVHandle<TimerImpl, uv_timer_t>(loop, lst) {
        uv_timer_init(loop->uvloop, &uvh);
    }

    void start (uint64_t repeat, uint64_t initial) override {
        uv_timer_start(&uvh, _call, initial, repeat);
    }

    void stop () noexcept override {
        uv_timer_stop(&uvh);
    }

    std::error_code again () override {
        return uvx_ce(uv_timer_again(&uvh));
    }

    uint64_t repeat () const override {
        return uv_timer_get_repeat(&uvh);
    }

    void repeat (uint64_t repeat) override {
        uv_timer_set_repeat(&uvh, repeat);
    }

    uint64_t due_in () const override {
        return uv_timer_get_due_in(&uvh);
    }

private:
    static void _call (uv_timer_t* p) {
        get_handle<UVTimer*>(p)->handle_timer();
    }
};

}}}}