//go:build e2e

package testkit

import (
	"fmt"
	"testing"
	"time"

	"github.com/tidbcloud/AgentTeam/e2e/assertions"
	"github.com/tidbcloud/AgentTeam/e2e/client"
)

// RequireAllChannel returns the default #all channel for the workspace.
func RequireAllChannel(t *testing.T, api *client.Client) client.Channel {
	t.Helper()

	ctx, cancel := APIContext(t)
	defer cancel()

	channels, status, raw, err := api.ListChannels(ctx)
	if err != nil {
		t.Fatalf("list channels: %v", err)
	}
	assertions.RequireStatus(t, status, DefaultHTTPStatusOK, raw)

	allSlug := AllChannelSlug()
	for _, channel := range channels {
		if channel.Name == allSlug {
			return channel
		}
	}
	t.Fatalf("expected default #%s channel in workspace", allSlug)
	return client.Channel{}
}

// RequireChannelByName finds a joined channel by slug/name.
func RequireChannelByName(t *testing.T, api *client.Client, name string) client.Channel {
	t.Helper()

	ctx, cancel := APIContext(t)
	defer cancel()

	channels, status, raw, err := api.ListChannels(ctx)
	if err != nil {
		t.Fatalf("list channels: %v", err)
	}
	assertions.RequireStatus(t, status, DefaultHTTPStatusOK, raw)

	for _, channel := range channels {
		if channel.Name == name {
			return channel
		}
	}
	t.Fatalf("channel %q not found", name)
	return client.Channel{}
}

// AssertMessageInChannel verifies a message appears in a channel history page.
func AssertMessageInChannel(t *testing.T, api *client.Client, channelID, content string) {
	t.Helper()

	ctx, cancel := APIContext(t)
	defer cancel()

	page, status, raw, err := api.ListChannelMessages(ctx, channelID, MessageHistoryLimit())
	if err != nil {
		t.Fatalf("list channel messages: %v", err)
	}
	assertions.RequireStatus(t, status, DefaultHTTPStatusOK, raw)

	for _, message := range page.Messages {
		if message.Content == content {
			return
		}
	}
	t.Fatalf("message %q not found in channel %s (messages=%d)", content, channelID, len(page.Messages))
}

// WorkspaceAPI returns a workspace-scoped API client.
func WorkspaceAPI(session Session, workspace client.Workspace) *client.Client {
	return session.API.WithWorkspace(workspace.ID)
}

// LogWorkspaceSession logs common ids for scenario debugging.
func LogWorkspaceSession(t *testing.T, label string, userID string, workspace client.Workspace) {
	t.Helper()
	t.Logf("%s: userId=%s workspaceId=%s", label, userID, workspace.ID)
}

// UniqueMessageText returns a unique message body for scenarios.
func UniqueMessageText(prefix string) string {
	return CaseName(prefix)
}

// UniqueChannelName returns a slug-safe unique channel name.
func UniqueChannelName(prefix string) string {
	return fmt.Sprintf("%s-%d", prefix, time.Now().UnixNano())
}
