package bootstrapimpl

import (
	"regexp"
	"testing"

	"github.com/DATA-DOG/go-sqlmock"
	"github.com/nexuscrm/shared/pkg/constants"
)

func expectSuperUserCapabilityQuery(mock sqlmock.Sqlmock, count int) {
	mock.ExpectQuery(`(?s)SELECT COUNT\(DISTINCT u\.`+"`"+constants.ColID+"`"+`\).*NOT EXISTS.*`+regexp.QuoteMeta(constants.TableMutingPermissionSetPermission)).
		WithArgs(true, string(constants.SuperUserCapability), string(constants.SuperUserCapability), string(constants.SuperUserCapability)).
		WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(count))
}

func TestAssertActiveSuperUserCapabilityHolderRequiresUnmutedCapability(t *testing.T) {
	db, mock, err := sqlmock.New()
	if err != nil {
		t.Fatalf("sqlmock.New: %v", err)
	}
	defer db.Close()

	expectSuperUserCapabilityQuery(mock, 0)

	result := &AssertionResult{}
	assertActiveSuperUserCapabilityHolderExists(db, result)

	if len(result.Violations) != 1 {
		t.Fatalf("violations = %d, want 1: %+v", len(result.Violations), result.Violations)
	}
	if got := result.Violations[0].Severity; got != constants.SeverityError {
		t.Fatalf("severity = %q, want %q", got, constants.SeverityError)
	}
	if err := mock.ExpectationsWereMet(); err != nil {
		t.Fatalf("sqlmock expectations: %v", err)
	}
}

func TestAssertActiveSuperUserCapabilityHolderPassesWithUnmutedCapability(t *testing.T) {
	db, mock, err := sqlmock.New()
	if err != nil {
		t.Fatalf("sqlmock.New: %v", err)
	}
	defer db.Close()

	expectSuperUserCapabilityQuery(mock, 1)

	result := &AssertionResult{}
	assertActiveSuperUserCapabilityHolderExists(db, result)

	if len(result.Violations) != 0 {
		t.Fatalf("violations = %d, want 0: %+v", len(result.Violations), result.Violations)
	}
	if err := mock.ExpectationsWereMet(); err != nil {
		t.Fatalf("sqlmock expectations: %v", err)
	}
}
