package timekeeper

import (
	"container/heap"
	"sync"
	"time"

	"v.io/core/veyron/lib/timekeeper"
)

// ManualTime is a time keeper that allows control over the advancement of time.
type ManualTime interface {
	timekeeper.TimeKeeper
	// AdvanceTime advances the current time by d.
	AdvanceTime(d time.Duration)
	// Requests provides a channel where the requested delays for After and
	// Sleep can be observed.
	Requests() <-chan time.Duration
}

// item is a heap element: every request for After is added to the heap with its
// wake-up time as key (where wake-up time is current time + requested delay
// duration).  As current time advances, items are plucked from the heap and the
// clients are notified.
type item struct {
	t  time.Time        // Wake-up time.
	ch chan<- time.Time // Client notification channel.
}

type timeHeap []*item

func (th timeHeap) Len() int { return len(th) }

func (th timeHeap) Less(i, j int) bool {
	return th[i].t.Before(th[j].t)
}

func (th timeHeap) Swap(i, j int) {
	th[i], th[j] = th[j], th[i]
}

func (th *timeHeap) Push(x interface{}) {
	item := x.(*item)
	*th = append(*th, item)
}

func (th *timeHeap) Pop() interface{} {
	old := *th
	n := len(old)
	item := old[n-1]
	*th = old[0 : n-1]
	return item
}

// manualTime implements TimeKeeper.
type manualTime struct {
	sync.Mutex
	current  time.Time // The current time.
	schedule timeHeap  // The heap of items still to be woken up.
	requests chan time.Duration
}

// After implements TimeKeeper.After.
func (mt *manualTime) After(d time.Duration) <-chan time.Time {
	mt.Lock()
	defer mt.Unlock()
	ch := make(chan time.Time, 1)
	if d <= 0 {
		ch <- mt.current
	} else {
		heap.Push(&mt.schedule, &item{t: mt.current.Add(d), ch: ch})
	}
	mt.requests <- d
	return ch
}

// Sleep implements TimeKeeper.Sleep.
func (mt *manualTime) Sleep(d time.Duration) {
	<-mt.After(d)
}

// AdvanceTime implements ManualTime.AdvanceTime.
func (mt *manualTime) AdvanceTime(d time.Duration) {
	mt.Lock()
	defer mt.Unlock()
	if d > 0 {
		mt.current = mt.current.Add(d)
	}
	for {
		if mt.schedule.Len() == 0 {
			break
		}
		top := mt.schedule[0]
		if top.t.After(mt.current) {
			break
		}
		top.ch <- mt.current
		heap.Pop(&mt.schedule)
	}
}

// Requests implements ManualTime.Requests.
func (mt *manualTime) Requests() <-chan time.Duration { return mt.requests }

// NewManualTime constructs a new instance of ManualTime, with current time set
// at 0.
func NewManualTime() ManualTime {
	mt := &manualTime{
		schedule: make([]*item, 0),
		// 1000 should be plenty to avoid blocking on adding items
		// to the channel, but technically we can still end up blocked.
		requests: make(chan time.Duration, 1000),
	}
	heap.Init(&mt.schedule)
	return mt
}
