package framework

import (
	"fmt"
)

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

// TODO: yaml/json mapping
type OutputConfig struct {
	OutputMeta
	UniqName string
	Config   ConfigData
}

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

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

type OutputConfigManager struct {
	eventReceiver EventReceiver
	configs       map[string]OutputConfig
}

func NewOutputConfigManager(eventReceiver EventReceiver) *OutputConfigManager {
	return &OutputConfigManager{
		eventReceiver: eventReceiver,
		configs:       make(map[string]OutputConfig),
	}
}

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

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

var OutputConfigMockItem0 = OutputConfig{
	UniqName:   "OutputConfigMockItem0",
	OutputMeta: OutputMockEmptyMeta,
	Config:     nil,
}

func (this *OutputConfigManager) LoadMockConfig() {
	this.Add(OutputConfigMockItem0, true)
}

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