package models

type Deployment struct {
	APIVersion string `yaml:"apiVersion"`
	Kind       string `yaml:"kind"`
	Metadata   struct {
		Labels struct {
			App string `yaml:"app"`
		} `yaml:"labels"`
		Name      string `yaml:"name"`
		Namespace string `yaml:"namespace"`
	} `yaml:"metadata"`
	Spec struct {
		ProgressDeadlineSeconds int `yaml:"progressDeadlineSeconds"`
		Replicas                int `yaml:"replicas"`
		RevisionHistoryLimit    int `yaml:"revisionHistoryLimit"`
		Selector                struct {
			MatchLabels struct {
				App string `yaml:"app"`
			} `yaml:"matchLabels"`
		} `yaml:"selector"`
		Strategy struct {
			RollingUpdate struct {
				MaxSurge       string `yaml:"maxSurge"`
				MaxUnavailable string `yaml:"maxUnavailable"`
			} `yaml:"rollingUpdate"`
			Type string `yaml:"type"`
		} `yaml:"strategy"`
		Template struct {
			Metadata struct {
				CreationTimestamp interface{} `yaml:"creationTimestamp"`
				Labels            struct {
					App string `yaml:"app"`
				} `yaml:"labels"`
			} `yaml:"metadata"`
			Spec struct {
				Containers []struct {
					Command []string `yaml:"command,omitempty"`
					Env     []struct {
						Name      string `yaml:"name"`
						Value     string `yaml:"value"`
						ValueFrom struct {
							SecretKeyRef struct {
								Key  string `yaml:"key"`
								Name string `yaml:"name"`
							} `yaml:"secretKeyRef"`
						} `yaml:"valueFrom,omitempty"`
					} `yaml:"env"`
					Image           string `yaml:"image"`
					ImagePullPolicy string `yaml:"imagePullPolicy"`
					Name            string `yaml:"name"`
					Resources       struct {
						Limits struct {
							CPU    string `yaml:"cpu"`
							Memory string `yaml:"memory"`
						} `yaml:"limits"`
						Requests struct {
							CPU    string `yaml:"cpu"`
							Memory string `yaml:"memory"`
						} `yaml:"requests"`
					} `yaml:"resources"`
					TerminationMessagePath   string `yaml:"terminationMessagePath"`
					TerminationMessagePolicy string `yaml:"terminationMessagePolicy"`
					VolumeMounts             []struct {
						MountPath string `yaml:"mountPath"`
						Name      string `yaml:"name"`
					} `yaml:"volumeMounts"`
				} `yaml:"containers"`
				DNSPolicy       string `yaml:"dnsPolicy"`
				RestartPolicy   string `yaml:"restartPolicy"`
				SchedulerName   string `yaml:"schedulerName"`
				SecurityContext struct {
					FSGroup int `yaml:"fsGroup"`
				} `yaml:"securityContext"`
				ServiceAccount                string `yaml:"serviceAccount"`
				ServiceAccountName            string `yaml:"serviceAccountName"`
				TerminationGracePeriodSeconds int    `yaml:"terminationGracePeriodSeconds"`
				Volumes                       []struct {
					Name   string `yaml:"name"`
					Secret struct {
						DefaultMode int    `yaml:"defaultMode"`
						SecretName  string `yaml:"secretName"`
					} `yaml:"secret,omitempty"`
					ConfigMap struct {
						DefaultMode int    `yaml:"defaultMode"`
						Name        string `yaml:"name"`
					} `yaml:"configMap,omitempty"`
				} `yaml:"volumes"`
			} `yaml:"spec"`
		} `yaml:"template"`
	} `yaml:"spec"`
}

type ConfigMap struct {
	APIVersion string `yaml:"apiVersion"`
	Kind       string `yaml:"kind"`
	Metadata   struct {
		Name      string `yaml:"name"`
		Namespace string `yaml:"namespace"`
	} `yaml:"metadata"`
	Data struct {
		ConfigYAML string `yaml:"config.yaml"`
	} `yaml:"data"`
}

type ConfigYAML struct {
	Network struct {
		K8sVersion  string `yaml:"k8sVersion"`
		CertManager struct {
			ChartPath       string   `yaml:"chartPath"`
			CRDPaths        []string `yaml:"crdPaths"`
			ControllerImage struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"controllerImage"`
			WebhookImage struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"webhookImage"`
			CainjectorImage struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"cainjectorImage"`
		} `yaml:"certmanager"`
		AwsLoadBalancerController struct {
			ChartPath       string   `yaml:"chartPath"`
			CRDPaths        []string `yaml:"crdPaths"`
			ControllerImage struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"controllerImage"`
		} `yaml:"awsLoadBalancerController"`
		ClusterAutoscaler struct {
			ChartPath string `yaml:"chartPath"`
			Image     struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"image"`
		} `yaml:"clusterAutoscaler"`
		IgnoreDelete            []string `yaml:"ignoreDelete"`
		NetworkPolicyController struct {
			Image struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"image"`
		} `yaml:"networkPolicyController"`
		Calico struct {
			ChartPath string `yaml:"chartPath"`
			Registry  string `yaml:"registry"`
		} `yaml:"calico"`
		CSI struct {
			Attacher struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"attacher"`
			ChartPath string      `yaml:"chartPath"`
			CRDPaths  interface{} `yaml:"crdPaths"` // It's null in the given YAML, so we use the "interface{}" type
			Driver    struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"driver"`
			LivenessProbe struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"livenessProbe"`
			NodeDriverRegistrar struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"nodeDriverRegistrar"`
			Provisioner struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"provisioner"`
			Resizer struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"resizer"`
		} `yaml:"csi"`
		Operator struct {
			AdvancedStatefulset struct {
				Name string `yaml:"name"`
			} `yaml:"advancedStatefulset"`
			ChartPath string   `yaml:"chartPath"`
			CRDPaths  []string `yaml:"crdPaths"`
			Operator  struct {
				Name string `yaml:"name"`
				Tag  string `yaml:"tag"`
			} `yaml:"operator"`
			TidbBackupManager struct {
				Name string `yaml:"name"`
				Tag  string `yaml:"tag"`
			} `yaml:"tidbBackupManager"`
			DbMonitorProm struct {
				Name string `yaml:"name"`
				Tag  string `yaml:"tag"`
			} `yaml:"dbMonitorProm"`
			DbMonitorGrafana struct {
				Name string `yaml:"name"`
				Tag  string `yaml:"tag"`
			} `yaml:"dbMonitorGrafana"`
		} `yaml:"operator"`
		Proxy struct {
			ChartPath  string `yaml:"chartPath"`
			ProxyImage struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"proxyImage"`
			GottyImage struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"gottyImage"`
			AllowedCidrs  []string `yaml:"allowedCidrs"`
			Auth0Audience string   `yaml:"auth0Audience"`
			Auth0Domain   string   `yaml:"auth0Domain"`
		} `yaml:"proxy"`
		DataflowAgent struct {
			ChartPath          string `yaml:"chartPath"`
			DataflowAgentImage struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"dataflowAgentImage"`
			AllowedCidrs []string `yaml:"allowedCidrs"`
		} `yaml:"dataflowAgent"`
		TiflowOperator struct {
			ChartPath           string   `yaml:"chartPath"`
			CRDPaths            []string `yaml:"crdPaths"`
			TiflowOperatorImage struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"tiflowOperatorImage"`
			Enable bool `yaml:"enable"`
		} `yaml:"tiflowOperator"`
		PcaIssuer struct {
			ChartPath string   `yaml:"chartPath"`
			CRDPaths  []string `yaml:"crdPaths"`
			Image     struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"image"`
		} `yaml:"pcaIssuer"`
		SliReporter struct {
			ChartPath string `yaml:"chartPath"`
			Image     struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"image"`
			AwsRegion             string `yaml:"awsRegion"`
			DeliveryStreamName    string `yaml:"deliveryStreamName"`
			DeliveryStreamRoleArn string `yaml:"deliveryStreamRoleArn"`
		} `yaml:"sliReporter"`
		Region                     string   `yaml:"region"`
		ApiserverPublicAccessCidrs []string `yaml:"apiserverPublicAccessCidrs"`
		O11yConfig                 struct {
			Env                 string   `yaml:"env"`
			SeedVectorURL       string   `yaml:"seedVectorURL"`
			SeedVectorEpSvcName string   `yaml:"seedVectorEpSvcName"`
			InfraTenantID       string   `yaml:"infraTenantID"`
			OpenAPIAddress      string   `yaml:"openAPIAddress"`
			CreateO11yInfraPath string   `yaml:"createO11yInfraPath"`
			DeleteO11yInfraPath string   `yaml:"deleteO11yInfraPath"`
			GetO11yInfraPath    string   `yaml:"getO11yInfraPath"`
			PauseO11yInfraPath  string   `yaml:"pauseO11yInfraPath"`
			ResumeO11yInfraPath string   `yaml:"resumeO11yInfraPath"`
			Auth0GetTokenURL    string   `yaml:"auth0GetTokenURL"`
			Auth0Audience       string   `yaml:"auth0Audience"`
			EffectiveRegion     []string `yaml:"effectiveRegion"`
			LokiServerDns       string   `yaml:"lokiServerDns"`
			Version             int      `yaml:"version"`
			EventExporter       struct {
				Image struct {
					Repo string `yaml:"repo"`
					Tag  string `yaml:"tag"`
				} `yaml:"image"`
				ChartPath string `yaml:"chartPath"`
			} `yaml:"eventExporter"`
			MetricsAgent struct {
				Image struct {
					Repo string `yaml:"repo"`
					Tag  string `yaml:"tag"`
				} `yaml:"image"`
				ChartPath string `yaml:"chartPath"`
			} `yaml:"metricsAgent"`
			ClusterAgent struct {
				Image struct {
					Repo string `yaml:"repo"`
					Tag  string `yaml:"tag"`
				} `yaml:"image"`
			} `yaml:"clusterAgent"`
			LogAgent struct {
				Image struct {
					Repo string `yaml:"repo"`
					Tag  string `yaml:"tag"`
				} `yaml:"image"`
				ChartPath string `yaml:"chartPath"`
			} `yaml:"logAgent"`
			Loki struct {
				Image struct {
					Repo string `yaml:"repo"`
					Tag  string `yaml:"tag"`
				} `yaml:"image"`
				ChartPath string `yaml:"chartPath"`
			} `yaml:"loki"`
			So11y struct {
				Image struct {
					Repo string `yaml:"repo"`
					Tag  string `yaml:"tag"`
				} `yaml:"image"`
				ChartPath string `yaml:"chartPath"`
			} `yaml:"so11y"`
		} `yaml:"o11yConfig"`
		KubeStateMetrics struct {
			ChartPath string `yaml:"chartPath"`
			Image     struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"image"`
		} `yaml:"kubeStateMetrics"`
		NodeExporter struct {
			ChartPath string `yaml:"chartPath"`
			Image     struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"image"`
		} `yaml:"nodeExporter"`
	} `yaml:"network"`
	Override struct {
		OverrideHelperImage          string `yaml:"overrideHelperImage"`
		OverrideRegistry             string `yaml:"overrideRegistry"`
		OverrideRepoPrefix           string `yaml:"overrideRepoPrefix"`
		OverrideThirdPartyRepoPrefix string `yaml:"overrideThirdPartyRepoPrefix"`
	} `yaml:"override"`
	Audit struct {
		SidecarImage   string   `yaml:"sidecarImage"`
		SidecarCommand []string `yaml:"sidecarCommand"`
	} `yaml:"audit"`
	MixedDeployPDWithTiKV struct {
		Enabled                   bool     `yaml:"enabled"`
		AffectClusterCreatedAfter string   `yaml:"affectClusterCreatedAfter"`
		AffectNamespaceAllowList  []string `yaml:"affectNamespaceAllowList"`
	} `yaml:"mixedDeployPDWithTiKV"`
	TiflowCluster struct {
		Master struct {
			DefaultSpecCode  string `yaml:"defaultSpecCode"`
			ExpirationMinute int    `yaml:"expirationMinute"`
			ShareDb          struct {
				PrivateLinkServiceName string `yaml:"privateLinkServiceName"`
				ServiceName            string `yaml:"serviceName"`
				Port                   int    `yaml:"port"`
				User                   string `yaml:"user"`
				Password               string `yaml:"password"`
			} `yaml:"shareDb"`
			ImageConfig struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"imageConfig"`
		} `yaml:"master"`
		Executor struct {
			ImageConfig struct {
				Repo string `yaml:"repo"`
				Tag  string `yaml:"tag"`
			} `yaml:"imageConfig"`
		} `yaml:"executor"`
	} `yaml:"tiflowCluster"`
	FeatureGates          map[string]FeatureGate `yaml:"featureGates"`
	ExpFeatureGates       []ExpFeatureGates      `yaml:"expFeatureGates"`
	ConfigServiceEndpoint string                 `yaml:"configServiceEndpoint"`
	Predicate             struct {
		MatchLabels      map[string]string `yaml:"matchLabels"`
		MatchExpressions []struct {
			Key      string   `yaml:"key"`
			Operator string   `yaml:"operator"`
			Values   []string `yaml:"values"`
		} `yaml:"matchExpressions"`
	} `yaml:"predicate"`
	FullManage struct {
		PublicHostedZoneID     string `yaml:"publicHostedZoneID"`
		ServiceRoleARN         string `yaml:"serviceRoleARN"`
		ServiceRoleName        string `yaml:"serviceRoleName"`
		AssumeRoleARN          string `yaml:"assumeRoleARN"`
		ComponentPCAARN        string `yaml:"componentPCAARN"`
		AssumeRoleExternalID   string `yaml:"assumeRoleExternalID"`
		Project                string `yaml:"project"`
		PublicHostedZoneDomain string `yaml:"publicHostedZoneDomain"`
	} `yaml:"fullManage"`

	MaxConcurrentReconciles struct {
		NetworkPeer          int `yaml:"networkPeer"`
		ClusterNodeProtector int `yaml:"clusterNodeProtector"`
		EksConnection        int `yaml:"eksConnection"`
		FrpServer            int `yaml:"frpServer"`
		PrivateLink          int `yaml:"privateLink"`
		PrivateLinkEndpoint  int `yaml:"privateLinkEndpoint"`
		Network              int `yaml:"network"`
		Cluster              int `yaml:"cluster"`
	} `yaml:"maxConcurrentReconciles"`

	Hibernation struct {
		IdleTimeThreshold string `yaml:"idleTimeThreshold"`
		Enabled           bool   `yaml:"enabled"`
	} `yaml:"hibernation"`
}

type ExpFeatureGates struct {
	Name              string      `yaml:"name"`
	MinSupportVersion string      `yaml:"minSupportVersion"`
	Command           string      `yaml:"command"`
	FeatureGate       FeatureGate `yaml:"featureGate"`
}

type ExpFeatureGatesReq struct {
	Name              string `json:"name"`
	MinSupportVersion string `json:"minSupportVersion"`
	Command           string `json:"command"`
	Open              bool   `json:"open"`
}

type FeatureGate struct {
	All              bool     `yaml:"all"`
	EnabledProjects  []string `yaml:"enabledProjects"`
	EnabledTenants   []string `yaml:"enabledTenants"`
	DisabledProjects []string `yaml:"disabledProjects"`
	DisabledTenants  []string `yaml:"disabledTenants"`
}
