package docker

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestIsImageExist(t *testing.T) {
	type args struct {
		image string
	}
	tests := []struct {
		name    string
		args    args
		want    bool
		wantErr bool
	}{
		{
			name: "hub.pingcap.net/qa/go-tpc:v1.0.7",
			args: args{
				image: "hub.pingcap.net/qa/go-tpc:v1.0.7",
			},
			want:    true,
			wantErr: false,
		},
		{
			name: "hub.pingcap.net/qa/go-tpc:v1.0.0",
			args: args{
				image: "hub.pingcap.net/qa/go-tpc:v1.0.0",
			},
			want:    false,
			wantErr: false,
		},
		{
			name: "hub.pingcap.net/notexist/go-tpc:v1.0.0",
			args: args{
				image: "hub.pingcap.net/notexist/go-tpc:v1.0.0",
			},
			want:    false,
			wantErr: true,
		},
		{
			name: "gcr.io/cloud-builders/kubectl",
			args: args{
				image: "gcr.io/cloud-builders/kubectl",
			},
			want:    true,
			wantErr: false,
		},
		{
			name: "gcr.io/cloud-builders/notfound",
			args: args{
				image: "gcr.io/cloud-builders/notfound",
			},
			want:    false,
			wantErr: false,
		},
		{
			name: "registry-mirror.pingcap.net/pingcap/tidb:v5.4.0",
			args: args{
				image: "registry-mirror.pingcap.net/pingcap/tidb:v5.4.0",
			},
			want:    true,
			wantErr: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			checker, err := NewImageCheckerFromImage(tt.args.image)
			assert.NoError(t, err)
			got, err := checker.IsImageExist()
			if (err != nil) != tt.wantErr {
				t.Errorf("IsImageExist() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			if got != tt.want {
				t.Errorf("IsImageExist() got = %v, want %v", got, tt.want)
			}
		})
	}

	checker, err := NewImageCheckerFromImage("docker.io/pingcap/tidb")
	assert.NoError(t, err)
	res, err := checker.IsImageExist()
	if err != TooManyRequests {
		assert.NoError(t, err)
		assert.Equal(t, res, true)
	}

	checker, err = NewImageCheckerFromImage("pingcap/tidb:v5.0.0")
	assert.NoError(t, err)
	res, err = checker.IsImageExist()
	if err != TooManyRequests {
		assert.NoError(t, err)
		assert.Equal(t, true, res)
	}
}

func TestIsPlatformSupport(t *testing.T) {
	type args struct {
		image string
		arch  string
	}
	tests := []struct {
		name    string
		args    args
		want    bool
		wantErr bool
	}{
		{
			name: "hub.pingcap.net/qa/go-tpc:v1.0.7",
			args: args{
				image: "hub.pingcap.net/qa/go-tpc:v1.0.7",
				arch:  "arm64",
			},
			want:    true,
			wantErr: false,
		},
		{
			name: "hub.pingcap.net/qa/go-tpc-arm64:v1.0.7",
			args: args{
				image: "hub.pingcap.net/qa/go-tpc-arm64:v1.0.7",
				arch:  "arm64",
			},
			want:    true,
			wantErr: false,
		},
		{
			name: "hub.pingcap.net/qa/go-tpc-amd64:v1.0.7",
			args: args{
				image: "hub.pingcap.net/qa/go-tpc-amd64:v1.0.7",
				arch:  "arm64",
			},
			want:    false,
			wantErr: false,
		},
		{
			name: "hub.pingcap.net/notexist/go-tpc:v1.0.0",
			args: args{
				image: "hub.pingcap.net/notexist/go-tpc:v1.0.0",
				arch:  "arm64",
			},
			want:    false,
			wantErr: true,
		},
		{
			name: "gcr.io/cloud-builders/kubectl",
			args: args{
				image: "gcr.io/cloud-builders/kubectl",
				arch:  "amd64",
			},
			want:    true,
			wantErr: false,
		},
		{
			name: "registry-mirror.pingcap.net/pingcap/tidb:v5.4.0",
			args: args{
				image: "registry-mirror.pingcap.net/pingcap/tidb:v5.4.0",
				arch:  "arm64",
			},
			want:    false,
			wantErr: false,
		},
		{
			name: "registry-mirror.pingcap.net/pingcap/tidb-arm64:v5.1.3",
			args: args{
				image: "registry-mirror.pingcap.net/pingcap/tidb-arm64:v5.1.3",
				arch:  "arm64",
			},
			want:    true,
			wantErr: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			checker, err := NewImageCheckerFromImage(tt.args.image)
			assert.NoError(t, err)
			got, err := checker.IsPlatformSupport(tt.args.arch)
			if (err != nil) != tt.wantErr {
				t.Errorf("IsPlatformSupport() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			if got != tt.want {
				t.Errorf("IsPlatformSupport() got = %v, want %v", got, tt.want)
			}
		})
	}

	checker, err := NewImageCheckerFromImage("pingcap/tidb:v5.0.0")
	assert.NoError(t, err)
	support, err := checker.IsPlatformSupport("amd64")
	if err != TooManyRequests {
		assert.NoError(t, err)
		assert.Equal(t, true, support)
	}
	support, err = checker.IsPlatformSupport("arm64")
	if err != TooManyRequests {
		assert.NoError(t, err)
		assert.Equal(t, false, support)
	}
}
