package cli

import (
	"fmt"

	"github.com/schultz-is/passgen"
	"github.com/urfave/cli/v2"
)

var appNewCommand = &cli.Command{
	Name: "new",
	Flags: []cli.Flag{
		ServerFlag,
		DomainFlag,
		AppNameFlag,
		PassFlag,
		SecretsFlag,
	},
}
var appDeployCommand = &cli.Command{
	Name: "deploy",
	Flags: []cli.Flag{
		UpdateFlag,
		ForceFlag,
		SkipVersionCheckFlag,
		NoDomainPollFlag,
	},
}
var appUndeployCommand = &cli.Command{
	Name: "undeploy",
}
var appBackupCommand = &cli.Command{
	Name:  "backup",
	Flags: []cli.Flag{AllFlag},
}
var appRestoreCommand = &cli.Command{
	Name:      "restore",
	Flags:     []cli.Flag{AllFlag},
	ArgsUsage: "<service> [<backup file>]",
}
var appListCommand = &cli.Command{
	Name:    "list",
	Aliases: []string{"ls"},
	Flags:   []cli.Flag{StatusFlag, ServerFlag, TypeFlag},
}
var appCheckCommand = &cli.Command{
	Name: "check",
}
var appCpCommand = &cli.Command{
	Name:      "cp",
	ArgsUsage: "<src> <dst>",
}
var appConfigCommand = &cli.Command{
	Name: "config",
}
var appLogsCommand = &cli.Command{
	Name:      "logs",
	ArgsUsage: "[<service>]",
}

var appPsCommand = &cli.Command{
	Name: "ps",
}
var appRemoveCommand = &cli.Command{
	Name:  "remove",
	Flags: []cli.Flag{VolumesFlag, SecretsFlag},
}
var appRunCommand = &cli.Command{
	Name: "run",
	Flags: []cli.Flag{
		NoTTYFlag,
		UserFlag,
	},
	ArgsUsage: "<service> <args>...",
}

var appRollbackCommand = &cli.Command{
	Name:      "rollback",
	ArgsUsage: "[<version>]",
}

// TODO: Replicating what the bash abra does might be hard
// with the mix of subcommands and flags
var appSecretCommand = &cli.Command{
	Name:  "secret",
	Flags: []cli.Flag{AllFlag, PassFlag},
	Action: func(c *cli.Context) error {
		passwords, err := passgen.GeneratePassphrases(
			1,
			passgen.PassphraseWordCountDefault,
			rune('-'),
			passgen.PassphraseCasingDefault,
			passgen.WordListDefault,
		)
		if err != nil {
			panic(err)
		}

		for _, password := range passwords {
			fmt.Println(password)
		}
		return nil
	},
}

var AppCommand = &cli.Command{
	Name:     "app",
	HideHelp: true,
	Subcommands: []*cli.Command{
		appNewCommand,
		appConfigCommand,
		appDeployCommand,
		appUndeployCommand,
		appBackupCommand,
		appRestoreCommand,
		appRemoveCommand,
		appCheckCommand,
		appListCommand,
		appPsCommand,
		appLogsCommand,
		appCpCommand,
		appRunCommand,
		appRollbackCommand,
		appSecretCommand,
	},
}