package rpc

import (
	"go.uber.org/zap"
)

// NotifyAcks notifies engine about received acknowledgements.
func (e *Engine) NotifyAcks(ids []int64) {
	e.mux.Lock()
	defer e.mux.Unlock()

	for _, id := range ids {
		e.notifyAckUnlocked(id)
	}
}

func (e *Engine) notifyAckUnlocked(id int64) {
	ch, ok := e.ack[id]
	if ok {
		close(ch)
		delete(e.ack, id)
	}
}

func (e *Engine) waitAck(id int64) chan struct{} {
	e.mux.Lock()
	defer e.mux.Unlock()

	log := e.log.With(zap.Int64("ack_id", id))
	if c, found := e.ack[id]; found {
		log.Warn("Ack already registered")
		return c
	}

	c := make(chan struct{})
	e.ack[id] = c
	return c
}

func (e *Engine) removeAck(id int64) {
	e.mux.Lock()
	defer e.mux.Unlock()

	delete(e.ack, id)
}
