package commands

import (
	"errors"
	"fmt"
	"io"

	"github.com/jbenet/go-ipfs/core"
	u "github.com/jbenet/go-ipfs/util"

	nsys "github.com/jbenet/go-ipfs/namesys"
)

func Publish(n *core.IpfsNode, args []string, opts map[string]interface{}, out io.Writer) error {
	log.Debug("Begin Publish")

	if n.Identity == nil {
		return errors.New("Identity not loaded!")
	}

	// name := ""
	ref := ""

	switch len(args) {
	case 2:
		// name = args[0]
		ref = args[1]
		return errors.New("keychains not yet implemented")
	case 1:
		// name = n.Identity.ID.String()
		ref = args[0]

	default:
		return fmt.Errorf("Publish expects 1 or 2 args; got %d.", len(args))
	}

	// later, n.Keychain.Get(name).PrivKey
	k := n.Identity.PrivKey()

	pub := nsys.NewRoutingPublisher(n.Routing)
	err := pub.Publish(k, ref)
	if err != nil {
		return err
	}

	hash, err := k.GetPublic().Hash()
	if err != nil {
		return err
	}
	fmt.Fprintf(out, "published name %s to %s\n", u.Key(hash), ref)

	return nil
}
