// 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 discovery

import (
	"sync"

	"v.io/v23"
	"v.io/v23/context"
	"v.io/v23/discovery"
	"v.io/v23/rpc"
	"v.io/v23/security"
	sdiscovery "v.io/v23/services/discovery"
	"v.io/v23/verror"
)

const pkgPath = "v.io/x/ref/services/discovery"

const (
	maxActiveHandles = int(^uint16(0)) // 65535.
)

var (
	errTooManyServices = verror.Register(pkgPath+".errTooManyServices", verror.NoRetry, "{1:}{2:} too many registered services")
)

type impl struct {
	ctx *context.T
	d   discovery.T

	mu         sync.Mutex
	handles    map[sdiscovery.ServiceHandle]func() // GUARDED_BY(mu)
	lastHandle sdiscovery.ServiceHandle            // GUARDED_BY(mu)
}

func (s *impl) RegisterService(ctx *context.T, call rpc.ServerCall, service discovery.Service, visibility []security.BlessingPattern) (sdiscovery.ServiceHandle, string, error) {
	ctx, cancel := context.WithCancel(s.ctx)
	done, err := s.d.Advertise(ctx, &service, visibility)
	if err != nil {
		cancel()
		return 0, "", err
	}

	s.mu.Lock()
	if len(s.handles) >= maxActiveHandles {
		s.mu.Unlock()
		cancel()
		return 0, "", verror.New(errTooManyServices, ctx)
	}
	handle := s.lastHandle + 1
	for {
		if handle == 0 { // Avoid zero handle.
			handle++
		}
		if _, exist := s.handles[handle]; !exist {
			break
		}
	}
	s.handles[handle] = func() {
		cancel()
		<-done
	}
	s.lastHandle = handle
	s.mu.Unlock()
	return handle, service.InstanceId, nil
}

func (s *impl) UnregisterService(ctx *context.T, call rpc.ServerCall, handle sdiscovery.ServiceHandle) error {
	s.mu.Lock()
	stop := s.handles[handle]
	delete(s.handles, handle)
	s.mu.Unlock()
	if stop != nil {
		stop()
	}
	return nil
}

func (s *impl) Scan(ctx *context.T, call sdiscovery.ScannerScanServerCall, query string) error {
	updateCh, err := s.d.Scan(ctx, query)
	if err != nil {
		return err
	}

	stream := call.SendStream()
	for update := range updateCh {
		if err = stream.Send(update); err != nil {
			return err
		}
	}
	return nil
}

// NewDiscoveryService returns a new Discovery service implementation.
func NewDiscoveryService(ctx *context.T) sdiscovery.DiscoveryServerMethods {
	return &impl{
		ctx:     ctx,
		d:       v23.GetDiscovery(ctx),
		handles: make(map[sdiscovery.ServiceHandle]func()),
	}
}
