//go:build e2e

package workspace

import (
	"context"
	"testing"
	"time"

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

func TestWorkspaceMembersSmoke(t *testing.T) {
	sc := testkit.NewSingleUserScenario(t)

	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	page, status, raw, err := sc.User.API.ListWorkspaceMembers(ctx, sc.Workspace.ID)
	if err != nil {
		t.Fatalf("list workspace members: %v", err)
	}
	assertions.RequireStatus(t, status, 200, raw)
	if len(page.Members) == 0 {
		t.Fatalf("expected at least one member in workspace %s", sc.Workspace.ID)
	}
	t.Logf("workspace members smoke passed: workspace=%s members=%d", sc.Workspace.ID, len(page.Members))
}

func TestWorkspaceUsageSmoke(t *testing.T) {
	sc := testkit.NewSingleUserScenario(t)

	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	usage, status, raw, err := sc.User.API.GetWorkspaceUsage(ctx, sc.Workspace.ID)
	if err != nil {
		t.Fatalf("get workspace usage: %v", err)
	}
	assertions.RequireStatus(t, status, 200, raw)
	if len(usage) == 0 {
		t.Fatalf("expected non-empty usage payload for workspace %s", sc.Workspace.ID)
	}
	t.Logf("workspace usage smoke passed: workspace=%s keys=%d", sc.Workspace.ID, len(usage))
}

func TestWorkspaceMemberAndUsageRoutingMatrix(t *testing.T) {
	sc := testkit.NewHostPeerScenario(t)
	ctx, cancel := context.WithTimeout(context.Background(), 90*time.Second)
	defer cancel()

	t.Run("01-host-sees-multiple-members-after-invite", func(t *testing.T) {
		page, status, raw, err := sc.Host.API.ListWorkspaceMembers(ctx, sc.Workspace.ID)
		if err != nil {
			t.Fatalf("host list workspace members: %v", err)
		}
		assertions.RequireStatus(t, status, 200, raw)
		if len(page.Members) < 2 {
			t.Fatalf("expected at least host+peer members, got=%d", len(page.Members))
		}
	})

	t.Run("02-peer-can-read-same-workspace-members", func(t *testing.T) {
		page, status, raw, err := sc.Peer.API.ListWorkspaceMembers(ctx, sc.Workspace.ID)
		if err != nil {
			t.Fatalf("peer list workspace members: %v", err)
		}
		assertions.RequireStatus(t, status, 200, raw)
		if len(page.Members) < 2 {
			t.Fatalf("expected at least host+peer members from peer view, got=%d", len(page.Members))
		}
	})

	t.Run("03-host-and-peer-usage-both-available", func(t *testing.T) {
		hostUsage, status, raw, err := sc.Host.API.GetWorkspaceUsage(ctx, sc.Workspace.ID)
		if err != nil {
			t.Fatalf("host get workspace usage: %v", err)
		}
		assertions.RequireStatus(t, status, 200, raw)
		if len(hostUsage) == 0 {
			t.Fatalf("host usage payload should not be empty")
		}

		peerUsage, status, raw, err := sc.Peer.API.GetWorkspaceUsage(ctx, sc.Workspace.ID)
		if err != nil {
			t.Fatalf("peer get workspace usage: %v", err)
		}
		assertions.RequireStatus(t, status, 200, raw)
		if len(peerUsage) == 0 {
			t.Fatalf("peer usage payload should not be empty")
		}
	})

	t.Run("04-outsider-cannot-read-members-or-usage", func(t *testing.T) {
		outsider := testkit.RequireRegisteredUser(t, sc.Env, "workspace-outsider")
		outsiderAPI := sc.Env.API.WithToken(outsider.AccessToken)

		_, status, raw, err := outsiderAPI.ListWorkspaceMembers(ctx, sc.Workspace.ID)
		if err != nil {
			t.Fatalf("outsider list workspace members request failed: %v", err)
		}
		if status == 200 {
			t.Fatalf("outsider should not read workspace members, raw=%s", string(raw))
		}

		_, status, raw, err = outsiderAPI.GetWorkspaceUsage(ctx, sc.Workspace.ID)
		if err != nil {
			t.Fatalf("outsider get workspace usage request failed: %v", err)
		}
		if status == 200 {
			t.Fatalf("outsider should not read workspace usage, raw=%s", string(raw))
		}
	})
}
