// Copyright 2015 The Go 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 main

import (
	"bytes"
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
)

var cmdVersion = &command{
	run:   runVersion,
	Name:  "version",
	Usage: "",
	Short: "print version",
	Long: `
Version prints versions of the gomobile binary and tools
`,
}

func runVersion(cmd *command) (err error) {
	// Check this binary matches the version in golang.org/x/mobile/cmd/gomobile
	// source code in GOPATH. If they don't match, currently there is no
	// way to reliably identify the revision number this binary was built
	// against.
	version, err := func() (string, error) {
		bin, err := exec.LookPath(os.Args[0])
		if err != nil {
			return "", err
		}
		bindir := filepath.Dir(bin)
		cmd := exec.Command("go", "install", "-x", "-n", "golang.org/x/mobile/cmd/gomobile")
		cmd.Env = append(os.Environ(), "GOBIN="+bindir)
		out, err := cmd.CombinedOutput()
		if err != nil {
			return "", fmt.Errorf("cannot test gomobile binary: %v, %s", err, out)
		}
		if len(out) != 0 {
			return "", fmt.Errorf("binary is out of date, re-install it")
		}
		return mobileRepoRevision()
	}()
	if err != nil {
		fmt.Printf("gomobile version unknown: %v\n", err)
		return nil
	}

	// Supported platforms
	platforms := "android"
	if xcodeAvailable() {
		platforms = "android,ios"
	}

	// ANDROID_HOME, sdk build tool version
	androidapi, _ := androidAPIPath()

	fmt.Printf("gomobile version %s (%s); androidSDK=%s\n", version, platforms, androidapi)
	return nil
}

func mobileRepoRevision() (rev string, err error) {
	b, err := exec.Command("go", "list", "-f", "{{.Dir}}", "golang.org/x/mobile/app").CombinedOutput()
	if err != nil {
		return "", fmt.Errorf("mobile repo not found: %v, %s", err, b)
	}

	repo := filepath.Dir(string(b))
	if err := os.Chdir(repo); err != nil {
		return "", fmt.Errorf("mobile repo %q not accessible: %v", repo, err)
	}
	revision, err := exec.Command("git", "log", "-n", "1", "--format=format: +%h %cd", "HEAD").CombinedOutput()
	if err != nil {
		return "", fmt.Errorf("mobile repo git log failed: %v, %s", err, revision)
	}
	return string(bytes.Trim(revision, " \t\r\n")), nil
}
