package main

import (
	"context"
	"go.etcd.io/etcd/client/v3"
	"time"
)

//func main() {
//	var (
//		client *clientv3.Client
//		config clientv3.Config
//		err    error
//	)
//
//	config = clientv3.Config{
//		// 这里的 Endpoints 是一个字符串数组切片，支持配合多个节点
//		Endpoints: []string{"106.54.33.152:2379"},
//		// DialTimeout 连接超时设置
//		DialTimeout: time.Duration(5) * time.Millisecond,
//	}
//	if client, err = clientv3.New(config); err != nil {
//		return
//	}
//	kv := client.KV
//	ctx := context.Background()
//	c := map[string]interface{}{
//		"id":   3,
//		"name": "demo",
//		"age":  30,
//	}
//	data, _ := json.Marshal(c)
//
//	var s = "/hstack/nodes/"
//	var nodes = []string{
//		"1.1.1.1",
//		"2.2.2.2",
//		"3.3.3.3",
//	}
//
//	for _, node := range nodes {
//		newnodeKey := fmt.Sprintf("%s%s", s, node)
//		kv.Put(ctx, newnodeKey, string(data))
//	}
//
//	get, err := kv.Get(ctx, s, clientv3.WithPrefix())
//	if err != nil {
//		return
//	}
//
//	for _, kv := range get.Kvs {
//		after, _ := strings.CutPrefix(string(kv.Key), s)
//		fmt.Printf("%s : %s\n", after, string(kv.Value))
//	}
//}
//

func main() {
	cli, err := clientv3.New(clientv3.Config{
		Endpoints:   []string{"106.54.33.152:2379"},
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		panic(err)
	}
	defer cli.Close()
	_, _ = cli.Delete(context.Background(), "/hstack/server/nodes", clientv3.WithPrefix())

}

//// 保持租约
//func keepAlive(cli *clientv3.Client, leaseID clientv3.LeaseID) {
//	alive, err := cli.KeepAlive(ctx, leaseID)
//	if err != nil {
//		fmt.Printf("Failed to keep alive: %v\n", err)
//		return
//	}
//	//监听KeepAlive的响应
//	go func() {
//		for {
//			ka := <-alive
//			if ka == nil {
//				log.Println("租约已失效或KeepAlive通道已关闭")
//				return
//			}
//			log.Printf("续租成功: %v\n", ka)
//		}
//	}()
//}
//
//// 新增键值对
//func put(cli *clientv3.Client, key, value string) error {
//	_, err := cli.Put(ctx, key, value)
//	if err != nil {
//		log.Fatal(err)
//		return err
//	}
//	return nil
//}
//
//// 新增键值对，带有过期时间
//func putWithTTL(cli *clientv3.Client, key, value string, ttl int64) (int64, error) {
//	leaseResp, err := cli.Grant(ctx, ttl)
//	if err != nil {
//		log.Fatal(err)
//		return 0, err
//	}
//	_, err = cli.Put(ctx, key, value, clientv3.WithLease(leaseResp.ID))
//	if err != nil {
//		log.Fatal(err)
//		return 0, err
//	}
//	return int64(leaseResp.ID), nil
//}
//
//// 监听键值变化
//func watch(cli *clientv3.Client, key string) {
//
//	watchCh := cli.Watch(ctx, key, clientv3.WithPrefix())
//
//	go func() {
//
//		for event := range watchCh {
//			if event.Err() != nil {
//				fmt.Printf("Failed to watch: %v\n", event.Err())
//				return
//			}
//			if len(event.Events) == 0 {
//				fmt.Println("No events")
//				return
//			}
//			fmt.Printf("Event: %s %q : %q\n", event.Events[0].Type, event.Events[0].Kv.Key, event.Events[0].Kv.Value)
//			if event.Events[0].Type == clientv3.EventTypeDelete {
//				fmt.Println("删除")
//				fmt.Printf(" %v\n", event.Events[0])
//			}
//		}
//	}()
//}
//
//// 获取键的值
//func get(cli *clientv3.Client, key string) (string, error) {
//	resp, err := cli.Get(ctx, key)
//	if err != nil {
//		log.Fatal(err)
//		return "", err
//	}
//	if resp.Count == 0 {
//		return "", fmt.Errorf("key %s not found", key)
//	}
//	return string(resp.Kvs[0].Value), nil
//}
//
//// 获取当前前缀下所有的键并截取前缀
//func getAndCutPrefix(cli *clientv3.Client, prefix string) ([]string, error) {
//	resp, err := cli.Get(ctx, prefix, clientv3.WithPrefix())
//	if err != nil {
//		log.Fatal(err)
//		return nil, err
//	}
//	keys := make([]string, 0)
//	for _, kv := range resp.Kvs {
//		keys = append(keys, strings.TrimPrefix(string(kv.Key), prefix))
//	}
//	return keys, nil
//}
