package storage

import (
	"strings"

	"github.com/jmoiron/sqlx"
	"github.com/jmoiron/sqlx/reflectx"
	"github.com/pingcap/schrodinger/pkg/storage/mysql"
)

// NewMysqlStorage returns a mysql store
func NewMysqlStorage(cfg Config) (*Storage, error) {
	// return *Storage{}, nil
	db, err := sqlx.Connect(cfg.Driver, cfg.Datasource)
	if err != nil {
		return nil, err
	}

	db.SetMaxIdleConns(cfg.MaxIdleConns)

	db.Mapper = reflectx.NewMapperFunc("json", strings.ToLower)
	if err := mysql.Migrate(db.DB); err != nil {
		return nil, err
	}

	return &Storage{client: &mysqlClient{db: db}}, nil
}

type mysqlClient struct {
	db *sqlx.DB
}

// Close closes the connection with mysql db
func (m *mysqlClient) Close() error {
	return m.db.Close()
}
