package main

import (
	"path"
	"runtime"

	androidbuildinternal "go.skia.org/infra/go/androidbuildinternal/v2beta1"
	"go.skia.org/infra/go/gce"
	"go.skia.org/infra/go/gce/server"
)

func AutoRollBase(name, ipAddress string) *gce.Instance {
	vm := server.Server20170928(name)
	vm.DataDisks[0].SizeGb = 64
	vm.DataDisks[0].Type = gce.DISK_TYPE_PERSISTENT_STANDARD
	if ipAddress != "" {
		vm.ExternalIpAddress = ipAddress
	}
	vm.MachineType = gce.MACHINE_TYPE_STANDARD_2
	vm.Metadata["owner_primary"] = "borenet"
	vm.Metadata["owner_secondary"] = "rmistry"
	return vm
}

func Skia() *gce.Instance {
	vm := AutoRollBase("skia-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"borenet@google.com",
	}
	vm.ServiceAccount = "skia-chromium-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func SkiaInternal() *gce.Instance {
	vm := AutoRollBase("skia-internal-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"borenet@google.com",
	}
	vm.ServiceAccount = "skia-internal-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	_, filename, _, _ := runtime.Caller(0)
	dir := path.Dir(filename)
	vm.SetupScript = path.Join(dir, "setup-script-internal.sh")
	return vm
}

func AFDOChromium() *gce.Instance {
	vm := AutoRollBase("afdo-chromium-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"gbiv@chromium.org",
	}
	vm.ServiceAccount = "afdo-chromium-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func AngleSkia() *gce.Instance {
	vm := AutoRollBase("angle-skia-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"jmadill@google.com",
	}
	vm.ServiceAccount = "angle-skia-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func AngleChromium() *gce.Instance {
	vm := AutoRollBase("angle-chromium-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"jmadill@google.com",
	}
	vm.ServiceAccount = "angle-chromium-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func Catapult() *gce.Instance {
	vm := AutoRollBase("catapult-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"sullivan@google.com",
	}
	vm.ServiceAccount = "catapult-chromium-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func Chromite_Chromium() *gce.Instance {
	vm := AutoRollBase("chromite-chromium-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"bpastene@google.com",
	}
	vm.ServiceAccount = "chromite-chromium-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func DepotTools_Chromium() *gce.Instance {
	vm := AutoRollBase("depot-tools-chromium-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"agable@google.com",
	}
	vm.ServiceAccount = "depot-tools-chromium-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func IosInternal_Chromium() *gce.Instance {
	vm := AutoRollBase("ios-internal-chromium-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"sdefresne@google.com",
	}
	vm.ServiceAccount = "ios-internal-chromium-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func NaCl() *gce.Instance {
	vm := AutoRollBase("nacl-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"mseaborn@google.com",
	}
	vm.ServiceAccount = "nacl-chromium-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func PDFium() *gce.Instance {
	vm := AutoRollBase("pdfium-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"dsinclair@google.com",
	}
	vm.ServiceAccount = "pdfium-chromium-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func Fuchsia() *gce.Instance {
	vm := AutoRollBase("fuchsia-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"brianosman@google.com",
		"rmistry@google.com",
	}
	vm.ServiceAccount = "skia-fuchsia-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func FuchsiaSDK_Chromium() *gce.Instance {
	vm := AutoRollBase("fuchsia-sdk-chromium-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"jbudorick@chromium.org",
		"cr-fuchsia+bot@chromium.org",
	}
	vm.ServiceAccount = "fuchsia-sdk-chromium-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func SkCMS_Skia() *gce.Instance {
	vm := AutoRollBase("skcms-skia-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"brianosman@google.com",
		"mtklein@google.com",
	}
	vm.ServiceAccount = "skcms-skia-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func SrcInternal_Chromium() *gce.Instance {
	vm := AutoRollBase("src-internal-chromium-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"mmoss@google.com",
	}
	vm.ServiceAccount = "src-internal-chromium-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func WebRTC_Chromium() *gce.Instance {
	vm := AutoRollBase("webrtc-chromium-autoroll", "" /* Use ephemeral IP */)
	vm.Contacts = []string{
		"comms-engprod-sto@google.com",
	}
	vm.ServiceAccount = "webrtc-chromium-autoroll@skia-buildbots.google.com.iam.gserviceaccount.com"
	return vm
}

func AddAndroidConfigs(vm *gce.Instance) *gce.Instance {
	vm.DataDisks[0].SizeGb = 512
	vm.MachineType = gce.MACHINE_TYPE_HIGHMEM_16
	vm.Scopes = append(vm.Scopes, androidbuildinternal.AndroidbuildInternalScope)

	_, filename, _, _ := runtime.Caller(0)
	dir := path.Dir(filename)
	vm.SetupScript = path.Join(dir, "setup-script-android.sh")
	return vm
}

func AndroidMaster() *gce.Instance {
	vm := AutoRollBase("android-master-autoroll", "130.211.199.63" /* Needs whitelisted static IP */)
	vm.Contacts = []string{
		"djsollen@google.com",
		"rmistry@google.com",
	}
	return AddAndroidConfigs(vm)
}

func AndroidNext() *gce.Instance {
	vm := AutoRollBase("android-next-autoroll", "35.202.27.169" /* Needs whitelisted static IP */)
	vm.Contacts = []string{
		"djsollen@google.com",
		"rmistry@google.com",
	}
	return AddAndroidConfigs(vm)
}

func AndroidO() *gce.Instance {
	vm := AutoRollBase("android-o-autoroll", "104.198.73.244" /* Needs whitelisted static IP */)
	vm.Contacts = []string{
		"djsollen@google.com",
		"rmistry@google.com",
	}
	return AddAndroidConfigs(vm)
}

func Google3() *gce.Instance {
	// Not using AutoRollBase because this server does not need auth.SCOPE_GERRIT.
	vm := server.Server20170928("google3-autoroll")
	vm.Contacts = []string{
		"benjaminwagner@google.com",
	}
	vm.DataDisks[0].SizeGb = 64
	vm.DataDisks[0].Type = gce.DISK_TYPE_PERSISTENT_STANDARD
	vm.MachineType = gce.MACHINE_TYPE_STANDARD_2
	vm.Metadata["owner_primary"] = "benjaminwagner"
	vm.Metadata["owner_secondary"] = "borenet"
	return vm
}

func main() {
	server.Main(gce.ZONE_DEFAULT, map[string]*gce.Instance{
		"afdo-chromium":         AFDOChromium(),
		"android-master":        AndroidMaster(),
		"android-next":          AndroidNext(),
		"android-o":             AndroidO(),
		"angle-chromium":        AngleChromium(),
		"angle-skia":            AngleSkia(),
		"catapult":              Catapult(),
		"chromite-chromium":     Chromite_Chromium(),
		"depot-tools-chromium":  DepotTools_Chromium(),
		"fuchsia":               Fuchsia(),
		"fuchsia-sdk-chromium":  FuchsiaSDK_Chromium(),
		"google3":               Google3(),
		"ios-internal-chromium": IosInternal_Chromium(),
		"nacl":                  NaCl(),
		"pdfium":                PDFium(),
		"skcms-skia":            SkCMS_Skia(),
		"skia":                  Skia(),
		"skia-internal":         SkiaInternal(),
		"src-internal-chromium": SrcInternal_Chromium(),
		"webrtc-chromium":       WebRTC_Chromium(),
	})
}
