package user

import (
	"context"
	"errors"
	"github.com/go-kit/kit/transport/grpc"
	"github.com/longjoy/micro-go-course/section18/pb"
)

var (
	ErrorBadRequest = errors.New("invalid request parameter")
)

type grpcServer struct {
	checkPassword grpc.Handler
}

func (s *grpcServer) CheckPassword(ctx context.Context, r *pb.LoginRequest) (*pb.LoginResponse, error) {
	_, resp, err := s.checkPassword.ServeGRPC(ctx, r)
	if err != nil {
		return nil, err
	}
	return resp.(*pb.LoginResponse), nil
}

func NewUserServer(ctx context.Context, endpoints Endpoints) pb.UserServiceServer {
	return &grpcServer{
		checkPassword: grpc.NewServer(
			endpoints.UserEndpoint,
			DecodeLoginRequest,
			EncodeLoginResponse,
		),
	}
}

func DecodeLoginRequest(ctx context.Context, r interface{}) (interface{}, error) {
	req := r.(*pb.LoginRequest)
	return LoginForm{
		Username: req.Username,
		Password: req.Password,
	}, nil
}

func EncodeLoginResponse(_ context.Context, r interface{}) (interface{}, error) {
	resp := r.(LoginResult)
	retStr := "fail"
	if resp.Ret {
		retStr = "success"
	}
	errStr := ""
	if resp.Err != nil {
		errStr = resp.Err.Error()
	}
	return &pb.LoginResponse{
		Ret: retStr,
		Err: errStr,
	}, nil
}