package unread

import (
	"context"
	"testing"

	"github.com/DATA-DOG/go-sqlmock"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
)

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

	mock.ExpectQuery(`(?s)SELECT user_id\s+FROM members\s+WHERE workspace_id = \?`).
		WithArgs("w1", "m1").
		WillReturnRows(sqlmock.NewRows([]string{"user_id"}).AddRow("u1"))

	store := New(coredb.WrapSQLDB(sqlDB))
	userID, err := store.LoadActiveHumanUserIDForMember(context.Background(), "w1", "m1")
	if err != nil {
		t.Fatalf("LoadActiveHumanUserIDForMember returned error: %v", err)
	}
	if userID != "u1" {
		t.Fatalf("userID = %q, want u1", userID)
	}
	if err := mock.ExpectationsWereMet(); err != nil {
		t.Fatalf("sql expectations were not met: %v", err)
	}
}

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

	mock.ExpectQuery(`(?s)SELECT\s+sm\.member_id,\s+m\.user_id,`).
		WithArgs("w1", "w1", "s1", "", 100).
		WillReturnRows(sqlmock.NewRows([]string{
			"member_id",
			"user_id",
			"last_read_seq",
			"last_activity_global_seq",
			"effective_from_seq",
			"state",
			"visibility",
		}).AddRow("m1", nil, int64(3), int64(4), int64(1), "active", "public"))

	store := New(coredb.WrapSQLDB(sqlDB))
	rows, err := store.LoadScopeRosterPage(context.Background(), RosterPageRequest{
		WorkspaceID: "w1",
		ScopeID:     "s1",
		Limit:       100,
	})
	if err != nil {
		t.Fatalf("LoadScopeRosterPage returned error: %v", err)
	}
	if len(rows) != 1 {
		t.Fatalf("len(rows) = %d, want 1", len(rows))
	}
	if rows[0].MemberID != "m1" || rows[0].UserID != "" {
		t.Fatalf("row = %+v, want member m1 with empty user id", rows[0])
	}
	if err := mock.ExpectationsWereMet(); err != nil {
		t.Fatalf("sql expectations were not met: %v", err)
	}
}
