package main

import (
	"io"
	"os"
	"os/exec"

	"v2ray.com/core"
	"v2ray.com/core/app/log"
	"v2ray.com/core/common/platform"
	jsonconf "v2ray.com/ext/tools/conf/serial"
)

func jsonToProto(input io.Reader) (*core.Config, error) {
	v2ctl := platform.GetToolLocation("v2ctl")
	_, err := os.Stat(v2ctl)
	if err != nil {
		return nil, err
	}
	cmd := exec.Command(v2ctl, "config")
	cmd.Stdin = input
	cmd.Stderr = os.Stderr

	stdoutReader, err := cmd.StdoutPipe()
	if err != nil {
		return nil, err
	}
	defer stdoutReader.Close()
	return core.LoadConfig(core.ConfigFormat_Protobuf, stdoutReader)
}

func init() {
	core.RegisterConfigLoader(core.ConfigFormat_JSON, func(input io.Reader) (*core.Config, error) {
		config, err := jsonToProto(input)
		if err != nil {
			log.Trace(newError("failed to execute v2ctl to convert config file.").Base(err).AtWarning())
			return jsonconf.LoadJSONConfig(input)
		}
		return config, nil
	})
}