package transport

import (
	"ripple/bug"
	"ripple/types"
)

type AccountSenderManager struct {
	transport *AccountTransport
	workers   map[types.UserIdentifier]*doubleSenderWorker
}

func newAccountSenderManager(transport *AccountTransport) *AccountSenderManager {
	return &AccountSenderManager{
		transport: transport,
		workers:   make(map[types.UserIdentifier]*doubleSenderWorker),
	}
}

func (m *AccountSenderManager) AddAccount(id types.UserIdentifier) {
	if _, ok := m.workers[id]; ok {
		panic(bug.BugStateViolated)
	}
	w := newDoubleSenderWorker(m.transport)
	m.workers[id] = w
}

func (m *AccountSenderManager) RemoveAccount(id types.UserIdentifier) {
	w, ok := m.workers[id]
	if !ok {
		panic(bug.BugStateViolated)
	}
	w.stop()
	delete(m.workers, id)
}

func (m *AccountSenderManager) enqueueWithIndex(idx int, tx types.Transaction) {
	w, ok := m.workers[tx.Identifier]
	if !ok {
		panic(bug.BugStateViolated)
	}
	w.enqueueWithIndex(idx, tx)
}