package main

import (
	"database/sql"
	"time"

	"github.com/pingcap/errors"
	"github.com/pingcap/schrodinger/pkg/test_client"
)

var VarTimeZone = SysVar{Name: "time_zone", Default: "SYSTEM", Escape: StrQuote}

type TestTimeZone struct {
	BaseTestCase
}

func (t *TestTimeZone) Run() error {
	err := t.TestBasic("Asia/Shanghai")
	if err != nil {
		return err
	}
	db, err := sql.Open("mysql", t.DSN)
	if err != nil {
		return errors.Annotate(err, "open database")
	}

	gencb := func(t *time.Time) func(db *sql.DB) error {
		return func(db *sql.DB) error {
			var s string
			err := db.QueryRow("SELECT NOW()").Scan(&s)
			if err != nil {
				return errors.Annotate(err, "query current time")
			}
			*t, err = time.Parse("2006-01-02 15:04:05", s)
			if err != nil {
				return errors.Annotate(err, "parse time string")
			}
			return nil
		}
	}

	var t1 time.Time
	err = t.Var.WithValue(db, "UTC", gencb(&t1))
	if err != nil {
		return err
	}
	var t2 time.Time
	err = t.Var.WithValue(db, "Asia/Shanghai", gencb(&t2))
	if err != nil {
		return err
	}

	d := t2.Sub(t1)

	if d > 8*time.Hour+time.Second || d < 8*time.Hour {
		client.Errorf("t1=%s t2=%s", t1, t2)
		return errors.New("unexpected time difference")
	}

	return nil
}

func init() {
	RegisterTestCase("time_zone", &TestTimeZone{BaseTestCase{Var: VarTimeZone}})
}
