package srv

import (
	"net/http"

	"git.clearsky.net.au/cody/gex.git/utils"
)

var rtr *http.ServeMux
var permissions = make(map[string][]string)

/*
Our Special HandleFunc
*/
func Route(pattern string, roles []string, handler func(req *Req, res *Res)) {
	permissions[pattern] = roles

	realHandler := func(w http.ResponseWriter, r *http.Request) {

		var req Req
		var res Res
		var sess Sess

		req.Construct(r)
		res.Construct(w, r)
		sess.Construct(&req, &res)
		req.Sess = sess
		req.Sess.Save()

		// Route Access Check
		proceed := false
		pattern := req.Pattern
		for _, val := range permissions[pattern] {
			if sess.HasRole(val) {
				proceed = true
				break
			}
		}

		if !proceed {
			res.Redirect("/403?referrer=" + req.Path)
			return
		}

		// run middleware on request
		for _, fun := range middleware {
			err := fun(&req, &res)
			if err != nil {
				utils.Err(err)
				return
			}
		}

		handler(&req, &res)

	}

	rtr.HandleFunc(pattern, realHandler)
}

func InitRouter() {
	rtr = http.NewServeMux()

	// Public Files
	fs := http.FileServer(http.Dir("app/pub"))
	rtr.Handle("GET /app/pub/", http.StripPrefix("/app/pub/", fs))
}