package dbconn

import (
	"database/sql"
	"fmt"

	// mysql driver
	_ "github.com/go-sql-driver/mysql"
	"github.com/pingcap/errors"
	"github.com/pingcap/log"
	"go.uber.org/zap"
)

var (
	MaxOpenConns = 5
	MaxIdleConns = 5
	DialTimeout  = "2s"
	ReadTimeout  = "2s"
	WriteTimeout = "30s"
)

type Config struct {
	User     string
	Password string
	Host     string
	Port     uint16
	Database string
}

func NewDatabaseHandle(conf Config) (*sql.DB, error) {
	dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?timeout=%s&readTimeout=%s&writeTimeout=%s", conf.User, conf.Password, conf.Host, conf.Port, conf.Database, DialTimeout, ReadTimeout, WriteTimeout)

	db, err := sql.Open("mysql", dataSourceName)
	if err != nil {
		return nil, errors.Annotatef(err, "create database handle '%s'", dataSourceName)
	}

	db.SetMaxOpenConns(MaxOpenConns)
	db.SetMaxIdleConns(MaxIdleConns)

	err = db.Ping()
	if err != nil {
		return nil, errors.Annotatef(err, "ping database '%s'", dataSourceName)
	}

	log.Info("create database handle", zap.String("host", conf.Host), zap.Uint16("Port", conf.Port), zap.String("database", conf.Database), zap.String("user", conf.User))
	return db, nil
}
