package gd_service

import (
	"context"
	"fmt"
	"runtime"
	"time"

	"github.com/smallnest/rpcx/client"
	"github.com/smallnest/rpcx/protocol"
	"github.com/smallnest/rpcx/share"
)

type GdServiceXClient struct {
	xcli client.XClient
}

func (a *GdServiceXClient) Init(etcdAddrs []string, basePath, servicePath string) {
	opt := client.Option{
		Retries:        1,
		RPCPath:        share.DefaultRPCPath,
		ConnectTimeout: 10 * time.Second,
		SerializeType:  protocol.JSON,
		CompressType:   protocol.None,
		BackupLatency:  10 * time.Millisecond,
	}

	if runtime.GOOS == "windows" {
		d := client.NewEtcdDiscovery(fmt.Sprintf("/%s", basePath), servicePath, etcdAddrs, nil)
		a.xcli = client.NewXClient(servicePath, client.Failtry, client.RandomSelect, d, opt)
	} else {
		d := client.NewEtcdDiscovery(basePath, servicePath, etcdAddrs, nil)
		a.xcli = client.NewXClient(servicePath, client.Failtry, client.RandomSelect, d, opt)
	}
}

func (a *GdServiceXClient) InitForK8s(servicePath string, k8sServiceName string, k8sServicePort string) {
	opt := client.Option{
		Retries:        1,
		RPCPath:        share.DefaultRPCPath,
		ConnectTimeout: 10 * time.Second,
		SerializeType:  protocol.JSON,
		CompressType:   protocol.None,
		BackupLatency:  10 * time.Millisecond,
	}
	sd := client.NewPeer2PeerDiscovery(fmt.Sprintf("tcp@%s:%s", k8sServiceName, k8sServicePort), "")
	a.xcli = client.NewXClient(servicePath, client.Failtry, client.RandomSelect, sd, opt)
}

func (a *GdServiceXClient) ServiceManagementOrderList(ctx context.Context, req *ServiceManagementOrderListReq) (reply ServiceManagementOrderListReply, err error) {
	err = a.xcli.Call(ctx, "ServiceManagementOrderList", req, &reply)
	return
}
