package main

import (
	"encoding/json"
	"flag"
	"fmt"
	"net/http"

	"code.hackerspace.pl/hscloud/go/mirko"
	"github.com/golang/glog"
)

var (
	flagListenPublic string
	flagDomain       string
)

type wellKnownHomeserver struct {
	BaseURL string `json:"base_url"`
}

type wellKnown struct {
	Homeserver wellKnownHomeserver `json:"m.homeserver"`
	Server     string              `json:"m.server"`
}

type server struct {
	domain string
}

func (s *server) register(mux *http.ServeMux) {
	mux.HandleFunc("/.well-known/matrix/server", s.makeHandler(true))
	mux.HandleFunc("/.well-known/matrix/client", s.makeHandler(false))
}

func (s *server) makeHandler(server bool) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		wk := wellKnown{}
		if server {
			wk.Server = fmt.Sprintf("%s:443", s.domain)
		} else {
			wk.Homeserver = wellKnownHomeserver{
				BaseURL: fmt.Sprintf("https://%s", s.domain),
			}
		}
		err := json.NewEncoder(w).Encode(wk)
		if err != nil {
			glog.Errorf("When handling request: %v", err)
		}
	}
}

func main() {
	flag.StringVar(&flagListenPublic, "listen_public", "0.0.0.0:8080", "Address to listen at for well-known traffic")
	flag.StringVar(&flagDomain, "domain", "matrix.hackerspace.pl", "Address to which clients and servers should connect")
	flag.Parse()

	m := mirko.New()
	if err := m.Listen(); err != nil {
		glog.Exitf("Listen(): %v", err)
	}

	mux := http.NewServeMux()
	s := &server{
		domain: flagDomain,
	}
	s.register(mux)

	go func() {
		glog.Infof("Listening on %s...", flagListenPublic)
		if err := http.ListenAndServe(flagListenPublic, mux); err != nil {
			glog.Exitf("listen failed: %v", err)
		}
	}()

	if err := m.Serve(); err != nil {
		glog.Exitf("Serve(): %v", err)
	}

	<-m.Done()
}
