package persistence

import (
	"context"
	"regexp"
	"testing"

	"github.com/DATA-DOG/go-sqlmock"
	"github.com/nexuscrm/shared/pkg/constants"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestRenameDuplicateProfilesByName_RenamesSFMigratedProfiles(t *testing.T) {
	db, mock, err := sqlmock.New()
	require.NoError(t, err)
	defer db.Close()

	repo := NewSystemRepository(db)
	ctx := context.Background()

	updatePattern := regexp.QuoteMeta(
		"UPDATE Profile SET Name = ?, LastModifiedDate = CURRENT_TIMESTAMP WHERE Name = ? AND Id != ?",
	)

	// Expect: newName="System Administrator (Salesforce)", currentName="System Administrator", bootstrapID="system_admin"
	mock.ExpectExec(updatePattern).
		WithArgs("System Administrator (Salesforce)", "System Administrator", constants.ProfileSystemAdmin).
		WillReturnResult(sqlmock.NewResult(0, 2)) // 2 SF-migrated rows renamed

	count, err := repo.RenameDuplicateProfilesByName(ctx,
		constants.ProfileSystemAdmin,
		"System Administrator",
		"System Administrator (Salesforce)",
	)
	require.NoError(t, err)
	assert.Equal(t, int64(2), count)
	require.NoError(t, mock.ExpectationsWereMet())
}

func TestRenameDuplicateProfilesByName_NoMatchReturnsZero(t *testing.T) {
	db, mock, err := sqlmock.New()
	require.NoError(t, err)
	defer db.Close()

	repo := NewSystemRepository(db)
	ctx := context.Background()

	updatePattern := regexp.QuoteMeta(
		"UPDATE Profile SET Name = ?, LastModifiedDate = CURRENT_TIMESTAMP WHERE Name = ? AND Id != ?",
	)

	// Already renamed — no rows match
	mock.ExpectExec(updatePattern).
		WithArgs("Standard User (Salesforce)", "Standard User", constants.ProfileStandardUser).
		WillReturnResult(sqlmock.NewResult(0, 0))

	count, err := repo.RenameDuplicateProfilesByName(ctx,
		constants.ProfileStandardUser,
		"Standard User",
		"Standard User (Salesforce)",
	)
	require.NoError(t, err)
	assert.Equal(t, int64(0), count)
	require.NoError(t, mock.ExpectationsWereMet())
}

func TestRenameDuplicateProfilesByName_DBErrorReturnsError(t *testing.T) {
	db, mock, err := sqlmock.New()
	require.NoError(t, err)
	defer db.Close()

	repo := NewSystemRepository(db)
	ctx := context.Background()

	updatePattern := regexp.QuoteMeta(
		"UPDATE Profile SET Name = ?, LastModifiedDate = CURRENT_TIMESTAMP WHERE Name = ? AND Id != ?",
	)

	mock.ExpectExec(updatePattern).
		WithArgs("System Administrator (Salesforce)", "System Administrator", constants.ProfileSystemAdmin).
		WillReturnError(assert.AnError)

	count, err := repo.RenameDuplicateProfilesByName(ctx,
		constants.ProfileSystemAdmin,
		"System Administrator",
		"System Administrator (Salesforce)",
	)
	require.Error(t, err)
	assert.Equal(t, int64(0), count)
	assert.Contains(t, err.Error(), "rename duplicate profiles failed")
	require.NoError(t, mock.ExpectationsWereMet())
}
