package subscription

import (
	"github.com/thesyncim/faye/message"
)

type Unsubscriber func(subscription *Subscription) error

type Publisher func(msg message.Data) (string, error)

type Subscription struct {
	id      string //request Subscription ID
	channel string
	ok      chan error //used by
	unsub   Unsubscriber
	pub     Publisher
	msgCh   chan *message.Message
}

func NewSubscription(id string, chanel string, unsub Unsubscriber, pub Publisher, msgCh chan *message.Message, ok chan error) *Subscription {
	return &Subscription{
		pub:     pub,
		ok:      ok,
		id:      id,
		channel: chanel,
		unsub:   unsub,
		msgCh:   msgCh,
	}
}

func (s *Subscription) OnMessage(onMessage func(msg message.Data)) error {
	var inMsg *message.Message
	for inMsg = range s.msgCh {
		if inMsg.GetError() != nil {
			return inMsg.GetError()
		}
		onMessage(inMsg.Data)
	}
	return nil
}

func (s *Subscription) ID() string {
	return s.id
}

func (s *Subscription) MsgChannel() chan *message.Message {
	return s.msgCh
}

func (s *Subscription) Channel() string {
	return s.channel
}

//todo remove
func (s *Subscription) SubscriptionResult() chan error {
	return s.ok
}

func (s *Subscription) Unsubscribe() error {
	return s.unsub(s)
}

func (s *Subscription) Publish(msg message.Data) (string, error) {
	return s.pub(msg)
}