package impl

import (
	"fmt"

	"veyron/lib/cmdline"

	"veyron2/rt"
	"veyron2/services/proximity"
)

var cmdRegister = &cmdline.Command{
	Run:      runRegister,
	Name:     "register",
	Short:    "register adds a name that the remote device will be associated with.",
	Long:     "register adds a name that the remote device will be associated with.",
	ArgsName: "<address> <name>",
	ArgsLong: `
<address> is the object name of the proximity server.
<name> is the name to register.
`,
}

func runRegister(cmd *cmdline.Command, args []string) error {
	if expected, got := 2, len(args); expected != got {
		return cmd.Errorf("register: incorrect number of arguments, expected %d, got %d", expected, got)
	}
	p, err := proximity.BindProximity(args[0])
	if err != nil {
		return fmt.Errorf("bind error: %v", err)
	}
	if err = p.RegisterName(rt.R().TODOContext(), args[1]); err != nil {
		return err
	}
	fmt.Fprintf(cmd.Stdout(), "Name registered successfully\n")
	return nil
}

var cmdUnregister = &cmdline.Command{
	Run:      runUnregister,
	Name:     "unregister",
	Short:    "unregister removes a name that the remote device it is associated with.",
	Long:     "unregister removes a name that the remote device it is associated with.",
	ArgsName: "<address> <name>",
	ArgsLong: `
<address> is the object name of the proximity server.
<name> is the name to unregister.
`,
}

func runUnregister(cmd *cmdline.Command, args []string) error {
	if expected, got := 2, len(args); expected != got {
		return cmd.Errorf("unregister: incorrect number of arguments, expected %d, got %d", expected, got)
	}
	p, err := proximity.BindProximity(args[0])
	if err != nil {
		return fmt.Errorf("bind error: %v", err)
	}
	if err = p.UnregisterName(rt.R().TODOContext(), args[1]); err != nil {
		return err
	}
	fmt.Fprintf(cmd.Stdout(), "Name unregistered successfully\n")
	return nil
}

var cmdNearbyDevices = &cmdline.Command{
	Run:      runNearbyDevices,
	Name:     "nearbydevices",
	Short:    "nearbydevices displayes the most up-to-date list of nearby devices.",
	Long:     "nearbydevices displayes the most up-to-date list of nearby devices.",
	ArgsName: "<address>",
	ArgsLong: "<address> is the object name of the proximity server.",
}

func runNearbyDevices(cmd *cmdline.Command, args []string) error {
	if expected, got := 1, len(args); expected != got {
		return cmd.Errorf("download: incorrect number of arguments, expected %d, got %d", expected, got)
	}

	p, err := proximity.BindProximity(args[0])
	if err != nil {
		return fmt.Errorf("bind error: %v", err)
	}

	devices, err := p.NearbyDevices(rt.R().TODOContext())
	if err != nil {
		return err
	}

	fmt.Fprintf(cmd.Stdout(), "Nearby Devices:\n")
	if len(devices) == 0 {
		fmt.Fprintf(cmd.Stdout(), "None\n")
		return nil
	}

	for i, d := range devices {
		fmt.Fprintf(cmd.Stdout(), "%d: MAC=%s Names=%v Distance=%s\n", i, d.MAC, d.Names, d.Distance)
	}
	return nil
}

func Root() *cmdline.Command {
	return &cmdline.Command{
		Name:     "proximity",
		Short:    "Command-line tool for interacting with the Veyron proximity server",
		Long:     "Command-line tool for interacting with the Veyron proximity server",
		Children: []*cmdline.Command{cmdRegister, cmdUnregister, cmdNearbyDevices},
	}
}
