package main

import (
	"fmt"

	"github.com/spf13/cobra"
)

func init() {
	rootCmd.AddCommand(generateCmd)
	generateCmd.Flags().StringVarP(&generateFlagName, "name", "l", "", "specify signet name/label")
	generateCmd.Flags().StringVarP(&generateFlagScheme, "scheme", "t", "", "specify signet scheme/tool")
	generateCmd.Flags().BoolVarP(&generateFlagTextOnly, "textonly", "", false, "do not save to trust store and only output directly as text")
}

var (
	generateFlagName     string
	generateFlagScheme   string
	generateFlagTextOnly bool

	generateCmd = &cobra.Command{
		Use:                   "generate",
		Short:                 "generate a new signet",
		DisableFlagsInUseLine: true,
		Args:                  cobra.NoArgs,
		PreRunE:               requireTrustStore,
		RunE: func(cmd *cobra.Command, args []string) error {
			// Generate new signet
			signet, err := newSignet(generateFlagName, generateFlagScheme, !generateFlagTextOnly)
			if err != nil {
				return err
			}

			// Output as text if not saved to trust store.
			if generateFlagTextOnly {
				// Make text backup.
				backup, err := signet.Backup(false)
				if err != nil {
					return err
				}

				// Convert to recipient and serialize key.
				rcpt, err := signet.AsRecipient()
				if err != nil {
					return err
				}
				err = rcpt.StoreKey()
				if err != nil {
					return err
				}

				// Make text export.
				export, err := rcpt.Export(false)
				if err != nil {
					return err
				}

				// Write output.
				fmt.Printf("Generated %s key with ID %s and name %q\n", signet.Scheme, signet.ID, signet.Info.Name)
				fmt.Printf("Backup (private key): %s\n", backup)
				fmt.Printf("Export (public key): %s\n", export)
			}

			return nil
		},
	}
)