package test

import (
	"database/sql"
	"encoding/json"
	"fmt"
	"math/rand"
	"os"

	"github.com/go-sql-driver/mysql"
)

const (
	// MySQLPassword is the mysql password key
	MySQLPassword = "mysql-password"
	// MYSQLPort is the mysql port key
	MYSQLPort = "mysql-port"
	// MySQLHost is the mysql host key
	MySQLHost = "mysql-host"
	// MySQLUser is the mysql user key
	MySQLUser = "mysql-user"
)

func GetMySQLConfigFromEnv() map[string]interface{} {
	result := map[string]interface{}{
		MySQLPassword: "",
		MYSQLPort:     3306,
		MySQLHost:     "127.0.0.1",
		MySQLUser:     "root",
	}
	mysqlTestConfig, ok := os.LookupEnv("MYSQL_TEST_CONFIG")
	if !ok {
		return result
	}
	err := json.Unmarshal([]byte(mysqlTestConfig), &result)
	if err != nil {
		panic(err)
	}
	return result
}

func InitMysql() *sql.DB {
	mysqlConfig := GetMySQLConfigFromEnv()
	dbName := fmt.Sprintf("unittest_dbaas_%v", rand.Int())
	conf := mysql.NewConfig()
	conf.Net = "tcp"
	conf.User = mysqlConfig[MySQLUser].(string)
	conf.Addr = fmt.Sprintf("%s:%d", mysqlConfig[MySQLHost].(string), mysqlConfig[MYSQLPort].(int))
	conf.Passwd = mysqlConfig[MySQLPassword].(string)
	db, err := sql.Open("mysql", conf.FormatDSN())
	if err != nil {
		panic(err)
	}
	_, err = db.Exec(fmt.Sprintf("drop database if exists %s", dbName))
	if err != nil {
		panic(err)
	}
	_, err = db.Exec(fmt.Sprintf("create database %v CHARACTER SET utf8mb4 COLLATE utf8mb4_bin", dbName))
	if err != nil {
		panic(err)
	}
	_ = db.Close()
	conf.DBName = dbName
	db, err = sql.Open("mysql", conf.FormatDSN())
	if err != nil {
		panic(err)
	}
	return db
}
