package http

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

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

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

func HttpHandler(s *server.Server) http.Handler {
	return h2c.NewHandler(&Server{Server: s}, &http2.Server{})
}

type Server struct {
	Server *server.Server
}

var codecPool = sync.Pool{
	New: func() any {
		return &Codec{}
	},
}

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