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

// For now, this plugin only works on Linux machines.
// TODO(bjornick): Make this work on Mac and Android.

package ble

import (
	"v.io/v23/context"
	"v.io/x/ref/lib/discovery"
)

type blePlugin struct {
	b       *bleNeighborhood
	trigger *discovery.Trigger
}

func (b *blePlugin) Advertise(ctx *context.T, ad discovery.Advertisement, done func()) error {
	b.b.addAdvertisement(newAdvertisment(ad))
	stop := func() {
		b.b.removeService(ad.Service.InstanceId)
		done()
	}
	b.trigger.Add(stop, ctx.Done())
	return nil
}

func (b *blePlugin) Scan(ctx *context.T, serviceUuid discovery.Uuid, scan chan<- discovery.Advertisement, done func()) error {
	ch, id := b.b.addScanner(serviceUuid)
	drain := func() {
		for range ch {
		}
	}
	go func() {
		defer func() {
			b.b.removeScanner(id)
			go drain()
			done()
		}()
	L:
		for {
			select {
			case <-ctx.Done():
				break L
			case a := <-ch:
				scan <- *a
			}
		}
	}()
	return nil
}

func NewPlugin(name string) (discovery.Plugin, error) {
	b, err := newBleNeighborhood(name)
	if err != nil {
		return nil, err
	}
	return &blePlugin{b: b, trigger: discovery.NewTrigger()}, nil
}
