package http

import (
	"context"
	"errors"
	"net/http"

	"golang.org/x/net/http2"
	"golang.org/x/net/http2/h2c"

	"gfx.cafe/open/jrpc/pkg/jsonrpc"
	"gfx.cafe/open/jrpc/pkg/server"
)

func JrpcToHttp(h jsonrpc.Handler) http.Handler {
	return HttpHandler(h)
}

func HttpHandler(h jsonrpc.Handler) http.Handler {
	return h2c.NewHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		if h == nil {
			http.Error(w, "no server set", http.StatusInternalServerError)
			return
		}
		c, err := NewCodec(w, r)
		if err != nil {
			return
		}
		w.Header().Set("content-type", contentType)
		err = server.ServeCodec(r.Context(), c, h)
		if err != nil && !errors.Is(err, context.Canceled) {
			//  slog.Error("codec err", "err", err)
			http.Error(w, "Internal Error", http.StatusInternalServerError)
			return
		}
		<-c.Closed()
	}), &http2.Server{})
}