package middlewares

import (
	"context"
	"net/http"
)

const (
	backendNameQueryParam = "connector_id"
	backendCtxKeyName     = "backendName"
)

type BackendFromRequestMiddleware struct {
	h http.Handler
}

func (m *BackendFromRequestMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path != "/authorize" {
		m.h.ServeHTTP(w, r)
		return
	}

	if err := r.ParseForm(); err != nil {
		// TODO: handle this better
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	backendName := r.Form.Get(backendNameQueryParam)
	// TODO this should be explicitly handled
	if backendName == "" {
		w.WriteHeader(http.StatusBadRequest)
		w.Write([]byte("no backend id provided"))
		return
	}

	// TODO we should test that this backend actually exists here

	ctx := context.WithValue(r.Context(), backendCtxKeyName, backendName)
	m.h.ServeHTTP(w, r.WithContext(ctx))
}

func WithBackendFromRequestMiddleware(input http.Handler) http.Handler {
	return &BackendFromRequestMiddleware{h: input}
}
