package transactional_operation

import (
	"database/sql"
	"strings"
	"validate/dbctrl"
	"validate/util"
)

var ConfigurationWhiteList = []*dbctrl.Configuration{
	{Type: "tidb", Name: "log.file.filename"},
	{Type: "tidb", Name: "path"},
	{Type: "tidb", Name: "port"},
	{Type: "tidb", Name: "socket"},
	{Type: "tidb", Name: "status.status-port"},
	{Type: "tidb", Name: "tmp-storage-path"},
	{Type: "pd", Name: "advertise-client-urls"},
	{Type: "pd", Name: "advertise-peer-urls"},
	{Type: "pd", Name: "client-urls"},
	{Type: "pd", Name: "data-dir"},
	{Type: "pd", Name: "initial-cluster"},
	{Type: "pd", Name: "log.file.filename"},
	{Type: "pd", Name: "pd-server.dashboard-address"},
	{Type: "pd", Name: "peer-urls"},
	{Type: "tiflash", Name: "engine-store.flash.proxy.config"},
	{Type: "tiflash", Name: "raftstore-proxy.log-backup.temp-path"},
	{Type: "tiflash", Name: "raftstore-proxy.log.file.filename"},
	{Type: "tiflash", Name: "raftstore-proxy.pd.endpoints"},
	{Type: "tiflash", Name: "raftstore-proxy.raft-engine.dir"},
	{Type: "tiflash", Name: "raftstore-proxy.raftstore.raftdb-path"},
	{Type: "tiflash", Name: "raftstore-proxy.server.addr"},
	{Type: "tiflash", Name: "raftstore-proxy.server.advertise-addr"},
	{Type: "tiflash", Name: "raftstore-proxy.server.advertise-status-addr"},
	{Type: "tiflash", Name: "raftstore-proxy.server.status-addr"},
	{Type: "tiflash", Name: "raftstore-proxy.storage.data-dir"},
	{Type: "tikv", Name: "log-backup.temp-path"},
	{Type: "tikv", Name: "log.file.filename"},
	{Type: "tikv", Name: "pd.endpoints"},
	{Type: "tikv", Name: "raft-engine.dir"},
	{Type: "tikv", Name: "raftstore.raftdb-path"},
	{Type: "tikv", Name: "server.addr"},
	{Type: "tikv", Name: "server.advertise-addr"},
	{Type: "tikv", Name: "server.advertise-status-addr"},
	{Type: "tikv", Name: "server.status-addr"},
	{Type: "tikv", Name: "storage.data-dir"},
}

func IsConfigInWhiteList(config *dbctrl.Configuration) bool {
	for _, c := range ConfigurationWhiteList {
		if 0 == strings.Compare(c.Type, config.Type) &&
			0 == strings.Compare(c.Name, config.Name) {
			return true
		}
	}

	return false
}

func GetConfigurationList(db *sql.DB) (variables []*dbctrl.Configuration, err error) {
	tx, err := db.Begin()
	if err != nil {
		return nil, err
	}
	defer func() {
		commitErr := tx.Commit()
		if commitErr != nil {
			util.Logger.Fatalf("failed to COMMIT transaction, " + commitErr.Error())
		}
	}()

	return dbctrl.GetConfigurationList(tx)
}
