// Package main shows how to match "/xxx.json" in MVC handler.
package main

/*
There is no MVC naming pattern for such these things,you can imagine the limitations of that.
Instead you can use the `BeforeActivation` on your controller to add more advanced routing features
(https://github.com/kataras/iris/tree/master/_examples/routing).

You can also create your own macro,
i.e: /{file:json} or macro function of a specific parameter type i.e: (/{file:string json()}).
Read the routing examples and you will gain a deeper view, there are all covered.
*/

import (
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/mvc"
)

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

	mvcApp := mvc.New(app.Party("/module"))
	mvcApp.Handle(new(myController))

	// http://localhost:8080/module/xxx.json (OK)
	// http://localhost:8080/module/xxx.xml  (Not Found)
	app.Listen(":8080")
}

type myController struct{}

func (m *myController) BeforeActivation(b mvc.BeforeActivation) {
	// b.Dependencies().Register
	// b.Router().Use/UseGlobal/Done // and any standard API call you already know

	// 1-> Method
	// 2-> Path
	// 3-> The controller's function name to be parsed as handler
	// 4-> Any handlers that should run before the HandleJSON

	// "^[a-zA-Z0-9_.-]+.json$)" to validate file-name pattern and json
	// or just:  ".json$" to validate suffix.

	b.Handle("GET", "/{file:string regexp(^[a-zA-Z0-9_.-]+.json$))}", "HandleJSON" /*optionalMiddleware*/)
}

func (m *myController) HandleJSON(file string) string {
	return "custom serving of json: " + file
}