package codespace

import (
	codespacesAPI "github.com/cli/cli/v2/internal/codespaces/api"

	"github.com/cli/cli/v2/pkg/cmdutil"
	"github.com/spf13/cobra"
)

type ghExecutable struct {
	executablePath string
}

func (e *ghExecutable) Executable() string {
	return e.executablePath
}

func NewCmdCodespace(f *cmdutil.Factory) *cobra.Command {
	root := &cobra.Command{
		Use:     "codespace",
		Short:   "Connect to and manage codespaces",
		Aliases: []string{"cs"},
		GroupID: "core",
	}

	app := NewApp(
		f.IOStreams,
		&ghExecutable{executablePath: f.ExecutablePath},
		codespacesAPI.New(f),
		f.Browser,
		f.Remotes,
	)

	root.AddCommand(newCodeCmd(app))
	root.AddCommand(newCreateCmd(app))
	root.AddCommand(newEditCmd(app))
	root.AddCommand(newDeleteCmd(app))
	root.AddCommand(newJupyterCmd(app))
	root.AddCommand(newListCmd(app))
	root.AddCommand(newViewCmd(app))
	root.AddCommand(newLogsCmd(app))
	root.AddCommand(newPortsCmd(app))
	root.AddCommand(newSSHCmd(app))
	root.AddCommand(newCpCmd(app))
	root.AddCommand(newStopCmd(app))
	root.AddCommand(newSelectCmd(app))
	root.AddCommand(newRebuildCmd(app))

	return root
}
