package main

import (
	"flag"
	"fmt"
	"go/build"
	"log"
	"os"
	"path/filepath"
	"strings"
)

var fs = flag.NewFlagSet(os.Args[0], flag.ContinueOnError)

func init() {
	fs.Usage = func() {}
}

type Command struct {
	Name      string
	UsageLine string
	Short     string
	Long      string
	Run       func(args []string) error
	AddFlags  func(fs *flag.FlagSet)
}

var commands = []*Command{
	cmdFetch,
	cmdRestore,
	cmdUpdate,
	cmdList,
	cmdDelete,
}

func main() {
	args := os.Args[1:]

	switch {
	case len(args) < 1, args[0] == "-h", args[0] == "-help":
		printUsage(os.Stdout)
		os.Exit(0)
	case args[0] == "help":
		help(args[1:])
		return
	case args[0] == "rebuild":
		// rebuild was renamed restore, alias for backwards compatibility
		args[0] = "restore"
	}

	for _, command := range commands {
		if command.Name == args[0] {

			// add extra flags if necessary
			if command.AddFlags != nil {
				command.AddFlags(fs)
			}

			if err := fs.Parse(args[1:]); err != nil {
				if err == flag.ErrHelp {
					help(args[:1])
					os.Exit(0)
				}
				fmt.Fprint(os.Stderr, "\n")
				help(args[:1])
				os.Exit(3)
			}

			if err := command.Run(fs.Args()); err != nil {
				log.Fatalf("command %q failed: %v", command.Name, err)
			}
			if err := GlobalDownloader.Flush(); err != nil {
				log.Fatalf("failed to delete tempdirs: %v", err)
			}
			return
		}
	}
	fmt.Fprintf(os.Stderr, "unknown command: %q\n\n", args[0])
	printUsage(os.Stderr)
	os.Exit(3)
}

var (
	vendorDir, manifestFile string
	importPath              string
)

func init() {
	wd, err := os.Getwd()
	if err != nil {
		log.Fatal(err)
	}
	vendorDir = filepath.Join(wd, "vendor")
	manifestFile = filepath.Join(vendorDir, "manifest")
	var srcTree []string
	for _, p := range filepath.SplitList(build.Default.GOPATH) {
		srcTree = append(srcTree, filepath.Join(p, "src")+string(filepath.Separator))
	}

	var pathMismatch int
	for _, p := range srcTree {
		if !strings.HasPrefix(wd, p) && wd != p[:len(p)-1] {
			pathMismatch++
			continue
		}
		importPath = filepath.ToSlash(strings.TrimPrefix(wd, p))
		break
	}
	if build.Default.GOPATH == "" || len(srcTree) == pathMismatch {
		log.Println("WARNING: for go vendoring to work your project needs to be somewhere under $GOPATH/src/")
	}
}
