package internal

import (
	"github.com/urfave/cli/v2"
)

// Secrets stores the variable from SecretsFlag
var Secrets bool

// SecretsFlag turns on/off automatically generating secrets
var SecretsFlag = &cli.BoolFlag{
	Name:        "secrets",
	Aliases:     []string{"S"},
	Value:       false,
	Usage:       "Automatically generate secrets",
	Destination: &Secrets,
}

// Pass stores the variable from PassFlag
var Pass bool

// PassFlag turns on/off storing generated secrets in pass
var PassFlag = &cli.BoolFlag{
	Name:        "pass",
	Aliases:     []string{"P"},
	Value:       false,
	Usage:       "Store the generated secrets in a local pass store",
	Destination: &Pass,
}

// Context is temp
var Context string

// ContextFlag is temp
var ContextFlag = &cli.StringFlag{
	Name:        "context",
	Value:       "",
	Aliases:     []string{"c"},
	Destination: &Context,
}

// Force force functionality without asking.
var Force bool

// ForceFlag turns on/off force functionality.
var ForceFlag = &cli.BoolFlag{
	Name:        "force",
	Value:       false,
	Aliases:     []string{"f"},
	Destination: &Force,
}

// Chaos engages chaos mode.
var Chaos bool

// ChaosFlag turns on/off chaos functionality.
var ChaosFlag = &cli.BoolFlag{
	Name:        "chaos",
	Value:       false,
	Aliases:     []string{"ch"},
	Usage:       "Deploy uncommitted recipes changes. Use with care!",
	Destination: &Chaos,
}

// DNSProvider specifies a DNS provider.
var DNSProvider string

// DNSProviderFlag selects a DNS provider.
var DNSProviderFlag = &cli.StringFlag{
	Name:        "provider",
	Value:       "",
	Aliases:     []string{"p"},
	Usage:       "DNS provider",
	Destination: &DNSProvider,
}

var NoInput bool
var NoInputFlag = &cli.BoolFlag{
	Name:        "no-input",
	Value:       false,
	Aliases:     []string{"n"},
	Usage:       "Toggle non-interactive mode",
	Destination: &NoInput,
}

var DNSType string

var DNSTypeFlag = &cli.StringFlag{
	Name:        "type",
	Value:       "",
	Aliases:     []string{"t"},
	Usage:       "Domain name record type (e.g. A)",
	Destination: &DNSType,
}

var DNSName string

var DNSNameFlag = &cli.StringFlag{
	Name:        "name",
	Value:       "",
	Aliases:     []string{"n"},
	Usage:       "Domain name record name (e.g. mysubdomain)",
	Destination: &DNSName,
}

var DNSValue string

var DNSValueFlag = &cli.StringFlag{
	Name:        "value",
	Value:       "",
	Aliases:     []string{"v"},
	Usage:       "Domain name record value (e.g. 192.168.1.1)",
	Destination: &DNSValue,
}

var DNSTTL int

var DNSTTLFlag = &cli.IntFlag{
	Name:        "ttl",
	Value:       86400,
	Aliases:     []string{"T"},
	Usage:       "Domain name TTL value)",
	Destination: &DNSTTL,
}

var DNSPriority int

var DNSPriorityFlag = &cli.IntFlag{
	Name:        "priority",
	Value:       10,
	Aliases:     []string{"P"},
	Usage:       "Domain name priority value",
	Destination: &DNSPriority,
}

var ServerProvider string

var ServerProviderFlag = &cli.StringFlag{
	Name:        "provider",
	Aliases:     []string{"p"},
	Usage:       "3rd party server provider",
	Destination: &ServerProvider,
}

var CapsulInstanceURL string

var CapsulInstanceURLFlag = &cli.StringFlag{
	Name:        "capsul-url",
	Value:       "yolo.servers.coop",
	Aliases:     []string{"cu"},
	Usage:       "capsul instance URL",
	Destination: &CapsulInstanceURL,
}

var CapsulName string

var CapsulNameFlag = &cli.StringFlag{
	Name:        "capsul-name",
	Value:       "",
	Aliases:     []string{"cn"},
	Usage:       "capsul name",
	Destination: &CapsulName,
}

var CapsulType string

var CapsulTypeFlag = &cli.StringFlag{
	Name:        "capsul-type",
	Value:       "f1-xs",
	Aliases:     []string{"ct"},
	Usage:       "capsul type",
	Destination: &CapsulType,
}

var CapsulImage string

var CapsulImageFlag = &cli.StringFlag{
	Name:        "capsul-image",
	Value:       "debian10",
	Aliases:     []string{"ci"},
	Usage:       "capsul image",
	Destination: &CapsulImage,
}

var CapsulSSHKeys cli.StringSlice

var CapsulSSHKeysFlag = &cli.StringSliceFlag{
	Name:        "capsul-ssh-keys",
	Aliases:     []string{"cs"},
	Usage:       "capsul SSH key",
	Destination: &CapsulSSHKeys,
}

var CapsulAPIToken string

var CapsulAPITokenFlag = &cli.StringFlag{
	Name:        "capsul-token",
	Aliases:     []string{"ca"},
	Usage:       "capsul API token",
	EnvVars:     []string{"CAPSUL_TOKEN"},
	Destination: &CapsulAPIToken,
}

var HetznerCloudName string

var HetznerCloudNameFlag = &cli.StringFlag{
	Name:        "hetzner-name",
	Value:       "",
	Aliases:     []string{"hn"},
	Usage:       "hetzner cloud name",
	Destination: &HetznerCloudName,
}

var HetznerCloudType string

var HetznerCloudTypeFlag = &cli.StringFlag{
	Name:        "hetzner-type",
	Aliases:     []string{"ht"},
	Usage:       "hetzner cloud type",
	Destination: &HetznerCloudType,
	Value:       "cx11",
}

var HetznerCloudImage string

var HetznerCloudImageFlag = &cli.StringFlag{
	Name:        "hetzner-image",
	Aliases:     []string{"hi"},
	Usage:       "hetzner cloud image",
	Value:       "debian-10",
	Destination: &HetznerCloudImage,
}

var HetznerCloudSSHKeys cli.StringSlice

var HetznerCloudSSHKeysFlag = &cli.StringSliceFlag{
	Name:        "hetzner-ssh-keys",
	Aliases:     []string{"hs"},
	Usage:       "hetzner cloud SSH keys (e.g. me@foo.com)",
	Destination: &HetznerCloudSSHKeys,
}

var HetznerCloudLocation string

var HetznerCloudLocationFlag = &cli.StringFlag{
	Name:        "hetzner-location",
	Aliases:     []string{"hl"},
	Usage:       "hetzner cloud server location",
	Value:       "hel1",
	Destination: &HetznerCloudLocation,
}

var HetznerCloudAPIToken string

var HetznerCloudAPITokenFlag = &cli.StringFlag{
	Name:        "hetzner-token",
	Aliases:     []string{"ha"},
	Usage:       "hetzner cloud API token",
	EnvVars:     []string{"HCLOUD_TOKEN"},
	Destination: &HetznerCloudAPIToken,
}

// Debug stores the variable from DebugFlag.
var Debug bool

// DebugFlag turns on/off verbose logging down to the DEBUG level.
var DebugFlag = &cli.BoolFlag{
	Name:        "debug",
	Aliases:     []string{"d"},
	Value:       false,
	Destination: &Debug,
	Usage:       "Show DEBUG messages",
}

// SSHFailMsg is a hopefully helpful SSH failure message
var SSHFailMsg = `
Woops, Abra is unable to connect to connect to %s.

Here are a few tips for debugging your local SSH config. Abra uses plain 'ol
SSH to make connections to servers, so if your SSH config is working, Abra is
working.

In the first place, Abra will always try to read your Docker context connection
string for SSH connection details. You can view your server context configs
with the following command. Are they correct?

    abra server ls

Is your ssh-agent running? You can start it by running the following command:

    eval "$(ssh-agent)"

If your SSH private key loaded? You can check by running the following command:

    ssh-add -L

If you are using a non-default public/private key, you can configure this in
your ~/.ssh/config file which Abra will read in order to figure out connection
details:

Host foo.coopcloud.tech
  Hostname foo.coopcloud.tech
  User bar
  Port 12345
  IdentityFile ~/.ssh/bar@foo.coopcloud.tech

If you're only using password authentication, you can use the following config:

Host foo.coopcloud.tech
  Hostname foo.coopcloud.tech
  User bar
  Port 12345
  PreferredAuthentications=password
  PubkeyAuthentication=no

Good luck!

`