package client

import (
	"github.com/spf13/cobra"

	"github.com/cosmos/cosmos-sdk/client"
	legacyclient "github.com/cosmos/cosmos-sdk/x/gov/client"

	"github.com/atomone-hub/govgen/x/gov/client/rest"
)

// function to create the rest handler
type RESTHandlerFn func(client.Context) rest.ProposalRESTHandler

// function to create the cli handler
type CLIHandlerFn func() *cobra.Command

// The combined type for a proposal handler for both cli and rest
type ProposalHandler struct {
	CLIHandler  CLIHandlerFn
	RESTHandler RESTHandlerFn
}

// NewProposalHandler creates a new ProposalHandler object
func NewProposalHandler(cliHandler CLIHandlerFn, restHandler RESTHandlerFn) ProposalHandler {
	return ProposalHandler{
		CLIHandler:  cliHandler,
		RESTHandler: restHandler,
	}
}

func WrapPropposalRESTHandler(h legacyclient.RESTHandlerFn) RESTHandlerFn {
	return func(ctx client.Context) rest.ProposalRESTHandler {
		handler := h(ctx)
		return rest.ProposalRESTHandler{
			SubRoute: handler.SubRoute,
			Handler:  handler.Handler,
		}
	}
}
