package mysqlclient

import (
	"database/sql"
	"fmt"
	"net/url"

	. "github.com/onsi/ginkgo"
	"github.com/pingcap/log"
	"github.com/pingcap/test-infra/sdk/resource"

	"go.uber.org/zap"

	_ "github.com/pingcap/endless/pkg/client/tidb"
	. "github.com/pingcap/endless/pkg/matcher"
)

var _ = Describe("mysql client test ", func() {
	Context("use different version of mysql client to connect tidb ", func() {
		It("[nonauth]connect without auth", func() {
			ctx := suiteTestCtx
			tc := ctx.Resource("tc").(resource.TiDBCluster)
			dbURL := Try(tc.ServiceURL(resource.DBAddr)).(*url.URL)
			host := dbURL.Hostname()
			port := dbURL.Port()
			log.Info("tidb host:ip", zap.String("host", host), zap.String("port", port))
			tidbtest := ctx.Resource("dbdeployer").(resource.WorkloadNode)
			Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: "mkdir -p /root/opt/mysql;cp dbdeployer-1.64.0.linux /usr/local/bin/dbdeployer"}))
			Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: "dbdeployer --version"}))
			Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: "dbdeployer downloads get-unpack mysql-5.0.96.tar.xz"}))
			Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: "dbdeployer downloads get-unpack mysql-5.1.72.tar.xz"}))
			// Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: "dbdeployer downloads get-unpack mysql-5.5.62.tar.xz"}))
			// Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: "dbdeployer downloads get-unpack mysql-5.6.44.tar.xz"}))
			Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: "dbdeployer downloads get-unpack mysql-5.7.26.tar.xz"}))
			Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: "dbdeployer downloads get-unpack mysql-8.0.17-linux-x86_64-minimal.tar.xz"}))
			Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: "dbdeployer downloads get-unpack mysql-8.0.22-linux-glibc2.17-x86_64-minimal.tar.xz"}))
			Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: "dbdeployer downloads get-unpack mysql-8.0.25-linux-glibc2.17-x86_64-minimal.tar.xz"}))
			Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: "dbdeployer downloads get-unpack mysql-8.0.27-linux-glibc2.17-x86_64-minimal.tar.xz"}))

			cmd := fmt.Sprintf("./tidb_client_test -host %s -port %s --verbose > result.log", host, port)
			log.Info("cmd str", zap.String("cmd", cmd))
			defer func() {
				log.Info("test-case-1 fail")
			}()
			Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: cmd}))

		})

		It("issue29709", func() {
			ctx := suiteTestCtx
			tc := ctx.Resource("tc").(resource.TiDBCluster)
			dbURL := Try(tc.ServiceURL(resource.DBAddr)).(*url.URL)
			host := dbURL.Hostname()
			port := dbURL.Port()
			log.Info("tidb host:ip", zap.String("host", host), zap.String("port", port))
			tidbtest := ctx.Resource("dbdeployer").(resource.WorkloadNode)
			db := Try(tc.GetDB("test")).(*sql.DB)
			defer db.Close()
			Try(db.Query("create user u1@'%';"))
			cmd := fmt.Sprintf("/root/opt/mysql/8.0.22/bin/mysql -uu1 -h %s -P %s -e'quit'", host, port)
			Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: cmd}))
			cmd = fmt.Sprintf("/root/opt/mysql/8.0.25/bin/mysql -uu1 -h %s -P %s -e 'quit'", host, port)
			Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: cmd}))
			cmd = fmt.Sprintf("/root/opt/mysql/8.0.27/bin/mysql -uu1 -h %s -P %s -e 'quit'", host, port)
			Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: cmd}))
			cmd = fmt.Sprintf("/root/opt/mysql/5.7.26/bin/mysql -uu1 -h %s -P %s -e 'quit'", host, port)
			Try(tidbtest.Exec(resource.WorkloadNodeExecOptions{Command: cmd}))

		})
	})
})
