package diagnostics

import (
	v1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

type Collect struct {
	ClusterInfo      *clusterInfo      `json:"clusterInfo,omitempty"`
	ClusterResources *clusterResources `json:"clusterResources,omitempty"`
	Secret           *secret           `json:"secret,omitempty"`
	Logs             *logs             `json:"logs,omitempty"`
	Data             *data             `json:"data,omitempty"`
	CopyFromHost     *copyFromHost     `json:"copyFromHost,omitempty"`
	Exec             *exec             `json:"exec,omitempty"`
	RunPod           *runPod           `json:"runPod,omitempty"`
	Run              *Run              `json:"run,omitempty"`
	RunDaemonSet     *RunDaemonSet     `json:"runDaemonSet,omitempty"`
}

type clusterResources struct {
	collectorMeta `json:",inline"`
}

type secret struct {
	collectorMeta `json:",inline"`
	SecretName    string `json:"name"`
	Namespace     string `json:"namespace,omitempty"`
	Key           string `json:"key,omitempty"`
	IncludeValue  bool   `json:"includeValue,omitempty"`
}

type clusterInfo struct {
	collectorMeta `json:",inline"`
}

type logLimits struct {
	MaxAge    string `json:"maxAge,omitempty"`
	MaxLines  int64  `json:"maxLines,omitempty"`
	SinceTime metav1.Time
}

type logs struct {
	collectorMeta  `json:",inline" yaml:",inline"`
	Name           string     `json:"name,omitempty"`
	Selector       []string   `json:"selector"`
	Namespace      string     `json:"namespace,omitempty"`
	ContainerNames []string   `json:"containerNames,omitempty"`
	Limits         *logLimits `json:"limits,omitempty"`
}

type data struct {
	Name string `json:"name,omitempty"`
	Data string `json:"data,omitempty"`
}

type copyFromHost struct {
	collectorMeta   `json:",inline"`
	Name            string            `json:"name,omitempty"`
	Namespace       string            `json:"namespace"`
	Image           string            `json:"image"`
	ImagePullPolicy string            `json:"imagePullPolicy,omitempty"`
	ImagePullSecret *imagePullSecrets `json:"imagePullSecret,omitempty"`
	Timeout         string            `json:"timeout,omitempty"`
	HostPath        string            `json:"hostPath"`
	ExtractArchive  bool              `json:"extractArchive,omitempty"`
}

type exec struct {
	collectorMeta `json:",inline"`
	Name          string   `json:"name,omitempty"`
	Selector      []string `json:"selector"`
	Namespace     string   `json:"namespace"`
	ContainerName string   `json:"containerName,omitempty"`
	Command       []string `json:"command,omitempty"`
	Args          []string `json:"args,omitempty"`
	Timeout       string   `json:"timeout,omitempty"`
}

type imagePullSecrets struct {
	Name       string            `json:"name,omitempty"`
	Data       map[string]string `json:"data,omitempty"`
	SecretType string            `json:"type,omitempty"`
}

type collectorMeta struct {
	CollectorName string `json:"collectorName,omitempty"`
	Exclude       bool   `json:"exclude,omitempty"`
}

type runPod struct {
	collectorMeta    `json:",inline"`
	Name             string      `json:"name,omitempty"`
	Namespace        string      `json:"namespace"`
	PodSpec          *v1.PodSpec `json:"podSpec,omitempty"`
	Timeout          string      `json:"timeout,omitempty"`
	imagePullSecrets `json:",inline"`
}

// Run is used to define config for commands ran on host via troubleshoot.
type Run struct {
	CollectorName    string            `json:"collectorName,omitempty"`
	Command          string            `json:"command"`
	Args             []string          `json:"args"`
	Env              []string          `json:"env,omitempty"`
	IgnoreParentEnvs bool              `json:"ignoreParentEnvs,omitempty"`
	InheritEnvs      []string          `json:"inheritEnvs,omitempty"`
	OutputDir        string            `json:"outputDir,omitempty"`
	Input            map[string]string `json:"input,omitempty"`
	Timeout          string            `json:"timeout,omitempty"`
}

// RunDaemonSet is used to define config for daemonset ran on hosts via troubleshoot.
type RunDaemonSet struct {
	collectorMeta    `json:",inline"`
	Name             string      `json:"name,omitempty"`
	Namespace        string      `json:"namespace,omitempty"`
	PodSpec          *v1.PodSpec `json:"podSpec"`
	Timeout          string      `json:"timeout,omitempty"`
	imagePullSecrets `json:",inline"`
}
