package http_middleware

import (
	"bytes"
	"github.com/gin-gonic/gin"
	"io/ioutil"
	"net/http"
	"os"
	"path/filepath"
)

func Favicon(path string) gin.HandlerFunc {
	path = filepath.FromSlash(path)
	if len(path) > 0 && !os.IsPathSeparator(path[0]) {
		wd, err := os.Getwd()
		if err != nil {
			panic(err)
		}
		path = filepath.Join(wd, path)
	}

	info, err := os.Stat(path)
	if err != nil || info == nil || info.IsDir() {
		panic("Invalid favicon path: " + path)
	}

	file, err := ioutil.ReadFile(path)
	if err != nil {
		panic(err)
	}

	reader := bytes.NewReader(file)

	return func(ctxt *gin.Context) {
		if ctxt.Request.RequestURI != "/favicon.ico" {
			ctxt.Next()
			return
		}
		if ctxt.Request.Method != "GET" && ctxt.Request.Method != "HEAD" {
			status := http.StatusOK
			if ctxt.Request.Method != "OPTIONS" {
				status = http.StatusMethodNotAllowed
			}
			ctxt.Header("Allow", "GET,HEAD,OPTIONS")
			ctxt.AbortWithStatus(status)
			ctxt.Abort()
			return
		}
		ctxt.Header("Content-Type", "image/x-icon")
		http.ServeContent(ctxt.Writer, ctxt.Request, "favicon.ico", info.ModTime(), reader)
		ctxt.Abort()
	}
}