package toolsdemo

import (
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/go-chi/chi/v5"
	"github.com/go-playground/validator/v10"
)

func app() http.Handler {
	validate := validator.New(validator.WithRequiredStructEnabled())
	r := chi.NewRouter()
	r.Use(func(next http.Handler) http.Handler {
		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			w.Header().Set("X-Standard-Middleware", "yes")
			next.ServeHTTP(w, r)
		})
	})
	r.Get("/users/{id}", func(w http.ResponseWriter, r *http.Request) {
		in := struct {
			ID string `validate:"required,number,len=3"`
		}{ID: chi.URLParam(r, "id")}
		if err := validate.Struct(in); err != nil {
			http.Error(w, "id must contain 3 digits", 422)
			return
		}
		w.WriteHeader(204)
	})
	return r
}
func TestStandardHandlerAndValidation(t *testing.T) {
	h := app()
	for _, tc := range []struct {
		path string
		want int
	}{{"/users/123", 204}, {"/users/abc", 422}, {"/users/-12", 422}, {"/users/+12", 422}, {"/users/1.2", 422}, {"/users/12", 422}, {"/missing", 404}} {
		w := httptest.NewRecorder()
		h.ServeHTTP(w, httptest.NewRequest("GET", tc.path, nil))
		if w.Code != tc.want || w.Header().Get("X-Standard-Middleware") != "yes" {
			t.Fatalf("%s status=%d header=%v", tc.path, w.Code, w.Header())
		}
	}
	t.Log("chi is an http.Handler; standard middleware wraps routes; validator rejects invalid path values")
}
