package svc

import (
	"context"
	"gitea.youtukeji.com.cn/youtu/youtu_grpc/app/auth_service/authservice"
	"gitea.youtukeji.com.cn/youtu/youtu_grpc/pkg/config"
	"github.com/spf13/viper"
	"github.com/zeromicro/go-zero/core/conf"
	"github.com/zeromicro/go-zero/core/discov"
	"github.com/zeromicro/go-zero/zrpc"
	clientv3 "go.etcd.io/etcd/client/v3"
	"strings"
)

type ServiceContext struct {
	Config            config.Config
	AuthServiceClient authservice.AuthService
	etcdCli           *clientv3.Client
	EcpmConfig        *EcpmConfigCli
}

func NewServiceContext(c config.Config) *ServiceContext {
	svc := &ServiceContext{
		Config: c,
	}

	//初始化etcd客户端
	svc.initEtcd()

	//初始化auth_service客户端
	svc.initAuthServiceClient()

	return svc
}

const EcpmConfigWatchKey = "/youtu/app/ecpm/config/"

func (svc *ServiceContext) initEtcd() {

	svc.EcpmConfig = NewEcpmConfig()

	//初始化etcd客户端
	cli, err := clientv3.NewFromURL(viper.GetString(config.EtcdAddrKey))
	if err != nil {
		panic(err)
	}

	ch := make(chan config.WatchKV)
	go config.EtcdGetOneAndWatch(context.Background(), cli, EcpmConfigWatchKey, ch)

	for res := range ch {
		svc.EcpmConfig.SetAllByJson(strings.TrimPrefix(res.Key, EcpmConfigWatchKey), res.Value)
	}

	svc.etcdCli = cli
}

// initAuthServiceClient inits the AuthServiceClient.
func (svc *ServiceContext) initAuthServiceClient() {
	clientConf := zrpc.RpcClientConf{}
	err := conf.FillDefault(&clientConf) // 填充默认值,比如 trace 透传等,参考服务配置说明
	if err != nil {
		panic(err)
	}
	clientConf.Token = "auth_service.rpc.key"
	clientConf.App = "auth_service.rpc"
	clientConf.Etcd = discov.EtcdConf{ // 通过 etcd 服务发现
		Hosts: []string{viper.GetString(config.EtcdAddrKey)},
		Key:   "auth_service.rpc",
	}

	svc.AuthServiceClient = authservice.NewAuthService(zrpc.MustNewClient(clientConf))
}