package core

import (
	"io"

	"v2ray.com/core/common"
	"v2ray.com/core/common/buf"

	"github.com/golang/protobuf/proto"
)

// ConfigLoader is an utility to load V2Ray config from external source.
type ConfigLoader func(input io.Reader) (*Config, error)

var configLoaderCache = make(map[ConfigFormat]ConfigLoader)

// RegisterConfigLoader add a new ConfigLoader.
func RegisterConfigLoader(format ConfigFormat, loader ConfigLoader) error {
	configLoaderCache[format] = loader
	return nil
}

// LoadConfig loads config with given format from given source.
func LoadConfig(format ConfigFormat, input io.Reader) (*Config, error) {
	loader, found := configLoaderCache[format]
	if !found {
		return nil, newError(ConfigFormat_name[int32(format)], " is not loadable.").AtWarning()
	}
	return loader(input)
}

func loadProtobufConfig(input io.Reader) (*Config, error) {
	config := new(Config)
	data, err := buf.ReadAllToBytes(input)
	if err != nil {
		return nil, err
	}
	if err := proto.Unmarshal(data, config); err != nil {
		return nil, err
	}
	return config, nil
}

func init() {
	common.Must(RegisterConfigLoader(ConfigFormat_Protobuf, loadProtobufConfig))
}