// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// package mojo_profile implements the mojo profile.
package mojo_profile

import (
	"bytes"
	"flag"
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"strings"

	"v.io/jiri"
	"v.io/jiri/gitutil"
	"v.io/jiri/profiles"
	"v.io/jiri/profiles/profilesmanager"
	"v.io/jiri/profiles/profilesutil"
	"v.io/x/lib/envvar"
)

const (
	// On every green Mojo build (defined as compiling and passing the mojo
	// tests) a set of build artifacts are published to publicly-readable
	// Google cloud storage buckets.
	mojoStorageBucket = "https://storage.googleapis.com/mojo"

	// The mojo devtools repo has tools for running, debugging and testing mojo apps.
	mojoDevtoolsRemote = "https://github.com/domokit/devtools"

	// The mojo_sdk repo is a mirror of github.com/domokit/mojo/mojo/public.
	// It is mirrored for easy consumption.
	mojoSdkRemote = "https://github.com/domokit/mojo_sdk.git"

	// The main mojo repo.  We should not need this, but currently the service
	// mojom files live here and are not mirrored anywhere else.
	// TODO(nlacasse): Once the service mojoms exist elsewhere, remove this and
	// get the service mojoms from wherever they are.
	mojoRemote = "https://github.com/domokit/mojo.git"
)

type versionSpec struct {
	// Version of android platform tools.  See http://tools.android.com/download.
	androidPlatformToolsVersion string

	// The names of the mojo services to install for all targets.
	serviceNames []string

	// The names of additional mojo services to install for android targets.
	serviceNamesAndroid []string

	// The names of additional mojo services to install for linux targets.
	serviceNamesLinux []string

	// The git SHA of the mojo artifacts, including the mojo shell and system
	// thunks to install on android targets.
	// The latest can be found in
	// https://storage.googleapis.com/mojo/shell/android-arm/LATEST.
	buildVersionAndroid string

	// The git SHA of the mojo artifacts, including the mojo shell and system
	// thunks to install on linux targets.
	// The latest can be found in
	// https://storage.googleapis.com/mojo/shell/linux-x64/LATEST.
	buildVersionLinux string

	// The git SHA, branch, or tag of the devtools repo to checkout.
	devtoolsVersion string

	// The git SHA of the mojo network service.  The latest can be found in
	// https://github.com/domokit/mojo/blob/master/mojo/public/tools/NETWORK_SERVICE_VERSION
	networkServiceVersion string

	// The git SHA, branch, or tag of the the mojo_sdk repo to checkout.
	sdkVersion string
}

func Register(installer, profile string) {
	m := &Manager{
		profileInstaller: installer,
		profileName:      profile,
		qualifiedName:    profiles.QualifiedProfileName(installer, profile),
		versionInfo: profiles.NewVersionInfo(profile, map[string]interface{}{
			"1": &versionSpec{
				serviceNames: []string{
					"authenticating_url_loader_interceptor.mojo",
					"dart_content_handler.mojo",
					"debugger.mojo",
					"kiosk_wm.mojo",
					"tracing.mojo",
				},
				serviceNamesAndroid: []string{},
				serviceNamesLinux: []string{
					"authentication.mojo",
				},
				buildVersionAndroid:         "e2cd09460972dab4d1766153e108457fe5bbaed5",
				buildVersionLinux:           "e2cd09460972dab4d1766153e108457fe5bbaed5",
				devtoolsVersion:             "a264dd5ebdb5508d4e7e432b0ee3dcf6b1fb7160",
				networkServiceVersion:       "0a814ed5512598e595c0ae7975a09d90a7a54e90",
				sdkVersion:                  "b3af6aeeea02c07e7ccb2c672a0ebcda0d6c42b4",
				androidPlatformToolsVersion: "2219198",
			},
			"2": &versionSpec{
				serviceNames: []string{
					"authenticating_url_loader_interceptor.mojo",
					"dart_content_handler.mojo",
					"debugger.mojo",
					"kiosk_wm.mojo",
					"tracing.mojo",
				},
				serviceNamesAndroid: []string{},
				serviceNamesLinux: []string{
					"authentication.mojo",
				},
				buildVersionAndroid:         "8e8ac2169f29ee1349f7ada64e2d98466d5f5205",
				buildVersionLinux:           "8e8ac2169f29ee1349f7ada64e2d98466d5f5205",
				devtoolsVersion:             "a264dd5ebdb5508d4e7e432b0ee3dcf6b1fb7160",
				networkServiceVersion:       "0a814ed5512598e595c0ae7975a09d90a7a54e90",
				sdkVersion:                  "8e3eb6e43c82af5b9c57870003138ea165209d81",
				androidPlatformToolsVersion: "2219198",
			},
			"3": &versionSpec{
				serviceNames: []string{
					"authenticating_url_loader_interceptor.mojo",
					"dart_content_handler.mojo",
					"debugger.mojo",
					"kiosk_wm.mojo",
					"tracing.mojo",
				},
				serviceNamesAndroid: []string{},
				serviceNamesLinux: []string{
					"authentication.mojo",
				},
				buildVersionAndroid:         "1608780b78ac467dcbf1761ebc0359739c3c6bbd",
				buildVersionLinux:           "1608780b78ac467dcbf1761ebc0359739c3c6bbd",
				devtoolsVersion:             "a264dd5ebdb5508d4e7e432b0ee3dcf6b1fb7160",
				networkServiceVersion:       "0a814ed5512598e595c0ae7975a09d90a7a54e90",
				sdkVersion:                  "8e3eb6e43c82af5b9c57870003138ea165209d81",
				androidPlatformToolsVersion: "2219198",
			},
			"4": &versionSpec{
				serviceNames: []string{
					"authenticating_url_loader_interceptor.mojo",
					"dart_content_handler.mojo",
					"debugger.mojo",
					"kiosk_wm.mojo",
					"tracing.mojo",
				},
				serviceNamesAndroid: []string{
					"shortcut.mojo",
				},
				serviceNamesLinux: []string{
					"authentication.mojo",
				},
				buildVersionAndroid:         "e93037e1a5b2d84d2df3be87579f86f73d842449",
				buildVersionLinux:           "e93037e1a5b2d84d2df3be87579f86f73d842449",
				devtoolsVersion:             "1185c2a2bb45c27cbcf281cb538bcb5ba4720fea",
				networkServiceVersion:       "0a814ed5512598e595c0ae7975a09d90a7a54e90",
				sdkVersion:                  "ab83ef213a4fb310e7de5d617046e9e4120efb75",
				androidPlatformToolsVersion: "2219198",
			},
			"5": &versionSpec{
				serviceNames: []string{
					"authenticating_url_loader_interceptor.mojo",
					"dart_content_handler.mojo",
					"debugger.mojo",
					"files.mojo",
					"kiosk_wm.mojo",
					"tracing.mojo",
				},
				serviceNamesAndroid: []string{
					"shortcut.mojo",
				},
				serviceNamesLinux: []string{
					"authentication.mojo",
				},
				buildVersionAndroid:         "25d53bf53b4040f29db984d4774483c5de9d2dc5",
				buildVersionLinux:           "a8adeba2e48f2fc5f8a89b39dc637dbab474bab7",
				devtoolsVersion:             "f71528bb1d9d9b9f874ce503b3cf3d7532283eb5",
				networkServiceVersion:       "0a814ed5512598e595c0ae7975a09d90a7a54e90",
				sdkVersion:                  "832aa6a651b4468c4d0c0025bca7605bc248f82b",
				androidPlatformToolsVersion: "2219198",
			},
			"6": &versionSpec{
				serviceNames: []string{
					"authenticating_url_loader_interceptor.mojo",
					"dart_content_handler.mojo",
					"debugger.mojo",
					"files.mojo",
					"kiosk_wm.mojo",
					"tracing.mojo",
				},
				serviceNamesAndroid: []string{
					"shortcut.mojo",
				},
				serviceNamesLinux: []string{
					"authentication.mojo",
				},
				buildVersionAndroid:         "630247e6afeaf9177ff50396988700e787c51440",
				buildVersionLinux:           "a49d2b24078041ffa78e7e8d9c72ffed213f7881",
				devtoolsVersion:             "5e3dadf261aa264d885b699cee874b3e81393ddc",
				networkServiceVersion:       "0a814ed5512598e595c0ae7975a09d90a7a54e90",
				sdkVersion:                  "309af0509fb2fd824e81e2e14a63e138e2eeb30c",
				androidPlatformToolsVersion: "2219198",
			},
			"7": &versionSpec{
				serviceNames: []string{
					"authenticating_url_loader_interceptor.mojo",
					"compositor_service.mojo",
					"dart_content_handler.mojo",
					"debugger.mojo",
					"files.mojo",
					"input_manager_service.mojo",
					"launcher.mojo",
					"view_manager_service.mojo",
					"tracing.mojo",
				},
				serviceNamesAndroid: []string{
					"shortcut.mojo",
				},
				serviceNamesLinux: []string{
					"authentication.mojo",
				},
				buildVersionAndroid:         "17e3b04429ce6ad836128e1ceffefd85493ec779",
				buildVersionLinux:           "17e3b04429ce6ad836128e1ceffefd85493ec779",
				devtoolsVersion:             "5e3dadf261aa264d885b699cee874b3e81393ddc",
				networkServiceVersion:       "0a814ed5512598e595c0ae7975a09d90a7a54e90",
				sdkVersion:                  "39488b961eb9dca8c6ca4a2cc0d693dd13db29e3",
				androidPlatformToolsVersion: "2219198",
			},
			"8": &versionSpec{
				serviceNames: []string{
					"authenticating_url_loader_interceptor.mojo",
					"compositor_service.mojo",
					"dart_content_handler.mojo",
					"debugger.mojo",
					"files.mojo",
					"input_manager_service.mojo",
					"launcher.mojo",
					"view_manager_service.mojo",
					"tracing.mojo",
				},
				serviceNamesAndroid: []string{
					"shortcut.mojo",
				},
				serviceNamesLinux: []string{
					"authentication.mojo",
				},
				buildVersionAndroid:         "92b330f6dedb4d880eb66e384a28b1a4de2f6ba2",
				buildVersionLinux:           "92b330f6dedb4d880eb66e384a28b1a4de2f6ba2",
				devtoolsVersion:             "6a6098eb787ea88af5ef8e2978074ad57ce6ebeb",
				networkServiceVersion:       "0a814ed5512598e595c0ae7975a09d90a7a54e90",
				sdkVersion:                  "465117ff5f34a8ef48b6a94d57f081e3c8e77ca5",
				androidPlatformToolsVersion: "2219198",
			},
			"9": &versionSpec{
				serviceNames: []string{
					"authenticating_url_loader_interceptor.mojo",
					"compositor_service.mojo",
					"dart_content_handler.mojo",
					"debugger.mojo",
					"files.mojo",
					"input_manager_service.mojo",
					"launcher.mojo",
					"view_manager_service.mojo",
					"tracing.mojo",
				},
				serviceNamesAndroid: []string{
					"java_handler.mojo",
					"shortcut.mojo",
				},
				serviceNamesLinux: []string{
					"authentication.mojo",
				},
				buildVersionAndroid:         "f559b92ae36d7c4488d238ecf9459c4b81e35029",
				buildVersionLinux:           "f559b92ae36d7c4488d238ecf9459c4b81e35029",
				devtoolsVersion:             "9c40805af6ddc9014c5215dccbabfcafaf83e0ff",
				networkServiceVersion:       "0a814ed5512598e595c0ae7975a09d90a7a54e90",
				sdkVersion:                  "6ff49c5bde5c1230ca376a8f5cec035f2eba1d48",
				androidPlatformToolsVersion: "2219198",
			},
			"10": &versionSpec{
				serviceNames: []string{
					"authenticating_url_loader_interceptor.mojo",
					"compositor_service.mojo",
					"dart_content_handler.mojo",
					"debugger.mojo",
					"files.mojo",
					"input_manager_service.mojo",
					"launcher.mojo",
					"view_manager_service.mojo",
					"tracing.mojo",
				},
				serviceNamesAndroid: []string{
					"java_handler.mojo",
					"shortcut.mojo",
				},
				serviceNamesLinux: []string{
					"authentication.mojo",
				},
				buildVersionAndroid:         "891577b0517de5aeca538d99669787c6dc72412a",
				buildVersionLinux:           "891577b0517de5aeca538d99669787c6dc72412a",
				devtoolsVersion:             "176889fd2e17f988727847a03b00c158af8a6c52",
				networkServiceVersion:       "0a814ed5512598e595c0ae7975a09d90a7a54e90",
				sdkVersion:                  "8d13caec84db234e320129722d2f0d5d873def11",
				androidPlatformToolsVersion: "2219198",
			},
			"11": &versionSpec{
				serviceNames: []string{
					"authenticating_url_loader_interceptor.mojo",
					"compositor_service.mojo",
					"dart_content_handler.mojo",
					"debugger.mojo",
					"files.mojo",
					"input_manager_service.mojo",
					"launcher.mojo",
					"view_manager_service.mojo",
					"tracing.mojo",
				},
				serviceNamesAndroid: []string{
					"java_handler.mojo",
					"shortcut.mojo",
				},
				serviceNamesLinux: []string{
					"authentication.mojo",
				},
				buildVersionAndroid:         "91a7a240f90012cbc8c527d04f6a70609769dd1e",
				buildVersionLinux:           "91a7a240f90012cbc8c527d04f6a70609769dd1e",
				devtoolsVersion:             "176889fd2e17f988727847a03b00c158af8a6c52",
				networkServiceVersion:       "0a814ed5512598e595c0ae7975a09d90a7a54e90",
				sdkVersion:                  "0cd77a9a96e4b21311883b67503c5f5977fdb48d",
				androidPlatformToolsVersion: "2219198",
			},
			"12": &versionSpec{
				serviceNames: []string{
					"authenticating_url_loader_interceptor.mojo",
					"compositor_service.mojo",
					"dart_content_handler.mojo",
					"debugger.mojo",
					"files.mojo",
					"input_manager_service.mojo",
					"launcher.mojo",
					"view_manager_service.mojo",
					"tracing.mojo",
				},
				serviceNamesAndroid: []string{
					"java_handler.mojo",
					"shortcut.mojo",
				},
				serviceNamesLinux: []string{
					"authentication.mojo",
				},
				buildVersionAndroid:         "aaeb3451ba80ead4583ee24773562aee4ef83ef5",
				buildVersionLinux:           "aaeb3451ba80ead4583ee24773562aee4ef83ef5",
				devtoolsVersion:             "7c1b8c9992f97ce3c8008d41e80589cb71d9c9f3",
				networkServiceVersion:       "33d1fbc3387e62a54acf66baa5ecc9e43bee050b",
				sdkVersion:                  "4b3296629ebda2a32520351c92adf75aceb75f2c",
				androidPlatformToolsVersion: "2219198",
			},
			"13": &versionSpec{
				serviceNames: []string{
					"authenticating_url_loader_interceptor.mojo",
					"compositor_service.mojo",
					"dart_content_handler.mojo",
					"debugger.mojo",
					"files.mojo",
					"input_manager_service.mojo",
					"launcher.mojo",
					"view_manager_service.mojo",
					"tracing.mojo",
				},
				serviceNamesAndroid: []string{
					"java_handler.mojo",
					"shortcut.mojo",
				},
				serviceNamesLinux: []string{
					"authentication.mojo",
				},
				buildVersionAndroid:         "65138ce8c234734966a4e299d8feba01d8c9ce07",
				buildVersionLinux:           "65138ce8c234734966a4e299d8feba01d8c9ce07",
				devtoolsVersion:             "d498890dc825363948a5852a2328b8ef937f5af4",
				networkServiceVersion:       "0a814ed5512598e595c0ae7975a09d90a7a54e90",
				sdkVersion:                  "3ea16d966ac12fe076996becd3412a19762e66ac",
				androidPlatformToolsVersion: "2219198",
			},
		}, "13"),
	}
	profilesmanager.Register(m)
}

type Manager struct {
	profileInstaller, profileName, qualifiedName string
	root, mojoRoot                               jiri.RelPath
	mojoInstDir, androidPlatformToolsDir         jiri.RelPath
	devtoolsDir, sdkDir                          jiri.RelPath
	shellDir, systemThunksDir                    jiri.RelPath
	versionInfo                                  *profiles.VersionInfo
	spec                                         versionSpec
	buildVersion                                 string
	platform                                     string
}

func (m Manager) Name() string {
	return m.profileName
}

func (m Manager) Installer() string {
	return m.profileInstaller
}

func (m Manager) String() string {
	return fmt.Sprintf("%s[%s]", m.qualifiedName, m.versionInfo.Default())
}

func (m Manager) VersionInfo() *profiles.VersionInfo {
	return m.versionInfo
}

func (m Manager) Info() string {
	return `Downloads pre-built mojo binaries and other assets required for building mojo services.`
}

func (m *Manager) AddFlags(flags *flag.FlagSet, action profiles.Action) {
}

func (m *Manager) initForTarget(jirix *jiri.X, root jiri.RelPath, target *profiles.Target) error {
	if err := m.versionInfo.Lookup(target.Version(), &m.spec); err != nil {
		return err
	}

	// Turn "amd64" architecture string into "x64" to match mojo's usage.
	mojoArch := target.Arch()
	if mojoArch == "amd64" {
		mojoArch = "x64"
	}
	m.platform = target.OS() + "-" + mojoArch

	if m.platform != "linux-x64" && m.platform != "android-arm" {
		return fmt.Errorf("only amd64-linux and arm-android targets are supported for mojo profile")
	}

	m.buildVersion = m.spec.buildVersionLinux
	if m.platform == "android-arm" {
		m.buildVersion = m.spec.buildVersionAndroid
	}

	m.root = root
	m.mojoRoot = root.Join("mojo")

	// devtools and mojo sdk are not architecture-dependant, so they can go in
	// mojoRoot.
	m.devtoolsDir = m.mojoRoot.Join("devtools", m.spec.devtoolsVersion)
	m.sdkDir = m.mojoRoot.Join("mojo_sdk", m.spec.sdkVersion)

	m.mojoInstDir = m.mojoRoot.Join(target.TargetSpecificDirname())
	m.androidPlatformToolsDir = m.mojoInstDir.Join("platform-tools", m.spec.androidPlatformToolsVersion)
	m.shellDir = m.mojoInstDir.Join("mojo_shell", m.buildVersion)
	m.systemThunksDir = m.mojoInstDir.Join("system_thunks", m.buildVersion)

	if jirix.Verbose() {
		fmt.Fprintf(jirix.Stdout(), "Installation Directories for: %s\n", target)
		fmt.Fprintf(jirix.Stdout(), "mojo installation dir: %s\n", m.mojoInstDir)
		fmt.Fprintf(jirix.Stdout(), "devtools: %s\n", m.devtoolsDir)
		fmt.Fprintf(jirix.Stdout(), "sdk: %s\n", m.sdkDir)
		fmt.Fprintf(jirix.Stdout(), "shell: %s\n", m.shellDir)
		fmt.Fprintf(jirix.Stdout(), "system thunks: %s\n", m.systemThunksDir)
		fmt.Fprintf(jirix.Stdout(), "android platform tools: %s\n", m.androidPlatformToolsDir)
	}
	return nil
}

func (m *Manager) OSPackages(jirix *jiri.X, pdb *profiles.DB, root jiri.RelPath, target profiles.Target) ([]string, error) {
	return nil, nil
}

func (m *Manager) Install(jirix *jiri.X, pdb *profiles.DB, root jiri.RelPath, target profiles.Target) error {
	if err := m.initForTarget(jirix, root, &target); err != nil {
		return err
	}

	seq := jirix.NewSeq()
	seq.MkdirAll(m.mojoInstDir.Abs(jirix), profilesutil.DefaultDirPerm).
		Call(func() error { return m.installMojoDevtools(jirix, m.devtoolsDir.Abs(jirix)) }, "install mojo devtools").
		Call(func() error { return m.installMojoSdk(jirix, m.sdkDir.Abs(jirix)) }, "install mojo SDK").
		Call(func() error { return m.installMojoShellAndServices(jirix, m.shellDir.Abs(jirix)) }, "install mojo shell and services").
		Call(func() error { return m.installMojoSystemThunks(jirix, m.systemThunksDir.Abs(jirix)) }, "install mojo system thunks")

	target.Env.Vars = envvar.MergeSlices(target.Env.Vars, []string{
		"CGO_CFLAGS=-I" + m.sdkDir.Join("src").Symbolic(),
		"CGO_CXXFLAGS=-I" + m.sdkDir.Join("src").Symbolic(),
		"CGO_LDFLAGS=-L" + m.systemThunksDir.Symbolic() + " -lsystem_thunks",
		"GOPATH=" + m.sdkDir.Symbolic() + ":" + m.sdkDir.Join("gen", "go").Symbolic(),
		"MOJO_DEVTOOLS=" + m.devtoolsDir.Symbolic(),
		"MOJO_SDK=" + m.sdkDir.Symbolic(),
		"MOJO_SHELL=" + m.shellDir.Join("mojo_shell").Symbolic(),
		"MOJO_SERVICES=" + m.shellDir.Symbolic(),
		"MOJO_SYSTEM_THUNKS=" + m.systemThunksDir.Join("libsystem_thunks.a").Symbolic(),
	})

	if m.platform == "android-arm" {
		seq.Call(func() error { return m.installAndroidPlatformTools(jirix, m.androidPlatformToolsDir.Abs(jirix)) }, "install android platform tools")
		target.Env.Vars = envvar.MergeSlices(target.Env.Vars, []string{
			"ANDROID_PLATFORM_TOOLS=" + m.androidPlatformToolsDir.Symbolic(),
			"MOJO_SHELL=" + m.shellDir.Join("MojoShell.apk").Symbolic(),
		})
	}

	if err := seq.Done(); err != nil {
		return err
	}

	target.InstallationDir = string(m.mojoInstDir)
	pdb.InstallProfile(m.profileInstaller, m.profileName, string(m.mojoRoot))
	return pdb.AddProfileTarget(m.profileInstaller, m.profileName, target)
}

// installAndroidPlatformTools installs the android platform tools in outDir.
func (m *Manager) installAndroidPlatformTools(jirix *jiri.X, outDir string) error {
	tmpDir, err := jirix.NewSeq().TempDir("", "")
	if err != nil {
		return err
	}
	defer jirix.NewSeq().RemoveAll(tmpDir)

	fn := func() error {
		androidPlatformToolsZipFile := filepath.Join(tmpDir, "platform-tools.zip")
		return jirix.NewSeq().
			Call(func() error {
				return profilesutil.Fetch(jirix, androidPlatformToolsZipFile, androidPlatformToolsUrl(m.spec.androidPlatformToolsVersion))
			}, "fetch android platform tools").
			Call(func() error { return profilesutil.Unzip(jirix, androidPlatformToolsZipFile, tmpDir) }, "unzip android platform tools").
			MkdirAll(filepath.Dir(outDir), profilesutil.DefaultDirPerm).
			Rename(filepath.Join(tmpDir, "platform-tools"), outDir).
			Done()
	}
	return profilesutil.AtomicAction(jirix, fn, outDir, "Install Android Platform Tools")
}

// installMojoNetworkService installs network_services.mojo into outDir.
func (m *Manager) installMojoNetworkService(jirix *jiri.X, outDir string) error {
	tmpDir, err := jirix.NewSeq().TempDir("", "")
	if err != nil {
		return err
	}
	defer jirix.NewSeq().RemoveAll(tmpDir)

	networkServiceUrl := mojoNetworkServiceUrl(m.platform, m.spec.networkServiceVersion)
	networkServiceZipFile := filepath.Join(tmpDir, "network_service.mojo.zip")
	tmpFile := filepath.Join(tmpDir, "network_service.mojo")
	outFile := filepath.Join(outDir, "network_service.mojo")

	return jirix.NewSeq().
		Call(func() error { return profilesutil.Fetch(jirix, networkServiceZipFile, networkServiceUrl) }, "fetch %s", networkServiceUrl).
		Call(func() error { return profilesutil.Unzip(jirix, networkServiceZipFile, tmpDir) }, "unzip network service").
		MkdirAll(filepath.Dir(outDir), profilesutil.DefaultDirPerm).
		Rename(tmpFile, outFile).
		Done()
}

// installMojoDevtools clones the mojo devtools repo into outDir.
func (m *Manager) installMojoDevtools(jirix *jiri.X, outDir string) error {
	fn := func() error {
		return jirix.NewSeq().
			MkdirAll(outDir, profilesutil.DefaultDirPerm).
			Pushd(outDir).
			Call(func() error { return gitutil.New(jirix.NewSeq()).CloneRecursive(mojoDevtoolsRemote, outDir) }, "git clone --recursive %s", mojoDevtoolsRemote).
			Call(func() error { return gitutil.New(jirix.NewSeq()).Reset(m.spec.devtoolsVersion) }, "git reset --hard %s", m.spec.devtoolsVersion).
			Popd().
			Done()
	}
	return profilesutil.AtomicAction(jirix, fn, outDir, "Install Mojo devtools")
}

// installMojoSdk clones the mojo_sdk repo into outDir/src/mojo/public.  It
// also generates .mojom.go files from the .mojom files.
func (m *Manager) installMojoSdk(jirix *jiri.X, outDir string) error {
	fn := func() error {
		seq := jirix.NewSeq()
		srcDir := filepath.Join(outDir, "src")
		// TODO(nlacasse): At some point Mojo needs to change the structure of
		// their repo so that go packages occur with correct paths. Until then
		// we'll clone into src/mojo/public so that go import paths work.
		publicDir := filepath.Join(srcDir, "mojo", "public")
		seq.
			MkdirAll(publicDir, profilesutil.DefaultDirPerm).
			Pushd(publicDir).
			Call(func() error { return gitutil.New(jirix.NewSeq()).CloneRecursive(mojoSdkRemote, publicDir) }, "git clone --recursive %s", mojoSdkRemote).
			Call(func() error { return gitutil.New(jirix.NewSeq()).Reset(m.spec.sdkVersion) }, "git reset --hard %s", m.spec.sdkVersion).
			Popd()

		// Download the authentication and network service mojom files.
		// TODO(nlacasse): This is a HACK.  The service mojom files are not
		// published anywhere yet, so we get them from the main mojo repo,
		// which we should not need to do.  Once they are published someplace
		// else, get them from there.
		tmpMojoCheckout, err := jirix.NewSeq().TempDir("", "")
		if err != nil {
			return err
		}
		defer jirix.NewSeq().RemoveAll(tmpMojoCheckout)

		seq.
			Pushd(tmpMojoCheckout).
			Call(func() error { return gitutil.New(jirix.NewSeq()).Clone(mojoRemote, tmpMojoCheckout) }, "git clone %s", mojoRemote).
			Call(func() error { return gitutil.New(jirix.NewSeq()).Reset(m.buildVersion) }, "git reset --hard %s", m.buildVersion).
			Popd()

		servicesSrc := filepath.Join(tmpMojoCheckout, "mojo", "services")
		servicesDir := filepath.Join(srcDir, "mojo", "services")
		seq.Rename(servicesSrc, servicesDir)

		// Generate mojom bindings.
		seq.Pushd(srcDir)

		// Fetch the mojom compiler.
		bindingsDir := filepath.Join(publicDir, "tools", "bindings")
		compilerDir := filepath.Join(bindingsDir, "mojom_tool", "bin")
		compilerName := "mojom"
		if _, err := os.Stat(compilerDir); os.IsNotExist(err) {
			// For an old versions < 8.
			compilerDir = filepath.Join(bindingsDir, "mojom_parser", "bin")
			compilerName = "mojom_parser"
		}
		fetchCompiler := func(arch string) error {
			hash, err := ioutil.ReadFile(filepath.Join(compilerDir, arch, compilerName+".sha1"))
			if err != nil {
				return err
			}
			binary := mojoCompilerUrl(arch, string(hash))
			return profilesutil.Fetch(jirix, filepath.Join(compilerDir, arch, compilerName), binary)
		}
		seq.
			Call(func() error { return fetchCompiler("linux64") }, "fetch linux64 mojom compiler").
			Chmod(filepath.Join(compilerDir, "linux64", compilerName), 0755).
			Call(func() error { return fetchCompiler("mac64") }, "fetch mac64 mojom compiler").
			Chmod(filepath.Join(compilerDir, "mac64", compilerName), 0755)

		// Find all .mojom files excluding ones for testing.
		var mojomFilesBuffer bytes.Buffer
		if err := jirix.NewSeq().Capture(&mojomFilesBuffer, nil).Last("find", srcDir, "-name", "*.mojom"); err != nil {
			return err
		}
		mojomFiles := strings.Split(strings.TrimSpace(mojomFilesBuffer.String()), "\n")

		genDir := filepath.Join(outDir, "gen")
		genMojomTool := filepath.Join(bindingsDir, "mojom_bindings_generator.py")
		for _, mojomFile := range mojomFiles {
			seq.Run(genMojomTool,
				"--use_bundled_pylibs",
				"--generate-type-info",
				"--no-gen-imports",
				"-d", ".",
				"-I", servicesDir,
				"-g", "go,java",
				"-o", genDir,
				mojomFile)
		}
		seq.Popd()
		return seq.Done()
	}

	return profilesutil.AtomicAction(jirix, fn, outDir, "Clone Mojo SDK repository")
}

// installMojoShellAndServices installs the mojo shell and all services into outDir.
func (m *Manager) installMojoShellAndServices(jirix *jiri.X, outDir string) error {
	tmpDir, err := jirix.NewSeq().TempDir("", "")
	if err != nil {
		return err
	}
	defer jirix.NewSeq().RemoveAll(tmpDir)

	fn := func() error {
		seq := jirix.NewSeq()
		seq.MkdirAll(outDir, profilesutil.DefaultDirPerm)

		// Install mojo shell.
		url := mojoShellUrl(m.platform, m.buildVersion)
		mojoShellZipFile := filepath.Join(tmpDir, "mojo_shell.zip")
		seq.
			Call(func() error { return profilesutil.Fetch(jirix, mojoShellZipFile, url) }, "fetch %s", url).
			Call(func() error { return profilesutil.Unzip(jirix, mojoShellZipFile, tmpDir) }, "unzip %s", mojoShellZipFile)

		files := []string{"mojo_shell", "mojo_shell_child"}
		if m.platform == "android-arm" {
			// On android, mojo shell is called "MojoShell.apk".
			files = []string{"MojoShell.apk"}
		}
		for _, file := range files {
			tmpFile := filepath.Join(tmpDir, file)
			outFile := filepath.Join(outDir, file)
			seq.Rename(tmpFile, outFile)
		}

		// Install the network services.
		seq.Call(func() error {
			return m.installMojoNetworkService(jirix, outDir)
		}, "install mojo network service")

		// Install all other services.
		serviceNames := m.spec.serviceNames
		if m.platform == "android-arm" {
			serviceNames = append(serviceNames, m.spec.serviceNamesAndroid...)
		}
		if m.platform == "linux-x64" {
			serviceNames = append(serviceNames, m.spec.serviceNamesLinux...)
		}
		for _, serviceName := range serviceNames {
			outFile := filepath.Join(outDir, serviceName)
			serviceUrl := mojoServiceUrl(m.platform, serviceName, m.buildVersion)
			seq.Call(func() error { return profilesutil.Fetch(jirix, outFile, serviceUrl) }, "fetch %s", serviceUrl)
		}
		return seq.Done()
	}

	return profilesutil.AtomicAction(jirix, fn, outDir, "install mojo_shell")
}

// installMojoSystemThunks installs the mojo system thunks lib into outDir.
func (m *Manager) installMojoSystemThunks(jirix *jiri.X, outDir string) error {
	fn := func() error {
		outFile := filepath.Join(outDir, "libsystem_thunks.a")
		return jirix.NewSeq().MkdirAll(outDir, profilesutil.DefaultDirPerm).
			Call(func() error {
				return profilesutil.Fetch(jirix, outFile, mojoSystemThunksUrl(m.platform, m.buildVersion))
			}, "fetch mojo system thunks").Done()
	}
	return profilesutil.AtomicAction(jirix, fn, outDir, "Download Mojo system thunks")
}

func (m *Manager) Uninstall(jirix *jiri.X, pdb *profiles.DB, root jiri.RelPath, target profiles.Target) error {
	// TODO(nlacasse): What should we do with all the installed artifacts?
	// They could be used by other profile versions, so deleting them does not
	// make sense.  Should we check that they are only used by this profile
	// before deleting?
	pdb.RemoveProfileTarget(m.profileInstaller, m.profileName, target)
	return nil
}

// androidPlatformToolsUrl returns the url of the android platform tools zip
// file for the given version.
func androidPlatformToolsUrl(version string) string {
	return fmt.Sprintf("http://tools.android.com/download/sdk-repo-linux-platform-tools-%s.zip", version)
}

// mojoNetworkServiceUrl returns the url for the network service for the given
// platform and git revision.
func mojoNetworkServiceUrl(platform, gitRevision string) string {
	return mojoStorageBucket + fmt.Sprintf("/network_service/%s/%s/network_service.mojo.zip", gitRevision, platform)
}

// mojoServiceUrl returns the url for the service for the given platform, name,
// and git revision.
func mojoServiceUrl(platform, name, gitRevision string) string {
	return mojoStorageBucket + fmt.Sprintf("/services/%s/%s/%s", platform, gitRevision, name)
}

// mojoShellUrl returns the url for the mojo shell binary given platform and
// git revision.
func mojoShellUrl(platform, gitRevision string) string {
	return mojoStorageBucket + fmt.Sprintf("/shell/%s/%s.zip", gitRevision, platform)
}

// mojoSystemThunksUrl returns the url for the mojo system thunks binary for the
// given platform and git revision.
func mojoSystemThunksUrl(platform, gitRevision string) string {
	return mojoStorageBucket + fmt.Sprintf("/system_thunks/%s/%s/libsystem_thunks.a", platform, gitRevision)
}

func mojoCompilerUrl(platform string, sha1 string) string {
	return mojoStorageBucket + fmt.Sprintf("/mojom_parser/%s/%s", platform, sha1)
}
