package main

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

type StatusRecorder struct {
	http.ResponseWriter
	Status int
}

func (r *StatusRecorder) WriteHeader(status int) {
	r.Status = status
	r.ResponseWriter.WriteHeader(status)
}

func Logger(next http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		start := time.Now()

		recorder := &StatusRecorder{
			ResponseWriter: w,
			Status:         http.StatusOK,
		}

		next(recorder, r)

		duration := time.Since(start)

		icon := "✅"
		if recorder.Status >= 400 {
			icon = "⚠️"
		}
		if recorder.Status >= 500 {
			icon = "🔥"
		}

		log.Printf("%s [%s] %s | %d | %v | %s",
			icon,
			r.Method,
			r.URL.Path,
			recorder.Status,
			duration,
			r.RemoteAddr,
		)
	}
}
