package gzip

import (
	"compress/gzip"
	"net/http"
	"strings"
)

type gzipResponseWriter struct {
	Writer         *gzip.Writer
	ResponseWriter http.ResponseWriter
}

func (gz gzipResponseWriter) Header() http.Header {
	return gz.ResponseWriter.Header()
}

func (gz gzipResponseWriter) Write(b []byte) (int, error) {
	return gz.Writer.Write(b)
}

func (gz gzipResponseWriter) WriteHeader(statusCode int) {
	gz.ResponseWriter.WriteHeader(statusCode)
}

func SetupCompression(handler http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
			handler(w, r)
			return
		}
		w.Header().Set("Content-Encoding", "gzip")
		gz := gzip.NewWriter(w)
		defer gz.Close()
		handler(gzipResponseWriter{Writer: gz, ResponseWriter: w}, r)
	}
}