// +build linux

// Package gce provides a Profile for Google Compute Engine and should be
// used by binaries that only ever expect to be run on GCE.
package gce

import (
	"fmt"
	"net"

	"v.io/core/veyron2"
	"v.io/core/veyron2/config"
	"v.io/core/veyron2/ipc"
	"v.io/core/veyron2/rt"

	"v.io/core/veyron/lib/appcycle"
	"v.io/core/veyron/lib/netstate"
	"v.io/core/veyron/profiles/internal/gce"
	"v.io/core/veyron/profiles/internal/platform"
	_ "v.io/core/veyron/runtimes/google/ipc/protocols/tcp"
	_ "v.io/core/veyron/runtimes/google/ipc/protocols/ws"
	_ "v.io/core/veyron/runtimes/google/ipc/protocols/wsh"
	_ "v.io/core/veyron/runtimes/google/rt"
)

var (
	// ListenSpec is an initialized instance of ipc.ListenSpec that can
	// be used with ipc.Listen.
	ListenSpec ipc.ListenSpec
)

func init() {
	rt.RegisterProfile(&profile{})
}

type profile struct {
	ac *appcycle.AppCycle
}

func (p *profile) Name() string {
	return "GCE"
}

func (p *profile) Runtime() (string, []veyron2.ROpt) {
	return "", nil
}

func (p *profile) Platform() *veyron2.Platform {
	pstr, _ := platform.Platform()
	return pstr
}

func (p *profile) String() string {
	return "net " + p.Platform().String()
}

func (p *profile) Init(veyron2.Runtime, *config.Publisher) (veyron2.AppCycle, error) {
	if !gce.RunningOnGCE() {
		return nil, fmt.Errorf("GCE profile used on a non-GCE system")
	}

	lf := commonFlags.ListenFlags()
	ListenSpec = ipc.ListenSpec{
		Addrs: ipc.ListenAddrs(lf.Addrs),
		Proxy: lf.ListenProxy,
	}

	p.ac = appcycle.New()

	if ip, err := gce.ExternalIPAddress(); err != nil {
		return p.ac, err
	} else {
		ListenSpec.AddressChooser = func(network string, addrs []ipc.Address) ([]ipc.Address, error) {
			return []ipc.Address{&netstate.AddrIfc{&net.IPAddr{IP: ip}, "gce-nat", nil}}, nil
		}
	}
	return p.ac, nil
}

func (p *profile) Cleanup() {
	p.ac.Shutdown()
}
