package middlewares

import (
	"log"
	"net/http"
	"time"
)

type statusResponseWriter struct {
	http.ResponseWriter
	status int
}

func (w *statusResponseWriter) WriteHeader(code int) {
	w.status = code
	if w.status == 0 {
		w.ResponseWriter.WriteHeader(code)
	}
}

func Logger(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		rw := newStatusResponseWriter(w)
		now := time.Now()
		next.ServeHTTP(rw, r)
		since := time.Since(now)
		log.Println(r.Method, r.URL.Path, r.RemoteAddr, rw.status, since)
	})
}

func newStatusResponseWriter(w http.ResponseWriter) *statusResponseWriter {
	return &statusResponseWriter{ResponseWriter: w}
}
