package sprint_clientgrpc

import (
	context "context"

	jwt "github.com/go-kit/kit/auth/jwt"
	"github.com/go-kit/kit/endpoint"
	"github.com/go-kit/kit/log"
	grpctransport "github.com/go-kit/kit/transport/grpc"
	"google.golang.org/grpc"

	endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/endpoints"
	pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
)

func New(conn *grpc.ClientConn, logger log.Logger) pb.SprintServiceServer {

	var addsprintEndpoint endpoint.Endpoint
	{
		addsprintEndpoint = grpctransport.NewClient(
			conn,
			"sprint.SprintService",
			"AddSprint",
			EncodeAddSprintRequest,
			DecodeAddSprintResponse,
			pb.AddSprintResponse{},
			append([]grpctransport.ClientOption{}, grpctransport.ClientBefore(jwt.FromGRPCContext()))...,
		).Endpoint()
	}

	var closesprintEndpoint endpoint.Endpoint
	{
		closesprintEndpoint = grpctransport.NewClient(
			conn,
			"sprint.SprintService",
			"CloseSprint",
			EncodeCloseSprintRequest,
			DecodeCloseSprintResponse,
			pb.CloseSprintResponse{},
			append([]grpctransport.ClientOption{}, grpctransport.ClientBefore(jwt.FromGRPCContext()))...,
		).Endpoint()
	}

	var getsprintEndpoint endpoint.Endpoint
	{
		getsprintEndpoint = grpctransport.NewClient(
			conn,
			"sprint.SprintService",
			"GetSprint",
			EncodeGetSprintRequest,
			DecodeGetSprintResponse,
			pb.GetSprintResponse{},
			append([]grpctransport.ClientOption{}, grpctransport.ClientBefore(jwt.FromGRPCContext()))...,
		).Endpoint()
	}

	return &endpoints.Endpoints{

		AddSprintEndpoint: addsprintEndpoint,

		CloseSprintEndpoint: closesprintEndpoint,

		GetSprintEndpoint: getsprintEndpoint,
	}
}

func EncodeAddSprintRequest(_ context.Context, request interface{}) (interface{}, error) {
	req := request.(*pb.AddSprintRequest)
	return req, nil
}

func DecodeAddSprintResponse(_ context.Context, grpcResponse interface{}) (interface{}, error) {
	response := grpcResponse.(*pb.AddSprintResponse)
	return response, nil
}

func EncodeCloseSprintRequest(_ context.Context, request interface{}) (interface{}, error) {
	req := request.(*pb.CloseSprintRequest)
	return req, nil
}

func DecodeCloseSprintResponse(_ context.Context, grpcResponse interface{}) (interface{}, error) {
	response := grpcResponse.(*pb.CloseSprintResponse)
	return response, nil
}

func EncodeGetSprintRequest(_ context.Context, request interface{}) (interface{}, error) {
	req := request.(*pb.GetSprintRequest)
	return req, nil
}

func DecodeGetSprintResponse(_ context.Context, grpcResponse interface{}) (interface{}, error) {
	response := grpcResponse.(*pb.GetSprintResponse)
	return response, nil
}
