package cmd

import (
	"database/sql"
	"fmt"
	"github.com/pingcap/enterprise-toolkit/tispector/config"
	"github.com/pingcap/enterprise-toolkit/tispector/service/checker"
	"github.com/pingcap/enterprise-toolkit/tispector/service/sql_util"
	"github.com/pingcap/enterprise-toolkit/tispector/service/task"
	"github.com/pingcap/enterprise-toolkit/tispector/util/logger"
	"github.com/spf13/cobra"
	"strconv"
)

var (
	queryFile string
	querySQL  string
)

var queryCmd = &cobra.Command{
	Use:   "query",
	Short: "从文件或命令行读取读入 SQL ",
	Run: func(cmd *cobra.Command, args []string) {
		// 链接地址
		dbUrl := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", config.Conf.DB.User, config.Conf.DB.Password, config.Conf.DB.Address, config.Conf.DB.Port, config.Conf.DB.DBName)
		// 打开数据库
		db, err := sql.Open("mysql", dbUrl)
		logger.Debugf("connect url : %s", dbUrl)
		if err != nil {
			logger.Errorf("open db conn err: %s", err.Error())
			return
		}

		checker.InitRule()

		dbInfo := task.DBInfo{DB: db, DefaultDB: db, DBName: config.Conf.DB.DBName}

		for _, arg := range args {
			_, sqls := sql_util.SqlReadIn(arg)
			for _, sql := range sqls {
				results := checker.Checker.SqlTotCheck(sql, "", "", &dbInfo)
				fmt.Printf("原 sql :\n	%s \n", sql)
				logger.Debugf("原 sql :\n	%s \n", sql)

				s1 := "命中规则: \n"
				fmt.Printf(s1)
				for i, result := range results {
					s2 := "	" + strconv.Itoa(i+1) + "、"
					s3 := s2 + result.Suggestion + "\n"
					fmt.Printf(s3)
					logger.Debugf(s3)
				}
				fmt.Println(
					"",
					"",
				)
			}
		}
	},
}

func init() {
	rootCmd.AddCommand(queryCmd)
}
