package approvalapp

import (
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/store/approval"
)

func TestTeamRoleRejectionInput(t *testing.T) {
	tests := []struct {
		name       string
		input      map[string]any
		wantReason string
		wantLocale string
		wantError  string
	}{
		{name: "historical input defaults to English", input: map[string]any{"reason": " revise roles "}, wantReason: "revise roles", wantLocale: "en"},
		{name: "empty input defaults to English", input: map[string]any{}, wantLocale: "en"},
		{name: "simplified Chinese", input: map[string]any{"reason": "调整职责", "locale": "zh-CN"}, wantReason: "调整职责", wantLocale: "zh-CN"},
		{name: "Japanese", input: map[string]any{"reason": "職責を調整", "locale": "ja"}, wantReason: "職責を調整", wantLocale: "ja"},
		{name: "unknown field", input: map[string]any{"reason": "revise", "extra": true}, wantError: "input is invalid"},
		{name: "unsupported locale", input: map[string]any{"locale": "fr"}, wantError: "locale is not supported"},
		{name: "non-text locale", input: map[string]any{"locale": 1}, wantError: "locale must be text"},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			reason, locale, err := teamRoleRejectionInput(test.input)
			if test.wantError != "" {
				require.ErrorContains(t, err, test.wantError)
				return
			}
			require.NoError(t, err)
			require.Equal(t, test.wantReason, reason)
			require.Equal(t, test.wantLocale, locale)
		})
	}
}

func TestTeamRoleRejectionFeedbackContentUsesRequestedLocale(t *testing.T) {
	tests := []struct {
		locale string
		want   string
	}{
		{
			locale: "en",
			want:   "[@Leader](/mentions/team/team_123) The previous Team responsibility proposal was returned.\nFeedback:\n> revise the plan\n\nPlease revise the complete responsibility proposal and submit a new approval card.",
		},
		{
			locale: "zh-CN",
			want:   "[@Leader](/mentions/team/team_123) 上一版 Team 职责方案已退回。\n反馈：\n> revise the plan\n\n请根据反馈调整完整职责方案，并重新提交一张职责审批卡。",
		},
		{
			locale: "ja",
			want:   "[@Leader](/mentions/team/team_123) 前回の Team 職責案は差し戻されました。\nフィードバック：\n> revise the plan\n\nフィードバックに基づいて完全な職責案を修正し、新しい承認カードとして再提出してください。",
		},
	}

	for _, test := range tests {
		t.Run(test.locale, func(t *testing.T) {
			require.Equal(t, test.want, teamRoleRejectionFeedbackContent(
				"[@Leader](/mentions/team/team_123)", "revise the plan", test.locale,
			))
		})
	}
}

func TestTeamRoleRejectionFeedbackClientMessageIDIsStablePerApprovalVersion(t *testing.T) {
	instance := approval.Instance{ID: "appr_01K1ABCDEFGHJKMNPQRSTVWXYZ", Version: 1000000}
	base := teamRoleRejectionFeedbackClientMessageID(instance)
	require.LessOrEqual(t, len(base), 128)
	require.Equal(t, base, teamRoleRejectionFeedbackClientMessageID(instance))
	require.NotEqual(t, base, teamRoleRejectionFeedbackClientMessageID(approval.Instance{
		ID: instance.ID, Version: instance.Version + 1,
	}))
	require.NotEqual(t, base, teamRoleRejectionFeedbackClientMessageID(approval.Instance{
		ID: "appr_01K1DIFFERENTHJKMNPQRSTVWXYZ", Version: instance.Version,
	}))
}
