package secret

import (
	"testing"

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

func TestReadSecretsConfig(t *testing.T) {
	composeFiles := []string{"./testdir/compose.yaml"}
	secretsFromConfig, err := ReadSecretsConfig("./testdir/.env.sample", composeFiles, "test_example_com")
	if err != nil {
		t.Fatal(err)
	}

	// Simple secret
	assert.Equal(t, "test_example_com_test_pass_one_v2", secretsFromConfig["test_pass_one"].RemoteName)
	assert.Equal(t, "v2", secretsFromConfig["test_pass_one"].Version)
	assert.Equal(t, 0, secretsFromConfig["test_pass_one"].Length)
	assert.Equal(t, "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789", secretsFromConfig["test_pass_one"].Charset)

	// Has a length modifier
	assert.Equal(t, "test_example_com_test_pass_two_v1", secretsFromConfig["test_pass_two"].RemoteName)
	assert.Equal(t, "v1", secretsFromConfig["test_pass_two"].Version)
	assert.Equal(t, 10, secretsFromConfig["test_pass_two"].Length)
	assert.Equal(t, "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789", secretsFromConfig["test_pass_two"].Charset)

	// Secret name does not include the secret id
	assert.Equal(t, "test_example_com_pass_three_v2", secretsFromConfig["test_pass_three"].RemoteName)
	assert.Equal(t, "v2", secretsFromConfig["test_pass_three"].Version)
	assert.Equal(t, 0, secretsFromConfig["test_pass_three"].Length)
	assert.Equal(t, "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789", secretsFromConfig["test_pass_three"].Charset)

	// Has a length modifier and a charset=default,safespecial modifier
	assert.Equal(t, "test_example_com_test_pass_four_v1", secretsFromConfig["test_pass_four"].RemoteName)
	assert.Equal(t, "v1", secretsFromConfig["test_pass_four"].Version)
	assert.Equal(t, 12, secretsFromConfig["test_pass_four"].Length)
	assert.Equal(t, "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789!@#%^&*_-+=", secretsFromConfig["test_pass_four"].Charset)

	// Has a length modifier and a charset=default,special modifier
	assert.Equal(t, "test_example_com_test_pass_five_v1", secretsFromConfig["test_pass_five"].RemoteName)
	assert.Equal(t, "v1", secretsFromConfig["test_pass_five"].Version)
	assert.Equal(t, 12, secretsFromConfig["test_pass_five"].Length)
	assert.Equal(t, "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789!@#$%^&*_-+=", secretsFromConfig["test_pass_five"].Charset)

	// Has only a charset=default,special modifier, which gets setted but ignored in the generation
	assert.Equal(t, "test_example_com_test_pass_six_v1", secretsFromConfig["test_pass_six"].RemoteName)
	assert.Equal(t, "v1", secretsFromConfig["test_pass_six"].Version)
	assert.Equal(t, 0, secretsFromConfig["test_pass_six"].Length)
	assert.Equal(t, "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789!@#$%^&*_-+=", secretsFromConfig["test_pass_six"].Charset)
}

func TestReadSecretsConfigWithLongDomain(t *testing.T) {
	composeFiles := []string{"./testdir/compose.yaml"}
	_, err := ReadSecretsConfig("./testdir/.env.sample", composeFiles, "should_break_on_forty_eight_char_stack_nameeeeee")
	if err == nil {
		t.Fatal("expected failure, stack name is too long")
	}
	assert.Contains(t, err.Error(), "is > 64 chars")
}
