package main

import (
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/middleware/logger"
)

func main() {
	app := iris.New()

	customLogger := logger.New(logger.Config{
		// Status displays status code
		Status: true,
		// IP displays request's remote address
		IP: true,
		// Method displays the http method
		Method: true,
		// Path displays the request path
		Path: true,
		// Query appends the url query to the Path.
		Query: true,
		// Shows information about the executed route.
		TraceRoute: true,

		// if !empty then its contents derives from `ctx.Values().Get("logger_message")
		// will be added to the logs.
		MessageContextKeys: []string{"logger_message"},

		// if !empty then its contents derives from `ctx.GetHeader("User-Agent")
		MessageHeaderKeys: []string{"User-Agent"},
	})

	// Runs first on every request: parties & subdomains, route match or not and all http errors.
	app.UseRouter(customLogger)

	// Runs first on each matched route of this Party and its children on every request.
	app.Use(routesMiddleware)

	app.Get("/", indexMiddleware, index)
	app.Get("/list", listMiddleware, list)

	app.Get("/1", hello)
	app.Get("/2", hello)

	app.OnAnyErrorCode(customLogger, func(ctx iris.Context) {
		// this should be added to the logs, at the end because of the `logger.Config#MessageContextKey`
		ctx.Values().Set("logger_message",
			"a dynamic message passed to the logs")
		ctx.Writef("My Custom error page")
	})

	// http://localhost:8080
	// http://localhost:8080/list
	// http://localhost:8080/list?stop=true
	// http://localhost:8080/1
	// http://localhost:8080/2
	// http://lcoalhost:8080/notfoundhere
	// see the output on the console.
	app.Listen(":8080")
}

func routesMiddleware(ctx iris.Context) {
	ctx.Writef("Executing Route: %s\n", ctx.GetCurrentRoute().MainHandlerName())
	ctx.Next()
}

func indexMiddleware(ctx iris.Context) {
	ctx.WriteString("Index Middleware\n")
	ctx.Next()
}

func index(ctx iris.Context) {
	ctx.WriteString("Index Handler")
}

func listMiddleware(ctx iris.Context) {
	ctx.WriteString("List Middleware\n")

	if simulateStop, _ := ctx.URLParamBool("stop"); !simulateStop {
		ctx.Next()
	}
}

func list(ctx iris.Context) {
	ctx.WriteString("List Handler")
}

func hello(ctx iris.Context) {
	ctx.Writef("Hello from %s", ctx.Path())
}