package pd

import (
	"github.com/pingcap/schrodinger-test/once/drivers"
	pd_driver "github.com/pingcap/schrodinger-test/once/drivers/pd"
	_ "github.com/pingcap/schrodinger-test/once/drivers/pd/pd_ctl"
)

type BaseController struct {
	Component  string
	DriverType drivers.DriverType
	Driver     interface{}
}

func (c *BaseController) UpdateDriver(kind drivers.DriverType) (err error) {
	c.DriverType = kind
	c.Driver, err = drivers.GetDriver(c.Component, c.DriverType)
	return err
}

func (c *BaseController) SetDefaultDriver() error {
	return c.UpdateDriver(drivers.DRIVER_TYPE__CMD)
}

type PDController struct {
	BaseController
}

func (p *PDController) GetDriver() pd_driver.PDDriver {
	return p.Driver.(pd_driver.PDDriver)
}

type StoreController struct {
	BaseController
}

func (s *StoreController) GetDriver() pd_driver.StoreDriver {
	return s.Driver.(pd_driver.StoreDriver)
}

var (
	pdController    PDController
	storeController StoreController
)

func init() {
	pdController.BaseController = BaseController{Component: "pd"}
	pdController.SetDefaultDriver()
	storeController.BaseController = BaseController{Component: "store"}
	storeController.SetDefaultDriver()
}
