package dbutil

import (
	"database/sql"
	"fmt"
	"net/url"
	errutil "tiloader/pkg/errutil"
	fileutil "tiloader/pkg/fileutil"
	log "tiloader/pkg/logutil"

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

// DBConfig is database configuration.
type DBConfig struct {
	Host string `toml:"host" json:"host"`

	Port int `toml:"port" json:"port"`

	User string `toml:"user" json:"user"`

	Password string `toml:"password" json:"-"`

	Schema string `toml:"schema" json:"schema"`

	Charset string `toml:"charset" json:"charset"`
}

// OpenDB opens a mysql connection
func OpenDB(cfg DBConfig, vars map[string]string) (*sql.DB, error) {
	var dbDSN string
	dbDSN = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s/?charset=utf8mb4", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.Schema)

	for key, val := range vars {
		dbDSN += fmt.Sprintf("&%s=%%27%s%%27", key, url.QueryEscape(val))
	}

	dbConn, err := sql.Open("mysql", dbDSN)
	if err != nil {
		log.Error("create db failed:" + err.Error())
		errutil.ErrCtl()
		return nil, err
	}

	err = dbConn.Ping()
	return dbConn, err
}

func GetDB(cfg fileutil.ConfigFile) (*sql.DB, error) {
	dbDSN := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.Schema)
	//fmt.Println("*********:" + dbDSN)
	dbConn, err := sql.Open("mysql", dbDSN)
	dbConn.SetMaxOpenConns(50)
	dbConn.SetMaxIdleConns(50)
	if err != nil {
		log.Error("create db failed:" + err.Error())
		errutil.ErrCtl()
		return nil, err
	}
	err = dbConn.Ping()
	return dbConn, err
}
