package drivers

import (
	"fmt"
	"github.com/pingcap/errors"
	"sync"
)

type DriverType uint8

const (
	DRIVER_TYPE__CMD DriverType = iota
)

func (s DriverType) String() string {
	all := [...]string{"CMD"}
	if int(s) > len(all) {
		return ""
	}
	return all[s]
}

type Driver interface {
	DriverType() DriverType
}

type ComponentDrivers map[DriverType]interface{}

type DriverMap map[string]ComponentDrivers

var driverLock sync.Mutex

var m = make(DriverMap)

func Register(component string, kind DriverType, driver interface{}) {
	driverLock.Lock()
	defer driverLock.Unlock()
	if _, ok := m[component]; !ok {
		m[component] = make(ComponentDrivers)
	}
	m[component][kind] = driver
}

func GetDriver(component string, kind DriverType) (interface{}, error) {
	driverLock.Lock()
	defer driverLock.Unlock()
	if drivers, ok := m[component]; ok {
		if driver, ok := drivers[kind]; ok {
			return driver, nil
		}
	}
	return nil, errors.New(fmt.Sprintf("No drivers found for component: %s, driver type: %s", component, kind))
}

func GetDrivers(component string) ComponentDrivers {
	driverLock.Lock()
	defer driverLock.Unlock()
	if drivers, ok := m[component]; ok {
		return drivers
	}
	return nil
}
