package dedicatedtopremiumprecheck

import (
	"testing"

	"github.com/stretchr/testify/require"

	tidbmgmtservicev1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/entity"
)

func TestBuildReportUsesUnifiedStatuses(t *testing.T) {
	items := []*entity.DedicatedToPremiumPrecheckItem{
		{
			Category:       entity.PrecheckCategoryFeatureGap,
			CheckKey:       "risk",
			Status:         entity.PrecheckItemStatusRiskFound,
			ExecutionState: entity.PrecheckItemExecutionStateCompleted,
		},
		{
			Category:       entity.PrecheckCategoryFeatureGap,
			CheckKey:       "safe",
			Status:         entity.PrecheckItemStatusNoRiskFound,
			ExecutionState: entity.PrecheckItemExecutionStateCompleted,
		},
		{
			Category:       entity.PrecheckCategoryFeatureGap,
			CheckKey:       "input",
			Status:         entity.PrecheckItemStatusNeedsInput,
			ExecutionState: entity.PrecheckItemExecutionStateCompleted,
		},
	}
	report := buildReport(items, entity.PrecheckCategoryFeatureGap, 3)
	require.True(t, report.GetComplete())
	require.Equal(t, int32(1), report.GetSummary().GetRiskFoundCount())
	require.Equal(t, int32(1), report.GetSummary().GetNoRiskFoundCount())
	require.Equal(t, int32(1), report.GetSummary().GetNeedsInputCount())
	require.Equal(t, tidbmgmtservicev1.PrecheckItemStatus_RISK_FOUND, report.GetItems()[0].GetStatus())
	require.Equal(t, tidbmgmtservicev1.PrecheckItemStatus_NO_RISK_FOUND, report.GetItems()[1].GetStatus())
	require.Equal(t, tidbmgmtservicev1.PrecheckItemStatus_NEEDS_INPUT, report.GetItems()[2].GetStatus())
}

func TestBuildReportIncompleteOnTechnicalFailure(t *testing.T) {
	report := buildReport([]*entity.DedicatedToPremiumPrecheckItem{{
		Category: entity.PrecheckCategoryMigrationReadiness, CheckKey: "failed",
		ExecutionState: entity.PrecheckItemExecutionStateFailed, ExecutionError: "dependency failure",
	}}, entity.PrecheckCategoryMigrationReadiness, 18)
	require.False(t, report.GetComplete())
	require.Equal(t, "dependency failure", report.GetExecutionError())
}

func TestToProtoIncludesApplicant(t *testing.T) {
	response := toProto(&entity.DedicatedToPremiumPrecheck{
		Applicant: "applicant@pingcap.com",
	})

	require.Equal(t, "applicant@pingcap.com", response.GetApplicant())
}
