package main

import (
	"fmt"
	"log"
	"net/http"
)

func mid(i int) middleware {
	return func(next http.Handler) http.Handler {
		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			fmt.Println("mid", i, "start")
			next.ServeHTTP(w, r)
			fmt.Println("mid", i, "done")
		})
	}
}

func someHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Println("[the handler ran here]")
	fmt.Fprintln(w, "Hello world of", r.URL.Path)
}

func main() {
	r := NewRouter(mid(0))

	r.Group(func(r *router) {
		r.Use(mid(1), mid(2))

		r.Get("/foo", someHandler)
	})

	r.Group(func(r *router) {
		r.Use(mid(3))

		r.Get("/bar", someHandler, mid(4))
		r.Get("/baz", someHandler, mid(5))
	})

	r.Post("/foobar", someHandler)

	log.Fatal(http.ListenAndServe(":3000", r))
}