package server

import (
	"fmt"
	"net/http"
	"strings"

	// "compress/gzip"
	"git.pyer.club/kingecg/gohttpd/model"
	"git.pyer.club/kingecg/gologger"
	"github.com/nanmu42/gzip"
)

type Directive func(args ...string) Middleware

var Add_Header Directive = func(args ...string) Middleware {
	return func(w http.ResponseWriter, r *http.Request, next http.Handler) {
		l := gologger.GetLogger("Directive")
		p := args[1:]
		params := strings.Join(p, " ")
		l.Debug(fmt.Sprintf("Add-Header %s:%s", args[0], params))
		w.Header().Add(args[0], args[1])
		next.ServeHTTP(w, r)
	}
}

var Set_Header Directive = func(args ...string) Middleware {
	return func(w http.ResponseWriter, r *http.Request, next http.Handler) {
		l := gologger.GetLogger("Directive")
		p := args[1:]
		params := strings.Join(p, " ")
		l.Debug(fmt.Sprintf("Set-Header %s:%s", args[0], params))
		w.Header().Set(args[0], params)
		next.ServeHTTP(w, r)
	}
}

var Gzip_Response Directive = func(args ...string) Middleware {
	var gzipHandler http.Handler = nil
	return func(w http.ResponseWriter, r *http.Request, next http.Handler) {
		l := gologger.GetLogger("Directive")
		l.Debug("Gzip-Response")
		if gzipHandler == nil {
			gzipHandler = gzip.DefaultHandler().WrapHandler(next)
		}
		gzipHandler.ServeHTTP(w, r)
	}
}
var DRecordAccess Directive = func(args ...string) Middleware {
	return func(w http.ResponseWriter, r *http.Request, next http.Handler) {
		l := gologger.GetLogger("Directive")
		l.Debug("Record-Access")
		model.Incr(r.URL.Host)
		next.ServeHTTP(w, r)
	}
}
var DirectiveMap = map[string]Directive{
	"Set-Header":    Set_Header,
	"Add-Header":    Add_Header,
	"Gzip_Response": Gzip_Response,
	"Record-Access": DRecordAccess,
}
