package exec

import (
	"context"
	"strings"
)

type workspaceListRequest struct {
	Kind   string `json:"kind,omitempty" jsonschema:"enum=summary,enum=channels,enum=agents,enum=humans"`
	Query  string `json:"query,omitempty"`
	Limit  int    `json:"limit,omitempty" jsonschema:"minimum=1,maximum=100"`
	Cursor string `json:"cursor,omitempty"`
}

type workspaceChannel struct {
	Name        string `json:"name"`
	DisplayName string `json:"displayName,omitempty"`
	Description string `json:"description,omitempty"`
	Joined      bool   `json:"joined"`
}

type workspaceActor struct {
	Name           string `json:"name"`
	DisplayName    string `json:"displayName,omitempty"`
	Status         string `json:"status,omitempty"`
	Activity       string `json:"activity,omitempty"`
	ActivityDetail string `json:"activityDetail,omitempty"`
	MachineName    string `json:"machineName,omitempty"`
	MachineHost    string `json:"machineHost,omitempty"`
	MachineID      string `json:"machineId,omitempty"`
	OwnerName      string `json:"ownerName,omitempty"`
}

type workspaceSnapshotCollectionLimit struct {
	Limit     int  `json:"limit"`
	Truncated bool `json:"truncated"`
}

type workspaceSnapshotLimits struct {
	Channels workspaceSnapshotCollectionLimit `json:"channels"`
	Agents   workspaceSnapshotCollectionLimit `json:"agents"`
	Humans   workspaceSnapshotCollectionLimit `json:"humans"`
}

type workspaceListResponse struct {
	Channels   []workspaceChannel       `json:"channels"`
	Agents     []workspaceActor         `json:"agents"`
	Humans     []workspaceActor         `json:"humans"`
	Limits     *workspaceSnapshotLimits `json:"limits,omitempty"`
	Kind       string                   `json:"kind,omitempty"`
	Limit      int                      `json:"limit,omitempty"`
	HasMore    bool                     `json:"hasMore,omitempty"`
	NextCursor string                   `json:"nextCursor,omitempty"`
}

var workspaceListSpec = actionSpec[workspaceListRequest, workspaceListResponse]{
	Meta: actionMeta{
		Domain:      "workspace",
		Name:        "list",
		Summary:     "browse workspace summary, channels, agents, humans",
		Description: "Browse a bounded page of workspace summary: channels, agents, and humans.",
		Permission:  permissionReadOnly,
	},
	Examples: []actionExample[workspaceListRequest]{
		{Title: "workspace summary", Input: workspaceListRequest{Kind: "summary"}},
	},
}

type workspaceHandler struct{ read remoteReadTransport }

func (w workspaceHandler) list(ctx context.Context, request actionScopedJSON[workspaceListRequest]) (actionResult[workspaceListResponse], error) {
	kind := strings.TrimSpace(request.Body.Kind)
	if kind == "" {
		kind = "summary"
	}
	limit := request.Body.Limit
	if limit <= 0 {
		limit = 20
	}
	if limit > 100 {
		limit = 100
	}
	result, err := (workspaceRemote{client: request.Authorized.Server, read: w.read}).list(
		ctx,
		kind,
		strings.TrimSpace(request.Body.Query),
		limit,
		strings.TrimSpace(request.Body.Cursor),
	)
	if err != nil {
		return actionResult[workspaceListResponse]{}, classifyAPIError(err, "list workspace failed")
	}
	if result.Channels == nil {
		result.Channels = []workspaceChannel{}
	}
	if result.Agents == nil {
		result.Agents = []workspaceActor{}
	}
	if result.Humans == nil {
		result.Humans = []workspaceActor{}
	}
	return actionResult[workspaceListResponse]{Text: "Listed workspace.", Data: result}, nil
}
