package barertc

import (
	"net/http"
	"sync"
)

// Server is the primary back-end server struct for BareRTC, see main.go
type Server struct {
	// HTTP router.
	mux *http.ServeMux

	// Max number of messages we'll buffer for a subscriber
	subscriberMessageBuffer int

	// Connected WebSocket subscribers.
	subscribersMu sync.RWMutex
	subscribers   map[*Subscriber]struct{}
}

// NewServer initializes the Server.
func NewServer() *Server {
	return &Server{
		subscriberMessageBuffer: 16,
		subscribers:             make(map[*Subscriber]struct{}),
	}
}

// Setup the server: configure HTTP routes, etc.
func (s *Server) Setup() error {
	var mux = http.NewServeMux()

	mux.Handle("/", IndexPage())
	mux.Handle("/about", AboutPage())
	mux.Handle("/ws", s.WebSocket())
	mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("web/static"))))

	s.mux = mux

	return nil
}

// ListenAndServe starts the web server.
func (s *Server) ListenAndServe(address string) error {
	return http.ListenAndServe(address, s.mux)
}
