package app

import (
	"regexp"

	"github.com/gofiber/fiber/v2"
	"github.com/gofiber/fiber/v2/middleware/compress"
	"github.com/gofiber/fiber/v2/middleware/etag"
	"github.com/gofiber/fiber/v2/middleware/pprof"
	"github.com/gofiber/fiber/v2/middleware/recover"
	"github.com/sirupsen/logrus"
	"github.com/sujit-baniya/fiber-boilerplate/config"
)

var Http *config.AppConfig

var Version = "v1.0"

func Load(configFile string) {
	Http = &config.AppConfig{ConfigFile: configFile}
	Http.Setup()
	LoadBuiltInMiddlewares(Http)
}

func LoadBuiltInMiddlewares(app *config.AppConfig) {
	app.Server.Use(recover.New())
	app.Server.Use(etag.New())
	app.Server.Use(compress.New(compress.Config{
		Level: 1,
	}))
	if app.Server.Debug {
		app.Server.Use(pprof.New())
	}
}



var fetchIpFromString = regexp.MustCompile(`(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})`)
var possibleHeaderes = []string{
	"X-Original-Forwarded-For",
	"X-Forwarded-For",
	"X-Real-Ip",
	"X-Client-Ip",
	"Forwarded-For",
	"Forwarded",
	"Remote-Addr",
	"Client-Ip",
	"CF-Connecting-IP",
}

// determine user ip
func IP(c *fiber.Ctx) string {
	headerValue := []byte{}
	if Http.Server.Config().ProxyHeader == "*" {
		for _, headerName := range possibleHeaderes {
			headerValue = c.Request().Header.Peek(headerName)
			if len(headerValue) > 3 {
				return string(fetchIpFromString.Find(headerValue))
			}
		}
	}
	headerValue = []byte(c.IP())
	if len(headerValue) <= 3 {
		headerValue = []byte("0.0.0.0")
	}

	// find ip address in string
	return string(fetchIpFromString.Find(headerValue))
}

var Logger *logrus.Logger

func InitLogger() {
	Logger = logrus.New()
	Logger.SetFormatter(&logrus.TextFormatter{
		FullTimestamp: true,
	})
	Logger.SetLevel(logrus.InfoLevel)
}
