package gatt

import (
	"errors"
	"sync"
)

// Peripheral is the interface that represent a remote peripheral device.
type Peripheral interface {
	// Device returns the underlying device.
	Device() Device

	// ID is the platform specific unique ID of the remote peripheral, e.g. MAC for Linux, Peripheral UUID for MacOS.
	ID() string

	// Name returns the name of the remote peripheral.
	// This can be the advertised name, if exists, or the GAP device name, which takes priority
	Name() string

	// Services returnns the services of the remote peripheral which has been discovered.
	Services() []*Service

	// DiscoverServices discover the specified services of the remote peripheral.
	// If the specified services is set to nil, all the available services of the remote peripheral are returned.
	DiscoverServices(s []UUID) ([]*Service, error)

	// DiscoverIncludedServices discovers the specified included services of a service.
	// If the specified services is set to nil, all the included services of the service are returned.
	DiscoverIncludedServices(ss []UUID, s *Service) ([]*Service, error)

	// DiscoverCharacteristics discovers the specified characteristics of a service.
	// If the specified characterstics is set to nil, all the characteristic of the service are returned.
	DiscoverCharacteristics(c []UUID, s *Service) ([]*Characteristic, error)

	// DiscoverDescriptors discovers the descriptors of a characteristic.
	// If the specified descriptors is set to nil, all the descriptors of the characteristic are returned.
	DiscoverDescriptors(d []UUID, c *Characteristic) ([]*Descriptor, error)

	// ReadCharacteristic retrieves the value of a specified characteristic.
	ReadCharacteristic(c *Characteristic) ([]byte, error)

	// ReadCharacteristicBlob retrieves the value of a specified characteristic by ReadBlob.
	ReadCharacteristicBlob(c *Characteristic) ([]byte, error)

	// ReadDescriptor retrieves the value of a specified characteristic descriptor.
	ReadDescriptor(d *Descriptor) ([]byte, error)

	// WriteCharacteristic writes the value of a characteristic.
	WriteCharacteristic(c *Characteristic, b []byte, noRsp bool) error

	// WriteDescriptor writes the value of a characteristic descriptor.
	WriteDescriptor(d *Descriptor, b []byte) error

	// SetNotifyValue sets notifications for the value of a specified characteristic.
	SetNotifyValue(c *Characteristic, f func(*Characteristic, []byte, error)) error

	// SetIndicateValue sets indications for the value of a specified characteristic.
	SetIndicateValue(c *Characteristic, f func(*Characteristic, []byte, error)) error

	// ReadRSSI retrieves the current RSSI value for the remote peripheral.
	ReadRSSI() int

	// SetMTU sets the mtu for the remote peripheral.
	SetMTU(mtu uint16) error
}

type subscriber struct {
	sub map[uint16]subscribefn
	mu  *sync.Mutex
}

type subscribefn func([]byte, error)

func newSubscriber() *subscriber {
	return &subscriber{
		sub: make(map[uint16]subscribefn),
		mu:  &sync.Mutex{},
	}
}

func (s *subscriber) subscribe(h uint16, f subscribefn) {
	s.mu.Lock()
	s.sub[h] = f
	s.mu.Unlock()
}

func (s *subscriber) unsubscribe(h uint16) {
	s.mu.Lock()
	delete(s.sub, h)
	s.mu.Unlock()
}

func (s *subscriber) fn(h uint16) subscribefn {
	s.mu.Lock()
	defer s.mu.Unlock()
	return s.sub[h]
}

var (
	ErrInvalidLength = errors.New("invalid length")
)
