package identity

import (
	"context"
	"testing"
	"time"

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

func TestUpdateUserDisplayNameSyncsMemberPinyin(t *testing.T) {
	t.Parallel()

	ctx := context.Background()
	db := startIdentityTestPool(t, ctx)
	store := New(db, Options{})

	now := time.Now().UTC()
	userID := "usr_profile_pinyin"
	workspaceID := "wsp_profile_pinyin"
	memberID := "mem_profile_pinyin"

	mustExec(t, db, `
INSERT INTO users (id, email, name, display_name, password_hash, created_at, updated_at)
VALUES ($1, 'profile-pinyin@example.com', 'zhangsan', '张三', 'hash', $2, $2)
`, userID, now)
	mustExec(t, db, `
INSERT INTO organizations (id, slug, name, created_by_user_id, created_at, updated_at)
VALUES ($1, 'org-profile-pinyin', 'Org', $2, $3, $3)
`, "org_profile_pinyin", userID, now)
	mustExec(t, db, `
INSERT INTO workspaces (id, organization_id, slug, name, latest_message_seq, created_at, updated_at)
VALUES ($1, $2, 'wsp-profile-pinyin', 'Workspace', 0, $3, $3)
`, workspaceID, "org_profile_pinyin", now)
	mustExec(t, db, `
INSERT INTO members (id, workspace_id, type, display_name, display_name_pinyin, display_name_pinyin_initials, user_id, workspace_role, status, created_at, updated_at)
VALUES ($1, $2, 'human', '张三', 'zhangsan', 'zs', $3, 'member', 'active', $4, $4)
`, memberID, workspaceID, userID, now)

	updated, err := store.UpdateUserDisplayName(ctx, userID, "李四")
	require.NoError(t, err)
	require.Equal(t, "李四", updated.DisplayName)

	var pinyinFull, pinyinInitials string
	require.NoError(t, db.QueryRow(ctx, `
SELECT display_name_pinyin, display_name_pinyin_initials
FROM members
WHERE id = $1
`, memberID).Scan(&pinyinFull, &pinyinInitials))
	require.Equal(t, "lisi", pinyinFull, "member pinyin must be synced when profile display name changes")
	require.Equal(t, "ls", pinyinInitials, "member pinyin initials must be synced when profile display name changes")
}

func TestUpdateUserDisplayNameSkipsMemberPinyinWhenCleared(t *testing.T) {
	t.Parallel()

	ctx := context.Background()
	db := startIdentityTestPool(t, ctx)
	store := New(db, Options{})

	now := time.Now().UTC()
	userID := "usr_profile_pinyin_clear"
	workspaceID := "wsp_profile_pinyin_clear"
	memberID := "mem_profile_pinyin_clear"

	mustExec(t, db, `
INSERT INTO users (id, email, name, display_name, password_hash, created_at, updated_at)
VALUES ($1, 'profile-pinyin-clear@example.com', 'zhangsan', '张三', 'hash', $2, $2)
`, userID, now)
	mustExec(t, db, `
INSERT INTO organizations (id, slug, name, created_by_user_id, created_at, updated_at)
VALUES ($1, 'org-profile-pinyin-clear', 'Org', $2, $3, $3)
`, "org_profile_pinyin_clear", userID, now)
	mustExec(t, db, `
INSERT INTO workspaces (id, organization_id, slug, name, latest_message_seq, created_at, updated_at)
VALUES ($1, $2, 'wsp-profile-pinyin-clear', 'Workspace', 0, $3, $3)
`, workspaceID, "org_profile_pinyin_clear", now)
	mustExec(t, db, `
INSERT INTO members (id, workspace_id, type, display_name, display_name_pinyin, display_name_pinyin_initials, user_id, workspace_role, status, created_at, updated_at)
VALUES ($1, $2, 'human', '张三', 'zhangsan', 'zs', $3, 'member', 'active', $4, $4)
`, memberID, workspaceID, userID, now)

	_, err := store.UpdateUserDisplayName(ctx, userID, "  ")
	require.NoError(t, err)

	var pinyinFull, pinyinInitials string
	require.NoError(t, db.QueryRow(ctx, `
SELECT display_name_pinyin, display_name_pinyin_initials
FROM members
WHERE id = $1
`, memberID).Scan(&pinyinFull, &pinyinInitials))
	require.Equal(t, "zhangsan", pinyinFull, "member pinyin must be left intact when profile display name is cleared")
	require.Equal(t, "zs", pinyinInitials, "member pinyin initials must be left intact when profile display name is cleared")
}
