package profiles

import (
	"veyron.io/veyron/veyron2"
	"veyron.io/veyron/veyron2/config"
	"veyron.io/veyron/veyron2/ipc"
	"veyron.io/veyron/veyron2/rt"

	"veyron.io/veyron/veyron/lib/appcycle"
	"veyron.io/veyron/veyron/profiles/internal"
	_ "veyron.io/veyron/veyron/runtimes/google/rt"
)

// LocalListenSpec is a ListenSpec for 127.0.0.1.
var LocalListenSpec = ipc.ListenSpec{
	Protocol:       "tcp",
	Address:        "127.0.0.1:0",
	AddressChooser: internal.IPAddressChooser,
}

type generic struct{ ac *appcycle.AppCycle }

var _ veyron2.Profile = (*generic)(nil)

func init() {
	rt.RegisterProfile(New())
}

// New returns a new instance of a very generic Profile. It can be used
// as a default by Runtime implementations, in unit tests etc.
func New() veyron2.Profile {
	return &generic{}
}

func (*generic) Name() string {
	return "generic"
}

func (*generic) Runtime() (string, []veyron2.ROpt) {
	return veyron2.GoogleRuntimeName, nil
}

func (*generic) Platform() *veyron2.Platform {
	p, _ := Platform()
	return p
}

func (g *generic) Init(rt veyron2.Runtime, _ *config.Publisher) (veyron2.AppCycle, error) {
	rt.Logger().VI(1).Infof("%s", g)
	g.ac = appcycle.New(rt)
	return g.ac, nil
}

func (g *generic) Cleanup() {
	g.ac.Shutdown()
}

func (g *generic) String() string {
	return "generic profile on " + g.Platform().String()
}
