package db

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
	"leaf/log"
	"os"
	"os/signal"
	"testing"
	"time"
)

func TestRedis(t *testing.T) {
	//_, err := NewRedisClient(RedisConfig{Host: "192.168.12.166", Port: 49154, Auth: "", Username: "", DB: 1})
	//if err != nil {
	//	t.Error(err)
	//}

	// 1. 初始化Redis客户端 [2]()[5]()
	// 创建连接池，配置最大连接数、空闲超时等参数
	client := NewRedisClient("192.168.12.166:49154", "", 1)
	defer client.pool.Close() // 确保程序退出时关闭连接池

	// 2. 全局键操作 [1]()
	// 检查键是否存在
	exists, _ := client.Exists("test_key")
	fmt.Printf("Key exists: %v\n", exists)

	// 设置键过期时间（秒）
	_ = client.Expire("test_key", 60)

	// 删除键（可批量删除）
	delCount, _ := client.Del("key1", "key2", "key3")
	fmt.Printf("Deleted keys count: %d\n", delCount)

	// 3. 字符串操作 [1]()
	// 设置键值
	_ = client.Set("username", "Alice")

	// 自增计数器
	counter, _ := client.Incr("visit_count")
	fmt.Printf("Visit count: %d\n", counter)

	// 批量获取键值
	values, _ := client.MGet("key1", "key2")
	fmt.Println("MGet results:", values)

	// 4. 哈希操作 [1]()
	// 设置哈希字段
	_ = client.HSet("user:1001", "name", "Bob")
	_ = client.HSet("user:1001", "age", 30)

	// 获取所有哈希字段
	userData, _ := client.HGetAll("user:1001")
	fmt.Println("User data:", userData)

	// 5. 列表操作 [1]()
	// 向左推入元素
	listLen, _ := client.LPush("messages", "hello", "world")
	fmt.Printf("List length after LPush: %d\n", listLen)

	// 获取列表范围元素
	listItems, _ := client.LRange("messages", 0, -1)
	fmt.Println("List items:", listItems)

	// 6. 集合操作 [1]()
	// 添加集合成员
	client.SAdd("tags", "golang", "redis", "database")
	tags, _ := client.SInter("tags")
	fmt.Printf("Common tags: %v\n", tags)

	// 求集合交集
	commonTags, _ := client.SInter("tags", "popular_tags")
	fmt.Println("Common tags:", commonTags)

	// 7. 有序集合操作 [1]()
	// 添加带分数成员
	client.ZAdd("leaderboard", 100, "Player1")
	client.ZAdd("leaderboard", 85, "Player2")
	// 按分数降序获取成员
	topPlayers, _ := client.ZRevRange("leaderboard", 0, 1)
	fmt.Printf("Top players: %v\n", topPlayers)

	// 8. 流水线操作 [2]()
	// 批量执行命令（减少网络往返）
	cmds := []struct {
		Cmd  string
		Args []interface{}
	}{
		{"INCR", []interface{}{"pipeline_counter"}},
		{"RPUSH", []interface{}{"pipeline_list", "item1"}},
		{"HSET", []interface{}{"pipeline_hash", "field", "value"}},
	}
	results, _ := client.Pipeline(cmds)
	fmt.Println("Pipeline results:", results)

	// 9. 服务器信息查询 [5]()
	// 获取数据库键总数
	dbSize, _ := redis.Int(client.exec("DBSIZE"))
	fmt.Printf("Database size: %d keys\n", dbSize)

	// 10. 高级功能：发布订阅（需另启goroutine） [2]()
	// 启动一个goroutine来订阅
	go func() {
		err := client.Subscribe([]string{"test_channel"}, func(channel, msg string) {
			fmt.Printf("Received message on channel %s: %s\n", channel, msg)
		})
		if err != nil {
			fmt.Println("Subscribe error:", err)
		}
	}()

	// 为了演示，这里等待一段时间以确保订阅已经建立
	time.Sleep(1 * time.Second)

	// 发布一条消息（在实际使用中，可能由另一个客户端发布）
	client.exec("PUBLISH", "test_channel", "Hello, World!")

	// 等待一段时间以便接收消息
	time.Sleep(1 * time.Second)

	// close
	c := make(chan os.Signal, 1)
	signal.Notify(c, os.Interrupt, os.Kill)
	sig := <-c
	log.Release("redis_test closing down (signal: %v)", sig)
}
