package middleware

import (
	"log"
	"net/http"
)

func RequestLog(logger *log.Logger, format string) Middleware {
	if format == "" {
		format = defaultReqLogFormat
	}
	return func(next http.HandlerFunc) http.HandlerFunc {
		return func(w http.ResponseWriter, r *http.Request) {
			sw := newResponseRecorder(w)
			next(sw, r)
			rep := newReplacer(r, sw)
			logger.Println(rep.replace(format))
		}
	}
}

// TODO.
func ErrorLog(logger *log.Logger, format string) Middleware {
	if format == "" {
		format = defaultErrLogFormat
	}
	return func(next http.HandlerFunc) http.HandlerFunc {
		return func(w http.ResponseWriter, r *http.Request) {
			sw := newResponseRecorder(w)
			next(sw, r)
			// This is still TODO -- we need to define what constitutes an error to be logged
			//logger.Println("TODO")
		}
	}
}

const (
	commonLogFormat     = `{remote} ` + emptyStringReplacer + ` [{time}] "{method} {uri} {proto}" {status} {size}`
	combinedLogFormat   = commonLogFormat + ` "{>Referer}" "{>User-Agent}"`
	defaultReqLogFormat = commonLogFormat
	defaultErrLogFormat = "[TODO]"
)