package dbctrl

import (
	"database/sql"
	"time"
	"validate/util"
)

/*
original_sql	参数化后的原始 SQL
bind_sql	带 Hint 的绑定 SQL
default_db	默认数据库名
status	状态，包括 using（正在使用）、deleted（已删除）、 invalid（无效）、rejected（演进时被拒绝）和 pending verify（等待演进验证）
create_time	创建时间
update_time	更新时间
charset	字符集
collation	排序规则
source	创建方式，包括 manual （由 create [global] binding 生成）、capture（由 tidb 自动创建生成）和 evolve （由 tidb 自动演进生成）
*/

type SQLBindingStatus string

const (
	SQLBindingInUsing       SQLBindingStatus = "using"
	SQLBindingDeleted       SQLBindingStatus = "deleted"
	SQLBindingInvalid       SQLBindingStatus = "invalid"
	SQLBindingRejected      SQLBindingStatus = "rejected"
	SQLBindingPendingVerify SQLBindingStatus = "pending-verify"
)

type SQLBinding struct {
	OriginalSQL   string
	BindSQL       string
	DefaultDBName string
	Status        string
	CreateTime    time.Time
	UpdateTime    time.Time
	Charset       string
	Collation     string
	Source        string
}

const ShowAllSQLBindings = "SHOW GLOBAL BINDINGS;"

func GetGlobalSQLBindingList(tx *sql.Tx) ([]*SQLBinding, error) {
	rows, err := tx.Query(ShowAllSQLBindings)
	if err != nil {
		return nil, err
	}

	var bindingList []*SQLBinding
	for rows.Next() {
		sqlBiding := &SQLBinding{}
		if err = rows.Scan(
			&sqlBiding.OriginalSQL,
			&sqlBiding.BindSQL,
			&sqlBiding.DefaultDBName,
			&sqlBiding.Status,
			&sqlBiding.CreateTime,
			&sqlBiding.UpdateTime,
			&sqlBiding.Charset,
			&sqlBiding.Collation,
			&sqlBiding.Source,
		); err != nil {
			util.Logger.Fatalf(err.Error())
		}

		bindingList = append(bindingList, sqlBiding)
	}

	return bindingList, nil
}
