package gitter

import (
	"encoding/json"
	"fmt"

	"github.com/mrexodia/wray"
)

type Faye struct {
	endpoint string
	Event    chan Event
	client   *wray.FayeClient
	gitter   *Gitter
}

func (gitter *Gitter) Faye(roomID string) *Faye {
	wray.RegisterTransports([]wray.Transport{
		&wray.HttpTransport{
			SendHook: func(data map[string]interface{}) {
				if channel, ok := data["channel"]; ok && channel == "/meta/handshake" {
					data["ext"] = map[string]interface{}{"token": gitter.config.token}
				}
			},
		},
	})
	return &Faye{
		endpoint: "/api/v1/rooms/" + roomID + "/chatMessages",
		Event:    make(chan Event),
		client:   wray.NewFayeClient(fayeBaseURL),
		gitter:   gitter,
	}
}

func (faye *Faye) Listen() {
	defer faye.destroy()

	faye.client.Subscribe(faye.endpoint, false, func(message wray.Message) {
		dataBytes, err := json.Marshal(message.Data["model"])
		if err != nil {
			fmt.Printf("JSON Marshal error: %v\n", err)
			return
		}
		var gitterMessage Message
		err = json.Unmarshal(dataBytes, &gitterMessage)
		if err != nil {
			fmt.Printf("JSON Unmarshal error: %v\n", err)
			return
		}
		faye.Event <- Event{
			Data: &MessageReceived{
				Message: gitterMessage,
			},
		}
	})

	//TODO: this might be needed in the future
	/*go func() {
		for {
			faye.client.Publish("/api/v1/ping2", map[string]interface{}{"reason": "ping"})
			time.Sleep(60 * time.Second)
		}
	}()*/

	faye.client.Listen()
}

func (faye *Faye) destroy() {
	close(faye.Event)
}