package registry_test

import (
	"context"
	"crypto/x509"
	"testing"

	"github.com/stretchr/testify/assert"

	"github.com/aws/eks-anywhere/pkg/registry"
)

var (
	ctx   = context.Background()
	image = registry.Artifact{
		Registry:   "public.ecr.aws",
		Repository: "eks-anywhere/eks-anywhere-packages",
		Digest:     "sha256:6efe21500abbfbb6b3e37b80dd5dea0b11a0d1b145e84298fee5d7784a77e967",
		Tag:        "0.2.22-eks-a-24",
	}
	credentialStore = registry.NewCredentialStore()
	certificates    = &x509.CertPool{}
	registryContext = registry.NewStorageContext("localhost", credentialStore, certificates, false)
)

func TestOCIRegistryClient_Init(t *testing.T) {
	sut := registry.NewOCIRegistry(registryContext)

	err := sut.Init()
	assert.NoError(t, err)

	// Does not reinitialize
	err = sut.Init()
	assert.NoError(t, err)
}

func TestOCIRegistryClient_Destination(t *testing.T) {
	sut := registry.NewOCIRegistry(registryContext)
	destination := sut.Destination(image)
	assert.Equal(t, "localhost/eks-anywhere/eks-anywhere-packages@sha256:6efe21500abbfbb6b3e37b80dd5dea0b11a0d1b145e84298fee5d7784a77e967", destination)
	sut.SetProject("project/")
	destination = sut.Destination(image)
	assert.Equal(t, "localhost/project/eks-anywhere/eks-anywhere-packages@sha256:6efe21500abbfbb6b3e37b80dd5dea0b11a0d1b145e84298fee5d7784a77e967", destination)
}

func TestOCIRegistryClient_GetStorage(t *testing.T) {
	sut := registry.NewOCIRegistry(registryContext)
	assert.NoError(t, sut.Init())
	_, err := sut.GetStorage(context.Background(), image)
	assert.NoError(t, err)

	bogusImage := registry.Artifact{
		Registry:   "localhost",
		Repository: "!@#$",
		Digest:     "sha256:6efe21500abbfbb6b3e37b80dd5dea0b11a0d1b145e84298fee5d7784a77e967",
	}
	_, err = sut.GetStorage(context.Background(), bogusImage)
	assert.EqualError(t, err, "error creating repository !@#$: invalid reference: invalid repository")
}