//go:build e2e

/*
Copyright (c) Edgeless Systems GmbH

SPDX-License-Identifier: AGPL-3.0-only
*/
package configapi_test

import (
	"context"
	"flag"
	"fmt"
	"os"
	"testing"
	"time"

	"github.com/edgelesssys/constellation/v2/internal/api/configapi"
	"github.com/edgelesssys/constellation/v2/internal/kms/uri"
	"github.com/edgelesssys/constellation/v2/internal/variant"
	"github.com/stretchr/testify/require"
)

var (
	awsRegion      = flag.String("aws-region", "us-east-1", "Region to use for AWS tests. Required for AWS KMS test.")
	awsAccessKeyID = flag.String("aws-access-key-id", "", "ID of the Access key to use for AWS tests. Required for AWS KMS and storage test.")
	awsAccessKey   = flag.String("aws-access-key", "", "Access key to use for AWS tests. Required for AWS KMS and storage test.")
	awsBucket      = flag.String("aws-bucket", "", "Name of the S3 bucket to use for AWS storage test. Required for AWS storage test.")
)

func TestMain(m *testing.M) {
	flag.Parse()
	if *awsAccessKey == "" || *awsAccessKeyID == "" || *awsBucket == "" || *awsRegion == "" {
		flag.Usage()
		fmt.Println("Required flags not set: --aws-access-key, --aws-access-key-id, --aws-bucket, --aws-region. Skipping tests.")
		os.Exit(0)
	}
	os.Exit(m.Run())
}

var cfg = uri.AWSS3Config{
	Bucket:      *awsBucket,
	AccessKeyID: *awsAccessKeyID,
	AccessKey:   *awsAccessKey,
	Region:      *awsRegion,
}

var versionValues = configapi.AzureSEVSNPVersion{
	Bootloader: 2,
	TEE:        0,
	SNP:        6,
	Microcode:  93,
}

func TestUploadAzureSEVSNPVersions(t *testing.T) {
	ctx := context.Background()
	sut, err := configapi.NewAttestationVersionRepo(ctx, cfg)
	require.NoError(t, err)
	d := time.Date(2021, 1, 1, 1, 1, 1, 1, time.UTC)
	require.NoError(t, sut.UploadAzureSEVSNP(ctx, versionValues, d))
}

func TestListVersions(t *testing.T) {
	ctx := context.Background()

	sut, err := configapi.NewAttestationVersionRepo(ctx, cfg)
	require.NoError(t, err)

	err = sut.DeleteList(ctx, variant.AzureSEVSNP{})
	require.NoError(t, err)

	res, err := sut.List(ctx, variant.AzureSEVSNP{})
	require.NoError(t, err)
	require.Equal(t, []string{}, res)

	d := time.Date(2021, 1, 1, 1, 1, 1, 1, time.UTC)
	err = sut.UploadAzureSEVSNP(ctx, versionValues, d)
	require.NoError(t, err)
	res, err = sut.List(ctx, variant.AzureSEVSNP{})
	require.NoError(t, err)
	require.Equal(t, []string{"2021-01-01-01-01.json"}, res)

	err = sut.DeleteList(ctx, variant.AzureSEVSNP{})
	require.NoError(t, err)
}