package main

import (
	"fmt"
	"log"
	"math/rand"
	"os"
	"time"

	"github.com/bxcodec/faker/v3"
	"github.com/mhaya/game/game_cluster/internal/mdb/eventmodels"
	"gorm.io/driver/clickhouse"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

// `insert into assets_event_contents (user_id, user_name, tg_id, x_id, parent_user_id, is_robot, points_rank_seq,
//                                    throw_dice_rank_seq, invite_user_rank_seq, is_success, create_at, operation_type,
//                                    currency, reason, before_balance, amount, after_balance, server_id)
// values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`

func main() {
	dsn := "clickhouse://default:123456@192.168.0.193:9000/default?dial_timeout=10s&read_timeout=20s"

	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer（日志输出的地方，这里是标准输出）
		logger.Config{
			SlowThreshold: time.Second, // 慢 SQL 阈值
			LogLevel:      logger.Info, // 日志级别
			Colorful:      true,        // 彩色打印
		},
	)

	db, err := gorm.Open(clickhouse.Open(dsn), &gorm.Config{
		Logger: newLogger,
	})
	if err != nil {
		panic("failed to connect database")
	}

	datas := make([]*eventmodels.AssetsEventContent, 0, 8)
	count := 100

	names := make([]string, 0, 8)
	for i := 0; i < 10; i++ {
		name := faker.Name()
		names = append(names, name)
	}

	server_id := "m-web-admin-1"
	for i := 0; i < count; i++ {
		index := rand.Intn(len(names))
		user_id := names[index]
		user_name := names[index]
		tg_id := faker.Name()
		x_id := faker.Name()
		parent_user_id := names[index]
		is_robot := false
		points_rank_seq := faker.RandomUnixTime()
		throw_dice_rank_seq := faker.RandomUnixTime()
		invite_user_rank_seq := faker.RandomUnixTime()
		is_success := func() bool {
			return rand.Intn(2) == 1
		}
		create_at := faker.RandomUnixTime()
		operation_type := func() string {
			if rand.Intn(2) == 1 {
				return "increase"
			}
			return "decrease"
		}
		currency := func() string {
			index := rand.Intn(3)
			if index == 1 {
				return "POINTS"
			}
			if index == 2 {
				return "TON"
			}
			return "USDT"
		}
		reason := func() string {
			if rand.Intn(2) == 1 {
				return "reason"
			}
			return ""
		}
		var before_balance int64
		var amount int64
		var after_balance int64
		before_balance = rand.Int63n(100000)
		amount = rand.Int63n(1000)
		after_balance = before_balance + amount

		// email := faker.Email()
		// address := faker.Address()
		// phone := faker.Phone()

		datas = append(datas, &eventmodels.AssetsEventContent{
			UserBasic: eventmodels.UserBasic{
				UserId:            user_id,
				UserName:          user_name,
				TgId:              tg_id,
				XId:               x_id,
				ParentUserId:      parent_user_id,
				IsRobot:           is_robot,
				PointsRankSeq:     points_rank_seq,
				ThrowDiceRankSeq:  throw_dice_rank_seq,
				InviteUserRankSeq: invite_user_rank_seq,
			},
			EventBasic: eventmodels.EventBasic{
				ServerId:  server_id,
				IsSuccess: is_success(),
				CreateAt:  create_at,
			},
			OperationType: operation_type(),
			Currency:      currency(),
			Reason:        reason(),
			BeforeBalance: before_balance,
			Amount:        amount,
			AfterBalance:  after_balance,
		})
	}

	err = db.CreateInBatches(datas, len(datas)).Error
	if err != nil {
		fmt.Printf("CreateInBatches error:%v", err)
		return
	}

	// sqlStr := `select SUM(amount) as total_amount from assets_event_contents where user_id = ? and currency = ?`
	var total_amount int64
	for _, name := range names {
		// err := db.Raw(sqlStr, name, "USDT").Pluck("SUM(amount) as total_amount", &total_amount).Error
		// if err != nil {
		// 	fmt.Printf("Pluck error:%v", err)
		// 	return
		// }

		where := &eventmodels.AssetsEventContent{
			UserBasic: eventmodels.UserBasic{
				UserId: name,
				// UserId: "1", // 不存在的用户
			},
			EventBasic: eventmodels.EventBasic{
				ServerId: server_id,
			},
			Currency: "USDT",
		}
		err := db.Model(&eventmodels.AssetsEventContent{}).Where(where).Pluck("SUM(amount) as total_amount", &total_amount).Error
		if err != nil {
			fmt.Printf("Pluck error:%v", err)
			return
		}

		fmt.Printf("name:%s total_amount:%v", name, total_amount)
	}
}
