package middleware

import (
	"context"
	"fmt"
	"github.com/UpmeshLTD/urus-aio/paid-order/log"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"

	"github.com/go-kit/kit/endpoint"
)

// NewPanicRecoveryMiddleware returns a new middleware that allows the service to recover from panics.
//
// It should be the first middleware in the chain to ensure all endpoint panics are captured before
// returning to other endpoints.
func NewPanicRecoveryMiddleware(logger log.Logger) endpoint.Middleware {
	return func(next endpoint.Endpoint) endpoint.Endpoint {
		return func(ctx context.Context, request interface{}) (response interface{}, err error) {
			defer func() {
				if r := recover(); r != nil {
					logger.Errorw("recovered from panic",
						"data", fmt.Sprintf("%v", r))

					response = nil
					err = status.Errorf(codes.Internal, "internal server error 💀: %v", r)
				}
			}()

			return next(ctx, request)
		}
	}
}