package cdccluster

import (
	"testing"

	"github.com/stretchr/testify/require"
	corev1 "k8s.io/api/core/v1"
	"sigs.k8s.io/yaml"
)

func TestSetTomlConfig_SetConfigField_v2(t *testing.T) {
	// Test SetTomlConfig
	provider := NewV2ClusterProvider("")
	provider.Init("ns1", "cdc1")
	cfgInit := `
addr = "0.0.0.0:8300"
log-level = "info"
[sorter]
sort-dir = "/tmp/just_a_test"
cache-size-in-mb = 8
`
	cfgAfterSet := `addr = "127.0.0.1:8300"
advertise-addr = "cdc1.ns1:8300"
log-level = "info"

[log]
  [log.file]
    max-size = 100

[sorter]
  cache-size-in-mb = 8
  sort-dir = "/tmp/just_a_test2"
`
	err := provider.SetTomlConfig(cfgInit)
	require.NoError(t, err)

	require.NoError(t, provider.SetConfigField("addr", "127.0.0.1:8300"))
	require.NoError(t, provider.SetConfigField("advertise-addr", "cdc1.ns1:8300"))
	require.NoError(t, provider.SetConfigField("sorter.sort-dir", "/tmp/just_a_test2"))
	require.NoError(t, provider.SetConfigField("log.file.max-size", 100))

	require.Equal(t, cfgAfterSet, string(provider.(*v2Cluster).desired.Spec.Template.Spec.Config))
}

func TestSetDesired_v2(t *testing.T) {
	provider := NewV2ClusterProvider("tidbclouddev.azurecr.io/tidbcloud/tidb-operator-v2-prestop-checker:prestop-checker-250226")
	provider.Init("ns1", "cdc1")
	provider.SetReplicas(3)
	provider.SetVersion("ecr-registery.pingcap/ticdc", "v8.1.0")
	provider.SetUpstreamCluster("ns1", "db")
	require.NoError(t, provider.SetTomlConfig(`
log-level = "info"

[log]
  [log.file]
    max-size = 100
`))
	require.NoError(t, provider.SetConfigField("cluster-id", "my-cluster-id"))
	provider.SetNodeSelector(map[string]string{"kubernetes.io/arch": "amd64"})
	provider.SetStorage("gp3-cdc", "100Gi")
	provider.SetTolerations([]corev1.Toleration{
		{
			Key:      "dedicated",
			Operator: corev1.TolerationOpEqual,
			Value:    "tidb-ticdc",
			Effect:   corev1.TaintEffectNoSchedule,
		},
	})

	yamlData, err := yaml.Marshal(provider.(*v2Cluster).desired)
	require.NoError(t, err)
	// NOTE: the following YAML may need to be updated after the CRD is updated or even the K8s deps is updated
	require.Equal(t, `metadata:
  creationTimestamp: null
  name: cdc1
  namespace: ns1
spec:
  cluster:
    name: db
  replicas: 3
  template:
    metadata: {}
    spec:
      config: |
        cluster-id = "my-cluster-id"
        log-level = "info"

        [log]
          [log.file]
            max-size = 100
      image: ecr-registery.pingcap/ticdc
      overlay:
        pod:
          metadata:
            labels:
              app.kubernetes.io/component: ticdc
              app.kubernetes.io/instance: cdc1
              app.kubernetes.io/managed-by: tidb-operator
              app.kubernetes.io/name: ticdc-cluster
          spec:
            affinity:
              podAntiAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                - labelSelector:
                    matchLabels:
                      app.kubernetes.io/component: ticdc
                  topologyKey: kubernetes.io/hostname
            containers:
            - name: ticdc
              resources: {}
              volumeMounts:
              - mountPath: /var/lib/ticdc
                name: sort-kv
            dnsPolicy: ClusterFirstWithHostNet
            hostNetwork: true
            nodeSelector:
              kubernetes.io/arch: amd64
            securityContext: {}
            tolerations:
            - effect: NoSchedule
              key: dedicated
              operator: Equal
              value: tidb-ticdc
            volumes:
            - ephemeral:
                volumeClaimTemplate:
                  metadata:
                    creationTimestamp: null
                  spec:
                    accessModes:
                    - ReadWriteOnce
                    resources:
                      requests:
                        storage: 100Gi
                    storageClassName: gp3-cdc
              name: sort-kv
      preStop:
        image: tidbclouddev.azurecr.io/tidbcloud/tidb-operator-v2-prestop-checker:prestop-checker-250226
      resources: {}
      server:
        ports: {}
      updateStrategy: {}
      version: v8.1.0
status:
  currentReplicas: 0
  readyReplicas: 0
  replicas: 0
  updatedReplicas: 0
`, string(yamlData))
}
