package main

import (
	"fmt"

	"veyron.io/lib/cmdline"
	"veyron.io/veyron/veyron/services/mgmt/lib/binary"
)

var cmdDelete = &cmdline.Command{
	Run:      runDelete,
	Name:     "delete",
	Short:    "Delete a binary",
	Long:     "Delete connects to the binary repository and deletes the specified binary",
	ArgsName: "<von>",
	ArgsLong: "<von> is the veyron object name of the binary to delete",
}

func runDelete(cmd *cmdline.Command, args []string) error {
	if expected, got := 1, len(args); expected != got {
		return cmd.UsageErrorf("delete: incorrect number of arguments, expected %d, got %d", expected, got)
	}
	von := args[0]
	if err := binary.Delete(runtime.NewContext(), von); err != nil {
		return err
	}
	fmt.Fprintf(cmd.Stdout(), "Binary deleted successfully\n")
	return nil
}

var cmdDownload = &cmdline.Command{
	Run:   runDownload,
	Name:  "download",
	Short: "Download a binary",
	Long: `
Download connects to the binary repository, downloads the specified binary, and
writes it to a file.
`,
	ArgsName: "<von> <filename>",
	ArgsLong: `
<von> is the veyron object name of the binary to download
<filename> is the name of the file where the binary will be written
`,
}

func runDownload(cmd *cmdline.Command, args []string) error {
	if expected, got := 2, len(args); expected != got {
		return cmd.UsageErrorf("download: incorrect number of arguments, expected %d, got %d", expected, got)
	}
	von, filename := args[0], args[1]
	if err := binary.DownloadToFile(runtime.NewContext(), von, filename); err != nil {
		return err
	}
	fmt.Fprintf(cmd.Stdout(), "Binary downloaded to file %s\n", filename)
	return nil
}

var cmdUpload = &cmdline.Command{
	Run:   runUpload,
	Name:  "upload",
	Short: "Upload a binary",
	Long: `
Upload connects to the binary repository and uploads the binary of the specified
file. When successful, it writes the name of the new binary to stdout.
`,
	ArgsName: "<von> <filename>",
	ArgsLong: `
<von> is the veyron object name of the binary to upload
<filename> is the name of the file to upload
`,
}

func runUpload(cmd *cmdline.Command, args []string) error {
	// TODO(rthellend): Add support for creating packages on the fly.
	if expected, got := 2, len(args); expected != got {
		return cmd.UsageErrorf("upload: incorrect number of arguments, expected %d, got %d", expected, got)
	}
	von, filename := args[0], args[1]
	if err := binary.UploadFromFile(runtime.NewContext(), von, filename); err != nil {
		return err
	}
	fmt.Fprintf(cmd.Stdout(), "Binary uploaded from file %s\n", filename)
	return nil
}

var cmdURL = &cmdline.Command{
	Run:      runURL,
	Name:     "url",
	Short:    "Fetch a download URL",
	Long:     "Connect to the binary repository and fetch the download URL for the given veyron object name.",
	ArgsName: "<von>",
	ArgsLong: "<von> is the veyron object name of the binary repository",
}

func runURL(cmd *cmdline.Command, args []string) error {
	if expected, got := 1, len(args); expected != got {
		return cmd.UsageErrorf("rooturl: incorrect number of arguments, expected %d, got %d", expected, got)
	}
	von := args[0]
	url, _, err := binary.DownloadURL(runtime.NewContext(), von)
	if err != nil {
		return err
	}
	fmt.Fprintf(cmd.Stdout(), "%v\n", url)
	return nil
}

func root() *cmdline.Command {
	return &cmdline.Command{
		Name:  "binary",
		Short: "Tool for interacting with the veyron binary repository",
		Long: `
The binary tool facilitates interaction with the veyron binary repository.
`,
		Children: []*cmdline.Command{cmdDelete, cmdDownload, cmdUpload, cmdURL},
	}
}
