// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package vc

import (
	"v.io/v23/verror"

	"v.io/x/ref/runtime/internal/lib/upcqueue"
	"v.io/x/ref/runtime/internal/rpc/stream"
)

var (
	// These errors are intended to be used as arguments to higher
	// level errors and hence {1}{2} is omitted from their format
	// strings to avoid repeating these n-times in the final error
	// message visible to the user.
	errListenerClosed = reg(".errListenerClosed", "Listener has been closed")
	errGetFromQueue   = reg(".errGetFromQueue", "upcqueue.Get failed{:3}")
)

type listener struct {
	q *upcqueue.T
}

var _ stream.Listener = (*listener)(nil)

func newListener() *listener { return &listener{q: upcqueue.New()} }

func (l *listener) Enqueue(f stream.Flow) error {
	err := l.q.Put(f)
	if err == upcqueue.ErrQueueIsClosed {
		return verror.New(stream.ErrBadState, nil, verror.New(errListenerClosed, nil))
	}
	return err
}

func (l *listener) Accept() (stream.Flow, error) {
	item, err := l.q.Get(nil)
	if err == upcqueue.ErrQueueIsClosed {
		return nil, verror.New(stream.ErrBadState, nil, verror.New(errListenerClosed, nil))
	}
	if err != nil {
		return nil, verror.New(stream.ErrNetwork, nil, verror.New(errGetFromQueue, nil, err))
	}
	return item.(stream.Flow), nil
}

func (l *listener) Close() error {
	l.q.Close()
	return nil
}
