package argocd

import (
	"os"
	"testing"

	"github.com/stretchr/testify/assert"
	applyv1 "k8s.io/client-go/applyconfigurations/core/v1"
	"k8s.io/client-go/dynamic"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
)

func TestApplySecet(t *testing.T) {
	kubeconfig := `
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJT3lHZy8rOEhmaTB3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TkRBNU1qZ3hNRFU0TXpaYUZ3MHpOREE1TWpZeE1UQXpNelphTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUURlYkhEeXNCUFprNW81ZzVrcTUxTFJBZXdpbDM4WWFmQ1J2cWtZMWJENVpENDN4RG9lQWhjMnVJbW4KSzNmd3hJZ1RGM2NYUkROUlZXOUk3NkpRdk5UYjhLZDdoeXB2UE9wLy9ZcVVCQ3FXTWRTc0lsbFIzOTc1eEM1VApKUDc1LzErVFZUWFJJNzJ3Y3BrY1lJaS9VU2Q3dXF0b1I5UlJIalhDME8vM3BHclkwWnhhVlhsdXh6UlhQcEE3CjYrQktETVlNYmh4Um5rT2dKaGpwRmNua09RaWROQWo3MVVuOExYbFgzdFhjWHFGU0YzbGJHMC9PcCtjOTRaVFoKUEFQamF2NGtic1pNeCtpSHB5R3ROVWlWN0FzVXQxOWF3V1dZU3VNNTJUaEdDaTQzb0dRK25ybGZGcTY5VjB1bAo1ZklPZEZVcWZTL3BobG9GK3o1NnRSR0VRMXg1QWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSeFZnL2N5UlhZY1VTRm16WElGaE5Cbnd6dVVEQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQ2UzWjZPeVJ1bgpraWZ3SmViNlRUQWdhNmRSa1hwTGsvdHcxTFFoVVpUNjFSb0pSZ1ZvQjZ4NW5tUXJjMG1VN1BjNWJIY0R2aFQxCmhPditLT2VEVDh0N00xcWZCZWZ1Tk1hQ2RLa2IwQ0ZyWmk3c0hYNzQ0bHRwTnRRUnNWNWNZWVlFR1lXeHg1c2QKbFdvT3ZEYjFBYS9Bb1V6TTNrT3JmeEhFQVU3V054em5reFRaNDd1R2lWck5EUEtWWG9aUFhJb1NEb3B6WE5Hegpod3p3Mm5Oa2tWZDZQemlWMytJc3pvcWFUMCs4SjZxVWNoRDcyOG1uYkxmemJxNzRBODNSWXd6M3hzalp4Q3ltCmZOeGVZV2F5N3U5YlpQK0xmUkVicEVaaHJROHp2TmZRZk11djM4OUtXQWM0akx0L0NXbTBIY1NQbkFzbFk3WWwKZk5aQWRZUHJqci8yCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
    server: https://60584A0A1045740779FF8651E109A46F.sk1.ap-northeast-1.eks.amazonaws.com
  name: arn:aws:eks:ap-northeast-1:552185537300:cluster/o11y-dev-regional-ap-northeast-1
contexts:
- context:
    cluster: arn:aws:eks:ap-northeast-1:552185537300:cluster/o11y-dev-regional-ap-northeast-1
    user: arn:aws:eks:ap-northeast-1:552185537300:cluster/o11y-dev-regional-ap-northeast-1
  name: o11y-dev-regional-ap-northeast-1
current-context: o11y-dev-regional-ap-northeast-1
kind: Config
preferences: {}
users:
- name: arn:aws:eks:ap-northeast-1:552185537300:cluster/o11y-dev-regional-ap-northeast-1
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      args:
      - --region
      - ap-northeast-1
      - eks
      - get-token
      - --cluster-name
      - o11y-dev-regional-ap-northeast-1
      - --output
      - json
      command: aws
      env:
      - name: AWS_PROFILE
        value: clinic-dev2

`
	name := "auto-deploy-unit-test"
	endpoint := "https://invalid-2.gr7.ap-east-1.eks.amazonaws.com"
	config := `
{
    "execProviderConfig": {
        "apiVersion": "client.authentication.k8s.io/v1beta1",
        "args": [
            "aws",
            "--cluster-name",
            "` + name + `"
        ],
        "command": "argocd-k8s-auth",
        "env": {
            "AWS_ROLE_ARN": "arn:aws:iam::557537366020:role/argocd-oidc-role"
        }
    },
    "tlsClientConfig": {
        "caData": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJVWFCMk1DZVVKNlF3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TkRBNU1qa3hNRFV3TkRCYUZ3MHpOREE1TWpjeE1EVTFOREJhTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUURCblZocS9yTWU3VzQ2ZDB5NElXYk5ocU1NNFNDYURJdGJnQmZraE95UTBLRWlvWFNJZTBrVGpGdzYKRzRnd1VmOFpML3JqWU1FT0pxZEMyUG5GdFcvdC82clRRUUE4cU15UlBjL0pva0hqSUFFckN4bVNTemdqZ3VvVApCSTYyTkx6V25sQmNjZmtnZ21ySkdFa2RJNDNWdlIxY2FtZ0FseXdKVWNCY1VrcGYrWVl0UEZjYzREK3hwcTFJCnlIQmg4RjM0RGJsRXYvbzQyQnZNUWxQaW8wTmJ2UmZ1bG5rN2FMOEgydk9yR2cxRFlpSGswYURaL09jRGVsZngKMGIxalFMUFF0dnRvc3JUMm5Ga2RnLzBjSFZIY3IvWFdRcTJvTStUQVVQbEt6L3Bib1NoeEUvQWRBUHlLQXlaVQo1c3VuaW5zUGdFOVdHTUJqNnRDcGJpL2N5c1gxQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJTWEtINCtiN3NkaUt4WjlucVQ1QkV6N29VSnhqQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQktTazVHMjZrVQpFclpLV25kWVZ5djV2NXpPOGdRczlwRTZhWndORS9tSXRaeWdzMzdPOUl0UytOd2FnMk1INm1XdmNYdGd5YTZpCk5sK084ZGRCMy82blF1cVc3WTk0V2RyalBPd2txSVlxZjdwZlY1N1ljRHhEUTM3OXdqRjA0Ty9aeGdsc1BrcDYKS3JyQUxYb3Zra0IyZlJXQ2hoUGhpc0doZEdGYzEySW54M3NIdWNqVmtiVGlSQW0zdmZEcW01SlNlMjNkQnc0cQpVbkFmUnZYOGtpNEhySHdYMS9heElROTlLNkpuUitHMGtTbHFoaUhSd3dsKzFUbXRLN1JCT3RLZ21hOUFycVVLCjk4WWZBV2UwMTkwOXhnQTNDZDFmRXdFZWNORXRBQzFKdms4dU8xK01DbW5mc1JoNkFQbklMUnJveHlHWXR3SzUKQ21tSFZNZUZkWm9KCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
        "insecure": false
    }
}
`
	sec := applyv1.Secret(name, "default").WithLabels(map[string]string{
		"app.kubernetes.io/instance":     "target-clusters-config",
		"argocd.argoproj.io/secret-type": "cluster",
	}).WithStringData(map[string]string{
		"name":   name,
		"server": endpoint,
		"config": string(config),
	})

	clientConfig, err := clientcmd.RESTConfigFromKubeConfig([]byte(kubeconfig))
	assert.NoError(t, err)
	clientset, err := kubernetes.NewForConfig(clientConfig)
	assert.NoError(t, err)
	client := clientset.CoreV1().Secrets("default")
	err = applySecret(client, sec, true)
	assert.NoError(t, err)
}

func TestListArgocdApplications(t *testing.T) {
	homedir, _ := os.UserHomeDir()
	config, err := clientcmd.BuildConfigFromFlags("", homedir+"/.kube/config")
	assert.NoError(t, err)
	dynamicClient, err := dynamic.NewForConfig(config)
	assert.NoError(t, err)
	apps, err := listArgocdApplications(dynamicClient, "dev-seed-ap-east-1-eric-1101")
	assert.NoError(t, err)
	assert.Less(t, 1, len(apps))
}
