package databag

import (
	"github.com/gorilla/websocket"
  "encoding/json"
	"net/http"
  "errors"
)

var relayUpgrader = websocket.Upgrader{}

//Status handler for websocket connection
func Signal(w http.ResponseWriter, r *http.Request) {

  relayUpgrader.CheckOrigin = func(r *http.Request) bool { return true }

	// accept websocket connection
	conn, err := relayUpgrader.Upgrade(w, r, nil)
	if err != nil {
		ErrMsg(err)
		return
	}
	defer conn.Close()
	conn.SetReadLimit(APPBodyLimit)

	// receive announce
	t, m, res := conn.ReadMessage()
	if res != nil {
		ErrMsg(res)
		return
	}
	if t != websocket.TextMessage {
		ErrMsg(errors.New("invalid websocket message type"))
		return
	}
	var a Announce
	if err := json.Unmarshal(m, &a); err != nil {
		ErrMsg(err)
		return
	}

  // bind connection to bridge
  bridgeRelay.SetConnection(conn, a.AppToken);

  for true {
    t, m, res := conn.ReadMessage()
    if res != nil {
      ErrMsg(res)
      break
    }
    if t != websocket.TextMessage {
      ErrMsg(errors.New("invalid websocket message type"))
      break
    }
    bridgeRelay.RelayMessage(conn, m);
	}

  // release connection from bridge
  bridgeRelay.ClearConnection(conn);
}