package framework

import (
	"fmt"
)

// TODO: hot reload, need to stop and re-create related running things

// TODO: yaml/json mapping

type InputProviderConfig struct {
	InputProviderMeta
	UniqName string
	Config   ConfigData
}

func (this *InputProviderConfig) String() string {
	return fmt.Sprintf("UniqName:%s;%s", this.UniqName, this.InputProviderMeta.String())
}

func (this *InputProviderConfig) autoGenUniqName() string {
	if this.UniqName == "" {
		this.UniqName = this.InputProviderMeta.String()
	}
	return this.UniqName
}

type InputProviderConfigManager struct {
	eventReceiver EventReceiver
	configs       map[string]InputProviderConfig
}

func NewInputProviderConfigManager(eventReceiver EventReceiver) *InputProviderConfigManager {
	return &InputProviderConfigManager{
		eventReceiver: eventReceiver,
		configs:       make(map[string]InputProviderConfig),
	}
}

func (this *InputProviderConfigManager) Get(uniqName string) (InputProviderConfig, bool) {
	config, ok := this.configs[uniqName]
	return config, ok
}

func (this *InputProviderConfigManager) Add(config InputProviderConfig, allowReplace bool) bool {
	uniqName := config.autoGenUniqName()
	_, ok := this.configs[uniqName]
	if ok {
		if !allowReplace {
			return false
		}
	}
	this.configs[uniqName] = config
	this.eventReceiver.OnEvent(
		EventInputProviderConfigManagerAddItem,
		EventDataWithName("InputProviderConfigItem", CloneableString(config.String())))
	return true
}

var InputProviderConfigMockItem0 = InputProviderConfig{
	UniqName:          "InputProviderConfigMockItem0",
	InputProviderMeta: InputProviderMockEmptyMeta,
	Config:            nil,
}

var InputProviderConfigMockItem1 = InputProviderConfig{
	UniqName:          "InputProviderConfigMockItem1",
	InputProviderMeta: InputProviderMockV1Meta,
	Config: &InputProviderMockConfigV1{
		Step: 1,
	},
}

func (this *InputProviderConfigManager) LoadMockConfig() {
	this.Add(InputProviderConfigMockItem0, true)
	this.Add(InputProviderConfigMockItem1, true)
}

func (this *InputProviderConfigManager) LoadFromFile() error {
	// TODO: impl
	return nil
}
