package parser

import (
	docopt "github.com/docopt/docopt-go"
	"github.com/drycc/workflow-cli/cmd"
)

// Timeouts routes timeouts commands to their specific function
func Timeouts(argv []string, cmdr cmd.Commander) error {
	usage := `
Valid commands for timeouts:

timeouts:list        list resource timeouts for an app
timeouts:set         set resource timeouts for an app
timeouts:unset       unset resource timeouts for an app

Use 'drycc help [command]' to learn more.
`

	switch argv[0] {
	case "timeouts:list":
		return timeoutList(argv, cmdr)
	case "timeouts:set":
		return timeoutSet(argv, cmdr)
	case "timeouts:unset":
		return timeoutUnset(argv, cmdr)
	default:
		if printHelp(argv, usage) {
			return nil
		}

		if argv[0] == "timeouts" {
			argv[0] = "timeouts:list"
			return timeoutList(argv, cmdr)
		}

		PrintUsage(cmdr)
		return nil
	}
}

func timeoutList(argv []string, cmdr cmd.Commander) error {
	usage := `
Lists resource timeouts for an application.

Usage: drycc timeouts:list [options]

Options:
  -a --app=<app>
    the uniquely identifiable name of the application.
`

	args, err := docopt.Parse(usage, argv, true, "", false, true)

	if err != nil {
		return err
	}

	return cmdr.TimeoutsList(safeGetValue(args, "--app"))
}

func timeoutSet(argv []string, cmdr cmd.Commander) error {
	usage := `
Sets termination grace period for an application.

Usage: drycc timeouts:set [options] <type>=<value>...

Arguments:
  <type>
    the process type as defined in your Procfile, such as 'web' or 'worker'.
    Note that Dockerfile apps have a default 'cmd' process type.
  <value>
    The value to apply to the process type in seconds.

Options:
  -a --app=<app>
    the uniquely identifiable name for the application.
`

	args, err := docopt.Parse(usage, argv, true, "", false, true)

	if err != nil {
		return err
	}

	app := safeGetValue(args, "--app")
	timeouts := args["<type>=<value>"].([]string)

	return cmdr.TimeoutsSet(app, timeouts)
}

func timeoutUnset(argv []string, cmdr cmd.Commander) error {
	usage := `
Unsets timeouts for an application. Default value (30s)
or KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS is used

Usage: drycc timeouts:unset [options] <type>...

Arguments:
  <type>
    the process type as defined in your Procfile, such as 'web' or 'worker'.
    Note that Dockerfile apps have a default 'cmd' process type.

Options:
  -a --app=<app>
    the uniquely identifiable name for the application.
`

	args, err := docopt.Parse(usage, argv, true, "", false, true)

	if err != nil {
		return err
	}

	app := safeGetValue(args, "--app")
	timeouts := args["<type>"].([]string)

	return cmdr.TimeoutsUnset(app, timeouts)
}
