package core

import (
	"sync"
	"time"
)

// Clock is a V2Ray feature that returns current time.
type Clock interface {
	Feature

	// Now returns current time.
	Now() time.Time
}

type syncClock struct {
	sync.RWMutex
	Clock
}

func (c *syncClock) Now() time.Time {
	c.RLock()
	defer c.RUnlock()

	if c.Clock == nil {
		return time.Now()
	}

	return c.Clock.Now()
}

func (c *syncClock) Start() error {
	c.RLock()
	defer c.RUnlock()

	if c.Clock == nil {
		return nil
	}

	return c.Clock.Start()
}

func (c *syncClock) Close() error {
	c.RLock()
	defer c.RUnlock()

	if c.Clock == nil {
		return nil
	}

	return c.Clock.Close()
}

func (c *syncClock) Set(clock Clock) {
	c.Lock()
	defer c.Unlock()

	c.Clock = clock
}