package service

import (
	"context"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	apiv1 "github.com/tidbcloud/cluster-service-ng/api/tidbcloud/cluster-agent/v1"

	"github.com/tidbcloud/cluster-service-ng/internal/cluster-agent/crypto"
)

func TestAgentService_GetPublicKey(t *testing.T) {
	// Create an encryptor
	encryptor, err := crypto.NewEncryptor()
	require.NoError(t, err)

	tests := []struct {
		name      string
		service   *AgentService
		req       *apiv1.GetPublicKeyReq
		wantErr   bool
		checkResp func(t *testing.T, resp *apiv1.GetPublicKeyResp)
	}{
		{
			name: "successfully get public key",
			service: &AgentService{
				encryptor: encryptor,
			},
			req:     &apiv1.GetPublicKeyReq{},
			wantErr: false,
			checkResp: func(t *testing.T, resp *apiv1.GetPublicKeyResp) {
				t.Helper()
				assert.NotEmpty(t, resp.Pem)
				pemStr := string(resp.Pem)
				assert.Contains(t, pemStr, "BEGIN")
				assert.Contains(t, pemStr, "PUBLIC KEY")
				assert.Contains(t, pemStr, "END")
			},
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			ctx := context.Background()
			resp, err := tt.service.GetPublicKey(ctx, tt.req)

			if tt.wantErr {
				assert.Error(t, err)
				return
			}

			require.NoError(t, err)
			assert.NotNil(t, resp)

			if tt.checkResp != nil {
				tt.checkResp(t, resp)
			}
		})
	}
}
